K Closest Points to Origin using Custom Sorting Algorithm in C++

  • 时间:2020-09-09 13:08:38
  • 分类:网络文摘
  • 阅读:76 次

We have a list of points on the plane. Find the K closest points to the origin (0, 0). (Here, the distance between two points on a plane is the Euclidean distance.) 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]] (The answer [[-2,4],[3,3]] would also be accepted.)

In K Closest Points to Origin Algorithm by using Priority Queues in C++/Java, we have solved the problem by using a priority queue in C++/Java. This post will focus on solving the same problem using the custom sorting algorithm.

C++ Program to Compute K Closest Points to Origin using Custom Sorting Algorithm

C++’s sort method allows a third parameter as the custom comparator.

1
2
3
4
5
6
7
8
9
10
11
class Solution {
public:
    vector<vector<int>> kClosest(vector<vector<int>>& points, int K) {
        sort(begin(points), end(points), [](auto &a, auto &b) {
            auto d1 = a[0] * a[0] + a[1] * a[1];
            auto d2 = b[0] * b[0] + b[1] * b[1];
            return d1 < d2;
        });
        return vector(begin(points), begin(points) + K);
    }
};
class Solution {
public:
    vector<vector<int>> kClosest(vector<vector<int>>& points, int K) {
        sort(begin(points), end(points), [](auto &a, auto &b) {
            auto d1 = a[0] * a[0] + a[1] * a[1];
            auto d2 = b[0] * b[0] + b[1] * b[1];
            return d1 < d2;
        });
        return vector(begin(points), begin(points) + K);
    }
};

Then we can use the vector constructor (giving it two iterators start and finish) to return a copy of the vector.

Java Program to Compute K Closest Points to Origin using Custom Sorting Algorithm

In Java, we can use Arrays.sort method to sort the int[][] object. We can then use Arrays.copyOfRange to return a copy of the sub array (substring on Array).

1
2
3
4
5
6
7
8
9
10
class Solution {
    public int[][] kClosest(int[][] points, int K) {
        Arrays.sort(points, (a, b) -> {
            int x = a[0] * a[0] + a[1] * a[1];        
            int y = b[0] * b[0] + b[1] * b[1];
            return x - y;
        });
        return Arrays.copyOfRange(points, 0, K);
    }
}
class Solution {
    public int[][] kClosest(int[][] points, int K) {
        Arrays.sort(points, (a, b) -> {
            int x = a[0] * a[0] + a[1] * a[1];        
            int y = b[0] * b[0] + b[1] * b[1];
            return x - y;
        });
        return Arrays.copyOfRange(points, 0, K);
    }
}

Both implementations have O(N.LogN) time complexity which is what a sorting algorithm would cost nowadays.

–EOF (The Ultimate Computing & Technology Blog) —

推荐阅读:
数列求和之四——错位相减求和  笛卡尔与直角坐标系  两道有关和尚的问题  一道关于步行与跑步的问题  少年华罗庚  15届华罗庚金杯少年数学邀请赛初赛试题及解答  15届华杯赛初赛试题解析(二)  15届华杯赛小学初赛试题解析(三)  数学家苏步青的自述  关于负数的知识 
评论列表
添加评论