【题目描述】
给定一个数组 points
,其中 points[i] = [xi, yi]
表示 X-Y 平面上的一个点,并且是一个整数 k
,返回离原点 (0,0)
最近的 k
个点。
这里,平面上两点之间的距离是 欧几里德距离( √(x1 - x2)2 + (y1 - y2)2
)。
你可以按 任何顺序 返回答案。除了点坐标的顺序之外,答案 确保 是 唯一 的
https://leetcode.cn/problems/k-closest-points-to-origin/
【示例】
【代码】
admin
package com.company;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
class Solution {
public int[][] kClosest(int[][] points, int k) {
int[][] res = null;
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < points.length; i++){
int tmp = (int)(Math.pow(points[i][0], 2) + Math.pow(points[i][1], 2));
map.put(i, tmp);
}
List<Map.Entry<Integer, Integer>> collect = map.entrySet().stream().sorted(new Comparator<Map.Entry<Integer, Integer>>() {
@Override
public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
return o1.getValue() - o2.getValue();
}
}).collect(Collectors.toList());
// System.out.println(map.toString());
List<int[]> list = new ArrayList<>();
int count = 1;
if (collect.size() != 1){
for(Map.Entry<Integer, Integer> x: collect){
if (count <= k){
int[] t = points[x.getKey()];
list.add(t);
count++;
}
}
}else {
list.add(points[0]);
}
res = new int[list.size()][];
for(int i = 0; i < list.size(); i++){
res[i] = list.get(i);
}
// for (int i = 0; i < res.length; i++) {
// System.out.println(Arrays.toString(res[i]));
// }
return res;
}
}
public class Test {
public static void main(String[] args) {
int[][] arr = {{3,3}, {5, -1}, {-2, 4}};
int k = 2;
new Solution().kClosest(arr, k);
}
}