解法
常规解法:排序、堆就不说了
记录一下分治
每个子问题是,把子数组[i:j]
里最小的前k个挑出来放到前k个位置上
首先我们随机选一个点,用快排的方法,把小于它的都放到它左边,大于它的都放到它右边
假设最后这个点的位置是t
那么如果[i:t]
已经有k个数了,那么问题转化成取[i:t]
的前k个
如果[i:t]
还不够k个,那么数组[i:t]
里的是必须取的,剩下的另一半数组里需要取剩下的前k-(t-i+1)
个
class Solution(object):
def kClosest(self, points, K):
"""
:type points: List[List[int]]
:type K: int
:rtype: List[List[int]]
"""
dist = lambda i:points[i][0]**2+points[i][1]**2
def sort(oi,oj,k):
if oi>=oj:return
i = oi
j = oj
ran = dist(random.randint(i,j))
while i<j:
while i<j and dist(i)<ran: i+=1
while i<j and dist(j)>ran: j-=1
points[i],points[j] = points[j],points[i]
if k<=i-oi+1:
return sort(oi,i,k)
else:
return sort(i+1,oj,k-(i-oi+1))
sort(0,len(points)-1, K)
return points[:K]