973. K Closest Points to Origin
阿新 • • 發佈:2019-01-13
解法
常規解法:排序、堆就不說了
記錄一下分治
每個子問題是,把子陣列[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]