zoukankan      html  css  js  c++  java
  • 973. K Closest Points to Origin

    /**
    973. K Closest Points to Origin
    https://leetcode.com/problems/k-closest-points-to-origin/
    Given an array of points where points[i] = [xi, yi] represents a point on the X-Y plane and an integer k, return the k closest points to the origin (0, 0).
    The distance between two points on the X-Y plane is the Euclidean distance (i.e., √(x1 - x2)2 + (y1 - y2)2).
    You may return the answer in any order. The answer is guaranteed to be unique (except for the order that it is in).
    
    Example 1:
    Input: points = [[1,3],[-2,2]], k = 1
    Output: [[-2,2]]
    Explanation:
    The distance between (1, 3) and the origin is sqrt(10).
    The distance between (-2, 2) and the origin is sqrt(8).
    Since sqrt(8) < sqrt(10), (-2, 2) is closer to the origin.
    We only want the closest k = 1 points from the origin, so the answer is just [[-2,2]].
    
    Example 2:
    Input: points = [[3,3],[5,-1],[-2,4]], k = 2
    Output: [[3,3],[-2,4]]
    Explanation: The answer [[-2,4],[3,3]] would also be accepted.
    
    Constraints:
    1. 1 <= k <= points.length <= 104
    2. -104 < xi, yi < 104
    */
    use std::collections::BinaryHeap;
    
    pub struct Solution {}
    
    impl Solution {
        /*
        Solution: Priority Queue, Time:O(nlog(k)), Space:O(k)
        */
        pub fn k_closest(points: Vec<Vec<i32>>, k: i32) -> Vec<Vec<i32>> {
            //default is max heap
            let mut heap: BinaryHeap<(i32, Vec<i32>)> = BinaryHeap::new();
            for point in points {
                let dist = Self::distance(&point);
                heap.push((dist, point));//O(1)
                if heap.len() > k as usize {
                    heap.pop();//remove the top which is the maximum, O(log(n))
                }
            }
            let mut result:Vec<Vec<i32>> = Vec::new();
            while let Some((dist,array)) = heap.pop() {
                result.push(array)
            }
            result
        }
    
        fn distance(array: &Vec<i32>) -> i32 {
            array[0] * array[0] + array[1] * array[1]
        }
    }
  • 相关阅读:
    hdu-1162 Eddy's picture---浮点数的MST
    hdu-3371 Connect the Cities---kruskal
    hdu-1879 继续畅通工程---确定部分边的MST
    hdu-1875 畅通工程再续---MST
    hdu1863 畅通工程---MST&连通
    hdu-1233 还是畅通工程---MST模板
    hdu-1232 畅通工程---并查集
    BZOJ3940: [Usaco2015 Feb]Censoring
    BZOJ2434: [Noi2011]阿狸的打字机
    BZOJ2938: [Poi2000]病毒
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/15743369.html
Copyright © 2011-2022 走看看