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]

猜你喜欢

转载自blog.csdn.net/lemonmillie/article/details/86413893