采用优先队列(即大顶堆)的方法:代码:
class Solution973_medium {
public:
vector<vector<int>> kClosest(vector<vector<int>>& points, int K) {
int index = 0;
vector<vector<int>> output;
priority_queue<Item, vector<Item>, cmp> pq;
for (const auto& point : points) {
int distance = point[0] * point[0] + point[1] * point[1];
if (index < K) {
pq.push(Item(distance, index));
}
else {
if (pq.top().distance > distance) {
pq.pop();
pq.push(Item(distance, index));
}
}
index++;
}
while (pq.size()) {
output.push_back(points[pq.top().index]);
pq.pop();
}
return output;
}
struct Item {
Item(int d, int i) : distance(d), index(i) {
}
// 距离原点的距离
int distance;
// 坐标
int index;
};
struct cmp {
bool operator()(const Item& x, const Item& y) {
// 大顶堆
return x.distance < y.distance;
}
};
};