2018-10-20 K Closest Points [M]

  1. K Closest Points
    Given some points and an origin point in two-dimensional space, find k points which are nearest to the origin.
    Return these points sorted by distance, if they are same in distance, sorted by the x-axis, and if they are same in the x-axis, sorted by y-axis.

Example
Given points = [[4,6],[4,7],[4,4],[2,5],[1,1]], origin = [0, 0], k = 3
return [[1,1],[2,5],[4,4]]

"""
Definition for a point.
class Point:
    def __init__(self, a=0, b=0):
        self.x = a
        self.y = b
"""

import heapq

class Solution:
    """
    @param points: a list of points
    @param origin: a point
    @param k: An integer
    @return: the k closest points
    """
    def kClosest(self, points, origin, k):
        heap = []
        for p in points:
            dist = self.get_dist(p, origin)
            # put a tuple into heap queue
            heapq.heappush(heap, (-dist, -p.x, -p.y))
            if len(heap) > k:
                heapq.heappop(heap)
        
        heap.sort(reverse=True)
        return [Point(-x,-y) for (_, x, y) in heap]
        
    def get_dist(self, p, o):
        return (p.x - o.x)**2 + (p.y - o.y)**2

Notes:

  1. Python (min) heap queue (priority queue)
    Use heap queue to further optimize time complexity from O(nlogn) for sort to O(nlogk)
import heapq // cannot be placed in class
heap = []
heapq.heappush(heap, item)

Use negative sign to make reverse sorting (from min priority to max heap)

It even just needs one line, but time complexity is O(nlogn).

import nsmallest
return heapq.nsmallest(k, points, key=lambda p: [(p.x-o.x)**2 + (p.y-o.y)**2, p.x])
  1. Define sort/heapify function
  • item for heap queue:
  • key for sort list

The operator module functions allow multiple levels of sorting. This takes advantage of python. Even though it is not "expected" by interviewers (they expect a comparator), it at least helps solve problems!

>>> student_objects = [
        Student('john', 'A', 15),
        Student('jane', 'B', 12),
        Student('dave', 'B', 10),
]

>>> sorted(student_tuples, key=itemgetter(1,2))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]

>>> sorted(student_objects, key=attrgetter('grade', 'age'))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
  1. Do not use x^2 to represent. Use x**2 instead. Because ^ means bitwise XOR.
    "Each bit position in the result is the logical XOR of the bits in the corresponding position of the operands. (1 if the bits in the operands are different, 0 if they are the same.)"

  2. Construct a comparator:
    If Point 2 cannot be used here, I will use a new Type to represent tuple (-dist, -p.x, -p.y)

class Type:
    def __init__(self, dist, point):
        self.dist = dist
        self.point = point

    def cmp(self, other):
        if other.dist != self.dist:
            return other.dist - self.dist
        if other.point.x != self.point.x:
            return other.point.x - self.point.x
        return other.point.y - self.point.y

    def __lt__(self, other):
        return self.cmp(other) < 0
    def __gt__(self, other):
        return self.cmp(other) > 0
    def __eq__(self, other):
        return self.cmp(other) == 0

The take away is to how write cmp() in this problem. To compare point and other, __lt__(self, other) means point < other.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi閱讀 7,862評論 0 10
  • 有緣自然來相會!我就這樣來了。幾天前我很不靠譜的放最愛我的人鴿子。來到了師傅這兒,遇見了他的表妹。說是表妹,其實是...
    渡把閱讀 173評論 0 0
  • 今天第一天寫四百字,還真是不習慣。由于課業(yè)繁忙以及職業(yè)因素,每天的四百字都像寫日記一樣。今天來說說自己效率低下的毛...
    最喜不過淡雅閱讀 135評論 0 0
  • 今天的工作太忙了 還是昨天用的九九的群一共被動進入10個群,完成任務(wù)。 導(dǎo)致沒有與其他同學聊如何爆粉和轉(zhuǎn)化的事情。...
    倩語千尋閱讀 146評論 0 0
  • 回家的時候本來是帶了支筆的,不曾想沒墨了,所以一直借故偷懶不寫字,即使過年的小長假,我看見了太多,也想了太多....
    萬俟堇閱讀 328評論 0 1

友情鏈接更多精彩內(nèi)容