双指针:
def func(num1,num2,k):
i,j,n = 0,0,0
while i<len(num1) or j<len(num2):
n += 1
if i<len(num1) and j<len(num2):
if num1[i] < num2[j]:
if n == k:
return num1[i]
i += 1
else:
if n == k:
return num2[j]
j += 1
elif i<len(num1):
if n == k:
return num1[i]
i += 1
else:
if n == k:
return num2[j]
j += 1
print(func([1,5,8],[2,3,4],6))
方法二:
要找第两个数组的第k大,可以找num1[k/2], 和num2[k/2],如果这俩相等,那他俩就是第k大。
比如在下面的俩数组中找第4大的,我们发现num1的第2个和num2的第2个相等,那就返回 [3] 就好了。
num1 = [1,3,5]
num2 = [2,3,4]
如果num1的第2个 > num2的第2个,那就不要num2的前俩了,因为肯定不是第4大。然后把num2剩余的元素,也就是[4]放入下一次递归,此时k = 4 - 2 = 2,因为已经排除俩了。
num1 = [1,3,5]
num2 = [1,2,4]
反之亦然,这里值得注意的是,如果k是奇数,由于python取整的原因,k/2需要改成:num1[k//2], 和num2[k-k//2]
再由于python 从0开始计数,再改成 num1[k//2-1], 和num2[k-k//2-1]
整体代码如下:
def func2(num1,num2,k):
if k == 1:
return min(num1[0], num2[0])
if not num1:
return num2[k-1]
if not num2:
return num1[k-1]
k1 = k // 2
k2 = k - k1
if num1[k1-1] > num2[k2-1]:
return func2(num1, num2[k2:], k-k2)
else:
return func2(num1[k1:], num2, k-k1)
print(func2([1,5,8],[2,3,4],6))
猜你喜欢:
⭐【Leetcode】大神总结的所有TopK问题模板(基于快速排序)
⭐【Leetcode】二分法左侧边界右侧边界模板
⭐【Leetcode】338. 比特位计数(动态规划)