我们有一个由平面上的点组成的列表 points
。需要从中找出 K
个距离原点 (0, 0)
最近的点。
(这里,平面上两点之间的距离是欧几里德距离。)
你可以按任何顺序返回答案。除了点坐标的顺序之外,答案确保是唯一的。
示例 1:
| 输入:points = [[1,3],[-2,2]], K = 1 输出:[[-2,2]] 解释: (1, 3) 和原点之间的距离为 sqrt(10), (-2, 2) 和原点之间的距离为 sqrt(8), 由于 sqrt(8) < sqrt(10),(-2, 2) 离原点更近。 我们只需要距离原点最近的 K = 1 个点,所以答案就是 [[-2,2]]。
|
示例 2:
1 2 3
| 输入:points = [[3,3],[5,-1],[-2,4]], K = 2 输出:[[3,3],[-2,4]] (答案 [[-2,4],[3,3]] 也会被接受。)
|
提示:
1 <= K <= points.length <= 10000
-10000 < points[i][0] < 10000
-10000 < points[i][1] < 10000
思路
维护一个大小为K的大顶堆
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| class Solution { struct cmp{ bool operator()(vector<int>& x1, vector<int>& x2) { return func(x1) < func(x2); } int func(vector<int>& x) { return x[0]*x[0] + x[1]*x[1]; } }; int func(const vector<int>& x) { return x[0]*x[0] + x[1]*x[1]; }; public: vector<vector<int>> kClosest(vector<vector<int>>& points, int K) { priority_queue<vector<int>,vector<vector<int>>, cmp> q; for(const auto& point:points) { if(q.size() < K) { q.push(point); } else { if(func(q.top()) > func(point)) { q.pop(); q.push(point); } } } vector<vector<int>> res; while(!q.empty()) { res.push_back(q.top()); q.pop(); } return res; } };
|
lambda表达式
priority_queue
的三个模板参数,使用lambda
时,要使用decltype
解析类型,并在构造函数中传递。
1 2 3 4 5
| template< class T, class Container = std::vector<T>, class Compare = std::less<typename Container::value_type> > class priority_queue;
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class Solution { public: vector<vector<int>> kClosest(vector<vector<int>>& points, int K) { auto func= [](const vector<int>& x) { return x[0]*x[0] + x[1]*x[1]; }; auto cmp =[&func](vector<int>& x1, vector<int>& x2) { return func(x1) < func(x2); }; priority_queue<vector<int>,vector<vector<int>>, decltype(cmp)> q(cmp); for(const auto& point:points) { if(q.size() < K) { q.push(point); } else { if(func(q.top()) > func(point)) { q.pop(); q.push(point); } } } vector<vector<int>> res; while(!q.empty()) { res.push_back(q.top()); q.pop(); } return res; } };
|