Java/973. K Closest Points to Origin 最接近原点的K个点

本文介绍了一种高效算法,用于从一组二维坐标中找出与原点距离最近的K个点。通过创建映射存储距离与坐标,再进行排序,最终筛选出目标点集。两种代码实现方式对比,展示了如何通过定义坐标类提升效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目


 

题解:首先会给到我们一系列的坐标点(二维),找出这些坐标里与原点(0,0)距离最短的K个点
所以依次把各个点的距离求出来,然后找出距离最短的K个保存到结果输出就行了

 

 

 

 

代码部分一(63ms)

class Solution {
    public int[][] kClosest(int[][] points, int K) {
        Map<Integer,List<Integer>> map = new HashMap();
        int[][] res = new int[K][2];
        
        int rank = points.length;
        int[] sort = new int[rank];
        for(int i = 0; i < rank; i++){
            sort[i] = (points[i][0] * points[i][0]) + (points[i][1] * points[i][1]);
            List<Integer> list = new ArrayList();
            list.add(points[i][0]);
            list.add(points[i][1]);
            map.put(sort[i],list);
        }
        Arrays.sort(sort);
        for(int i = 0; i < K; i++){
            List<Integer> list = new ArrayList();
            list = map.get(sort[i]);
            res[i][0] = list.get(0);
            res[i][1] = list.get(1);
        }
        
        
        return res;
    }
}


1.创建一个HashMap来存放(距离-坐标)
2.创建sort[],存放每个坐标与原点的距离并用于排序
3.遍历所有坐标,计算每个坐标与原点的距离的平方,并计算后的距离和坐标一起存入map
4.排序距离
5.找到最小的K个坐标,保存到结果输出

 

 

 

代码部分二(42ms)

class Point{
    int x;
    int y;
    public Point(int x, int y){
        this.x = x;
        this.y = y;
    }
}
class Solution {
    public int[][] kClosest(int[][] points, int K) { 
        Map<Integer,Point> map = new HashMap();
        int[][] res = new int[K][2];
        
        int rank = points.length;
        int[] sort = new int[rank];
        for(int i = 0; i < rank; i++){
            sort[i] = (points[i][0] * points[i][0]) + (points[i][1] * points[i][1]);
            Point point = new Point(points[i][0], points[i][1]);
            map.put(sort[i],point);
        }
        Arrays.sort(sort);
        for(int i = 0; i < K; i++){
            Point point = map.get(sort[i]);
            res[i][0] = point.x;
            res[i][1] = point.y;
        }
        
        
        return res;
    }
}

只是声明了一个坐标类存放坐标,减少了查存函数的使用,提高效率

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值