1. 使用指针
用两个指针从后向前遍历两个数组,按序移动,并用count计数,当count=k时,返回指针中指向最大的那个。
def top_k2(arr1, arr2, k):
if not arr1 or len(arr1) == 0:
if arr2 and len(arr2) >= k:
return arr2[len(arr2) - k]
return -9999
if not arr2 or len(arr2) == 0:
if arr1 and len(arr1) >= k:
return arr1[len(arr1) - k]
return -9999
i, j = len(arr1) - 1, len(arr2) - 1
while i >= 0 and j >= 0:
if k == 1:
return max(arr1[i], arr2[j])
if arr1[i] > arr2[j]:
i -= 1
else:
j -= 1
k -= 1
while i >= 0:
if k == 1:
return arr1[i]
i -= 1
k -= 1
while j >= 0:
if k == 1:
return arr2[j]
j -= 1
k -= 1
return -9999
2. 利用归并排序思想
时间复杂度 o(m+n)
def top_k(arr1, arr2, k):
if not arr1 or len(arr1) == 0:
# arr2不为空且长度>=k
if arr2 and len(arr2) >= k:
return arr2[len(arr2)-k]
return -9999
if not arr2 or len(arr2) == 0:
if arr1 and len(arr1) >= k:
return arr1[len(arr1)-k]
return -9999
result = []
while arr1 and arr2:
result.append(arr1.pop() if arr1[-1] > arr2[-1] else arr2.pop())
result.extend(arr1[::-1] if arr1 else arr2[::-1])
return result[k-1]
3. 类似二分查找
时间复杂度 o(log min{m,n})
4. 测试
a = [1, 3, 5, 7]
b = [7]
k = 5
print(top_k(a, b, k))
# 1
print(top_k2(a, b, k))
# 1