活跃农民
- 积分
- 336
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2021-8-19
- 最后登录
- 1970-1-1
|
我感觉time complexisty 是 Nlog(logM), 因为我们还是要遍历数组n,只是每次的M长度减半。
(不过gpt 说是 O(logM⋅logN),考虑到这不是第一次它胡说八道了,也就不继续调查了。FYI)
另外可能有bug,懒得调了。- def getSameElement(m, n):
- ans = []
- def helper(lst1, start1, end1, lst2, start2, end2):
- if start1 > end1: return
- # binary search
- m1 = start1 + (end1 - start1) // 2
- m2 = binarySearch(lst2, start2, end2, lst1[m1])
- if lst1[m1] == lst2[m2]:
- ans.append(lst1[m1])
- helper(lst1, start1, m1-1, lst2, start2, m2-1)
- helper(lst1, m1+1, end1, lst2, m2+1, end2)
- else:
- helper(lst1, start1, m1-1, lst2, start2, m2) # not m2-1
- helper(lst1, m1+1, end1, lst2, m2+1, end2)
- def binarySearch(lst, start, end, target):
- l, r = start, end
- while l <= r:
- m = l + (r-l) // 2
- if lst[m] < target: l = m + 1
- elif lst[m] > target: r = m - 1
- else: return m
- return r
- # left half, left half, right half, right half
- helper(m, 0, len(m)-1, n, 0, len(n)-1)
- return ans
- print(getSameElement([1,2,3,4,5],[1,3,5,8]))
复制代码 |
|