Medium
思路
- 优先队列, 因为强调最近
- 优先队列(pq) 的模式:
- 1.确定是否需要重写排序方法,由大到小还是由小到大
- 2.放东西进去, 把点放进去
- 对于pq来说, 当求k个最大值或者最小值的时候,都需要一个ksize的判定(蓄水池)
- 当求K个最大值时,堆顶放最小值, 每次poll最小值
- 反之堆顶放最大值, 每次poll最大值
- 堆顶放最大值时要重写排序
- 最后把pq转到数组可以用 while(!pq.isEmpty())
- 这类pq的时间复杂度为nlogk, n个点, 每次进堆进行logk时间的排序
代码
class Solution {
public int[][] kClosest(int[][] points, int k) {
int[][] res = new int[k][2];
PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> b[0] * b[0] + b[1] * b[1] - a[0] * a[0] - a[1] * a[1]);
for(int i = 0; i < points.length; i++){
pq.add(points[i]);
if(pq.size() > k)
pq.poll();
}
while(!pq.isEmpty()){
res[k - 1] = pq.poll();
k--;
}
return res;
}
}