Leetcode——最接近原点的 K 个点(快排)
Posted Yawn,
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode——最接近原点的 K 个点(快排)相关的知识,希望对你有一定的参考价值。
1. 最接近原点的 K 个点
(1)API
class Solution {
public int[][] kClosest(int[][] points, int K) {
//将原数组 以距离原点大小 从小到大 排序
Arrays.sort(points,
Comparator.comparingInt((int[] point) -> (point[0] * point[0] + point[1] * point[1])));
//将 排序后的数组 前K个 取出并返回
return Arrays.copyOfRange(points, 0, K);
}
}
(2)手写快排(改善)
对 points进行快排,如果快排确定位置的curPosition为k,那么左边必定的比K更小,也就是距离原点K个最近的点
class Solution {
public int[][] kClosest(int[][] points, int K) {
if (points == null || K <= 0 || points.length < K) {
return new int[0][0];
}
int len = points.length;
int left = 0;
int right = len - 1;
int curPosition = -1;
//对 points进行快排,如果快排确定位置的curPosition为k,那么左边必定的比K更小,也就是距离原点K个最近的点
//因为points从0开始,所以这里是K - 1
while (curPosition != K - 1) {
curPosition = partition(points, left, right);
if (curPosition < K - 1) {
left = curPosition + 1;
}
if (curPosition > K - 1) {
right = curPosition - 1;
}
}
//将 排序后的数组 前K个 取出并返回
//return Arrays.copyOf(points, K);
return Arrays.copyOfRange(points, 0, K);
}
//指定区间一轮快排, 返回快排一轮后,当前元素所在位置
private int partition(int[][] points, int left, int right) {
// 哨兵划分操作, left为哨兵
int i = left, j = right;
int leftValue = points[left][0] * points[left][0] + points[left][1] * points[left][1];
while (i < j) {
//从右往左找小
while (i < j && (points[j][0] * points[j][0] + points[j][1] * points[j][1] >= leftValue)) {
j--;
}
//从左往右找大
while (i < j && (points[i][0] * points[i][0] + points[i][1] * points[i][1] <= leftValue)) {
i++;
}
swap(points, i, j);
}
//交换哨兵节点
swap(points, left, i);
//返回确定元素位置
return i;
}
private void swap(int[][] points, int i, int j) {
int[] temp = points[i];
points[i] = points[j];
points[j] = temp;
}
}
以上是关于Leetcode——最接近原点的 K 个点(快排)的主要内容,如果未能解决你的问题,请参考以下文章
[JavaScript 刷题] 排序 - 最接近原点的 K 个点, leetcode 973