这题的目的是求出前k个最小和的list,这题的解法是先凑出来一个k大小的堆,然后排序,然后将后面的依次填入到堆中,排序,将最大的踢出堆,这样堆中始终保持k个元素,一直比较到最后,就是最小的k个元素的集合。时间耗时(n-k+1)logk,也就是nlogk。
class Solution(object):
def Order(self, list1, last, k = 0):
list2 = list1[::]
if last[0] + last[1] <= list2[0][0] + list2[0][1]:
return k
if last[0] + last[1] >= list2[-1][0] + list2[-1][1]:
return len(list2) + k
else:
if last[0] + last[1] == list2[len(list2)/2][0] + list2[len(list2)/2][1]:
return k + len(list2)/2 + 1
elif last[0] + last[1] > list2[len(list2)/2][0] + list2[len(list2)/2][1]:
return self.Order(list2[len(list2)/2 + 1:], last, len(list2)/2 + k + 1)
else:
return self.Order(list2[:len(list2)/2], last, k)
def kSmallestPairs(self, nums1, nums2, k):
"""
:type nums1: List[int]
:type nums2: List[int]
:type k: int
:rtype: List[List[int]]
"""
if nums1 == [] or nums2 == []:
return []
list1 = []
first = True
for i in nums1:
for j in nums2:
if len(list1) < k - 1:
list1.append([i, j])
elif len(list1) == k:
if i + j <= list1[0][0] + list1[0][1]:
list1.insert(0, [i, j])
list1.pop()
elif i + j >= list1[-1][0] + list1[-1][1]:
pass
else:
last = [i, j]
location = self.Order(list1, last)
list1.insert(location, last)
list1.pop()
else:
if len(list1) == k - 1 and first:
list1.append([i, j])
list1.sort(key = lambda x: x[0] + x[1])
first = False
else:
list1.sort(key = lambda x: x[0] + x[1])
return list1