1. 程式人生 > >973. K Closest Points to Origin

973. K Closest Points to Origin

解法

常規解法:排序、堆就不說了
記錄一下分治

每個子問題是,把子陣列[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]