当前位置: 首页 > news >正文

2025年- G28-Lc102-973. K 个距离原点最近的点--java版

1.题目描述

给定一个点的列表 points,其中每个点的坐标表示为 [xi, yi],以及一个整数 k,表示需要找到距离原点 (0,0) 最近的 k 个点。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.思路

思路一:
首先输入是一个二维数组,然后开始计算二维数组忠每个元素(每一个点)与原点直接的距离(可以直接对每个点求勾股定理),最后输出是离原点距离最近的点(k代表返回的点的个数),按升序排序。

思路二:
用优先级队列[PiorityQueue默认是小根堆,但是可以改变比较器的规则(comparetor,让他变成大根堆)。],把每个坐标的欧式距离入堆之后,用对象.size()的方法,列出总共的元素,根据题目要求要前k跟原点近的点的欧式距离,保留前k个,其他用对象.poll()按最大开始剔除,直到剩最小的k个,最后用一个二维数组输出。
在这里插入图片描述
在这里插入图片描述

在 PriorityQueue 中,标准的 poll() 方法并不接受任何参数。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.代码实现

import java.util.PriorityQueue;

public class Solution06 {
    public int[][] kClosest(int[][] points, int k) {

        // 创建最大堆,按照 (x² + y²) 从大到小排序,创建和声明最大堆,此时堆是空的
        PriorityQueue<int[]> s1=new PriorityQueue<>(
                (a,b)->Integer.compare(distance(b),distance(a))
        );
        //遍历每个点,联系:一个求距离的算法。
        for(int[] point:points)
        {
            s1.offer(point);//加入堆
            if (s1.size()>k)
            {
                s1.poll();//只保留最近的 k 个点,也就是把大根堆大的点剔除掉,剩下k个小的元素
            }
        }
        //输出剩下的k个二维数组,有k个点,2代表每个坐标都有x,y,也就是两列
        int[][] reasult=new int[k][2];
        int index=0;
        for(int[] subpoint:s1)
        {
           reasult[index]=subpoint;
           index++;
        }
        return reasult;
//        int[][] result = new int[k][2];
//        for (int i = 0; i < k; i++) {
//            result[i] = s1.poll();
//        }
//        return result;
    }




    private static int distance(int[] point)
    {
        return point[0]*point[0]+point[1]*point[1];
    }


}

带main方法验证的代码:

import java.util.PriorityQueue;
import java.util.Arrays;
public class Solution06 {
    public int[][] kClosest(int[][] points, int k) {

        // 创建最大堆,按照 (x² + y²) 从大到小排序,创建和声明最大堆,此时堆是空的
        PriorityQueue<int[]> s1=new PriorityQueue<>(
                (a,b)->Integer.compare(distance(b),distance(a))
        );
        //遍历每个点,联系:一个求距离的算法。
        for(int[] point:points)
        {
            s1.offer(point);//加入堆
            if (s1.size()>k)
            {
                s1.poll();//只保留最近的 k 个点,也就是把大根堆大的点剔除掉,剩下k个小的元素
            }
        }
        //输出剩下的k个二维数组,有k个点,2代表每个坐标都有x,y,也就是两列
        int[][] reasult=new int[k][2];
        int index=0;
        for(int[] subpoint:s1)
        {
           reasult[index]=subpoint;
           index++;
        }
        return reasult;
//        int[][] result = new int[k][2];
//        for (int i = 0; i < k; i++) {
//            result[i] = s1.poll();
//        }
//        return result;
    }




    private static int distance(int[] point)
    {
        return point[0]*point[0]+point[1]*point[1];
    }

   public static void main(String args[])
   {
       Solution06 test=new Solution06();
       int[][] point1={{1, 3}, {-2, 2}};
       int k1=1;
       System.out.println("输出与原点最近的点:");
       printResult(test.kClosest(point1,k1));

   }
    // 打印二维数组的方法
    private static void printResult(int[][] result) {
//        for (int[] point : result) {
//            System.out.println(Arrays.toString(point));
//        }
//        System.out.println();
        for(int[] rePoint:result)
        {
            System.out.println(Arrays.toString(rePoint));
        }
    }

}

带main方法的测试代码:

import java.util.PriorityQueue;
import java.util.Arrays;
public class Solution06 {
    public int[][] kClosest(int[][] points, int k) {

        // 创建最大堆,按照 (x² + y²) 从大到小排序,创建和声明最大堆,此时堆是空的
        PriorityQueue<int[]> s1=new PriorityQueue<>(
                (a,b)->Integer.compare(distance(b),distance(a))
        );
        //遍历每个点,联系:一个求距离的算法。
        for(int[] point:points)
        {
            s1.offer(point);//加入堆
            if (s1.size()>k)
            {
                s1.poll();//只保留最近的 k 个点,也就是把大根堆大的点剔除掉,剩下k个小的元素
            }
        }
        //输出剩下的k个二维数组,有k个点,2代表每个坐标都有x,y,也就是两列
        int[][] reasult=new int[k][2];
        int index=0;
        for(int[] subpoint:s1)
        {
           reasult[index]=subpoint;
           index++;
        }
        return reasult;
//        int[][] result = new int[k][2];
//        for (int i = 0; i < k; i++) {
//            result[i] = s1.poll();
//        }
//        return result;
    }




    private static int distance(int[] point)
    {
        return point[0]*point[0]+point[1]*point[1];
    }

//   public static void main(String args[])
//   {
//       Solution06 test=new Solution06();
//       int[][] point1={{1, 3}, {-2, 2}};
//       int k1=1;
//       System.out.println("输出与原点最近的点:");
//       printResult(test.kClosest(point1,k1));
//
//   }
//    // 打印二维数组的方法
//    private static void printResult(int[][] result) {
        for (int[] point : result) {
            System.out.println(Arrays.toString(point));
        }
        System.out.println();
//        for(int[] rePoint:result)
//        {
//            System.out.println(Arrays.toString(rePoint));
//        }
//    }

    public static void main(String[] args) {
        Solution06 solution = new Solution06();

        int[][] points1 = {{1, 3}, {-2, 2}};
        int k1 = 1;
        System.out.println("Test Case 1:");
        int[][] result1 = solution.kClosest(points1, k1);
        for (int[] point : result1) {
            System.out.println(Arrays.toString(point));
        }
        System.out.println();

        int[][] points2 = {{3, 3}, {5, -1}, {-2, 4}};
        int k2 = 2;
        System.out.println("Test Case 2:");
        int[][] result2 = solution.kClosest(points2, k2);
        for (int[] point : result2) {
            System.out.println(Arrays.toString(point));
        }
        System.out.println();
    }

}

相关文章:

  • 适合开发点餐系统的PHP开源框架要具备哪些优势?
  • Java设计模式之迭代器模式
  • 强化学习与智能决策:基本原理、算法及应用
  • @JSONField(serialize = false)序列化过程中排除特定字段
  • 从零构建大语言模型全栈开发指南:第二部分:模型架构设计与实现-2.2.3实战案例:在笔记本电脑上运行轻量级LLM
  • NLP高频面试题(十六)——deepspeed原理
  • 记一次线上环境JAR冲突导致程序报错org.springframework.web.util.NestedServletException
  • v-model 总结
  • Java后端API限流秘籍:高并发的防护伞与实战指南
  • unittest自动化测试实战
  • 嵌入式硬件工程师从小白到入门-PCB绘制(二)
  • Qt跨平台文件传输系统开发全解:TCP/IP协议+多线程架构
  • 观成科技:海莲花利用MST投递远控木马
  • K8s的网络
  • Go环境相关理解
  • MySQL 中,分库分表机制和分表分库策略
  • Modbus RTU ---> Modbus TCP透传技术实现(Modbus透传、RS485透传、RTU透传)分站代码实现、协议转换器
  • heapq库的使用——python代码
  • 【计算机网络】DHCP工作原理
  • USB Burning Tool/SP Flash Tool/ADB电视盒子刷机工具大全
  • 中关村科技租赁/seo网站快排
  • 网站推广运营/爱站网怎么使用
  • 重庆ssc做号网站/百度推广方案
  • 长沙做网站一般要多少钱/查询网站收录
  • 深圳网站建设公司哪家好/怎样做seo搜索引擎优化
  • wordpress学生/广东做seo的公司