ID | Title | Difficulty | |
---|---|---|---|
Loading... |
973. K Closest Points to Origin
Medium
LeetCode
Problem
Given an array of points
where points[i] = [xi, yi]
represents a point on the X-Y plane and an integer k
, return the k
closest points to the origin (0, 0)
.
The distance between two points on the X-Y plane is the Euclidean distance (i.e., √(x1 - x2)2 + (y1 - y2)2
).
You may return the answer in any order. The answer is guaranteed to be unique (except for the order that it is in).
Example 1:
Input: points = [[1,3],[-2,2]], k = 1
Output: [[-2,2]]
Explanation:
The distance between (1, 3) and the origin is sqrt(10).
The distance between (-2, 2) and the origin is sqrt(8).
Since sqrt(8) < sqrt(10), (-2, 2) is closer to the origin.
We only want the closest k = 1 points from the origin, so the answer is just [[-2,2]].
Example 2:
Input: points = [[3,3],[5,-1],[-2,4]], k = 2
Output: [[3,3],[-2,4]]
Explanation: The answer [[-2,4],[3,3]] would also be accepted.
Constraints:
1 <= k <= points.length <= 104
-104 <= xi, yi <= 104
Code
class Solution {
public int[][] kClosest(int[][] points, int K) {
int left = 0;
int right = points.length - 1;
while (left <= right) {
int mid = helper(points, left, right);
if (mid == K)
return Arrays.copyOfRange(points, 0, K);
if (mid > K) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return points;
}
private int helper(int[][] nums, int left, int right) {
int[] pivot = nums[left];
int l = left + 1;
int r = right;
// 给l正确的位置
// 右边的数比l大 左边的数比l小
while (l <= r) {
if (compare(nums[l], pivot) > 0 && compare(nums[r], pivot) < 0) {
swap(nums, l, r);
l++;
r--;
}
// 跳过符合条件的值
if (compare(nums[l], pivot) <= 0)
l++;
if (compare(nums[r], pivot) >= 0)
r--;
}
swap(nums, left, r);
return r;
}
// 比较到0,0的距离
private int compare(int[] p1, int[] p2) {
return p1[0] * p1[0] + p1[1] * p1[1] - p2[0] * p2[0] - p2[1] * p2[1];
}
private void swap(int[][] nums, int left, int right) {
int[] tmp = nums[left];
nums[left] = nums[right];
nums[right] = tmp;
}
}
按 <- 键看上一题!
953. Verifying an Alien Dictionary
按 -> 键看下一题!
974. Subarray Sums Divisible by K