![[亚麻高频题] Leetcode 973. K Closest Points to Origin(离原点K个最近的点),第1张 [亚麻高频题] Leetcode 973. K Closest Points to Origin(离原点K个最近的点),第1张](/aiimages/%5B%E4%BA%9A%E9%BA%BB%E9%AB%98%E9%A2%91%E9%A2%98%5D+Leetcode+973.+K+Closest+Points+to+Origin%28%E7%A6%BB%E5%8E%9F%E7%82%B9K%E4%B8%AA%E6%9C%80%E8%BF%91%E7%9A%84%E7%82%B9%29.png)
Leetcode 973. K Closest Points to Origin
题目思路 1. 改写Comparator进行排序这道题目思路比较直观,就是直接对每个点距离进行排序,取TopK个元素,这道题考察Java如何改写比较器。
class Solution {
public int[][] kClosest(int[][] points, int k) {
// comparator 改写
Arrays.sort(points, (int[] x, int[] y) -> {
long dis1 = x[0]*x[0]+x[1]*x[1];
long dis2 = y[0]*y[0]+y[1]*y[1];
if(dis1>dis2) return 1;
else if(dis1
时间复杂度:;空间复杂度:。
2. 快速选择
通过改写比较器进行排序,同样可以建立Heap插入选择TopK。对于选择TopK什么的还可以使用快速选择。快速选择的基本思路和模板可以参考[模板总结] - 快速选择 (霍尔Quick Selection)_ok1382038的博客-CSDN博客
代码如下:
class Solution {
Random rand = new Random();
public int[][] kClosest(int[][] points, int k) {
// 找到topk大的值
quickSelect(points, 0, points.length-1, k);
return Arrays.copyOfRange(points, 0, k);
}
private void quickSelect(int[][] points, int start, int end, int k) {
if(start>end) return;
int l = start, r = end;
int mid = start + rand.nextInt(end - start + 1);;
int pivot = points[mid][0]*points[mid][0] + points[mid][1]*points[mid][1];
while(l<=r) {
while(l<=r && points[l][0]*points[l][0] + points[l][1]*points[l][1]pivot) r--;
if(l<=r) {
int[] temp = points[l];
points[l] = points[r];
points[r] = temp;
l++; r--;
}
if(k<=r) quickSelect(points, start, r, k);
else quickSelect(points, l, end, k);
}
}
}
时间复杂度:,最坏情况:;空间复杂度:, 递归的空间深度。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)