leetcode官网_leetcode有多少题

leetcode官网_leetcode有多少题leetcode378. Kth Smallest Element in a Sorted Matrix

大家好,又见面了,我是你们的朋友全栈君。

题目要求

Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth smallest element in the matrix.

Note that it is the kth smallest element in the sorted order, not the kth distinct element.

Example:

matrix = [
   [ 1,  5,  9],
   [10, 11, 13],
   [12, 13, 15]
],
k = 8,

return 13.
Note: 
You may assume k is always valid, 1 ≤ k ≤ n2.

在一个从左到右,从上到下均有序的二维数组中,找到从小到第k个数字,这里需要注意,不要求一定要是唯一的值,即假设存在这样一个序列1,2,2,3,则第三个数字是2而不是3。

思路一:优先队列

当涉及到从一个集合中查找一个元素这样的问题时,我们往往会立刻想到查找的几种方式:有序数组查找,无序数组查找,堆排序。这里如果将二维数组转化为一维有序数组,成本未免太大了。同理,将其中所有元素都转化为堆,也会存在内存不足的问题。因此我们可以采用部分元素堆排序即可。即我们每次只需要可能构成第k个元素的值进行堆排序就可以了。

    public int kthSmallest(int[][] matrix, int k) {
        //优先队列
        PriorityQueue<Tuple> queue = new PriorityQueue<Tuple>();
        //将每一行的第一个元素放入优先队列中
        for(int i = 0 ; i<matrix.length ; i++) {
            queue.offer(new Tuple(i, 0, matrix[i][0]));
        }
        
        //对优先队列执行k次取操作,取出来的就是第k个值
        for(int i = 0 ; i<k-1 ; i++) {
            Tuple t = queue.poll();
            //判断是否到达行尾,若没有,则将下一个元素作为潜在的第k个元素加入优先队列中
            if(t.y == matrix[0].length-1) continue;
            queue.offer(new Tuple(t.x, t.y+1, matrix[t.x][t.y+1]));
        }
        return queue.poll().value;
    }
    
    /**
    * 存储矩阵中x,y和该下标上对应的值的Tuple
    */
    public static class Tuple implements Comparable<Tuple>{
        int x;
        int y;
        int value;
        
        public Tuple(int x, int y, int value) {
            this.x = x;
            this.y = y;
            this.value = value;
        }
        @Override
        public int compareTo(Tuple o) {
            // TODO Auto-generated method stub
            return this.value - o.value;
        }
    }

思路二:二分法查找

二分查找的核心问题在于,如何找到查找的上界和下届。这边我们可以矩阵中的最大值和最小值作为上界和下界。然后不停的与中间值进行比较,判断当前矩阵中小于该中间值的元素有几个,如果数量不足k,就将左指针右移,否则,就将右指针左移。直到左右指针相遇。这里需要注意,不能在数量等于k的时候就返回mid值,因为mid值不一定在矩阵中存在。

    public int kthSmallest2(int[][] matrix, int k){
        int low = matrix[0][0], high = matrix[matrix.length-1][matrix[0].length-1];
        while(low <= high) {
            int mid = low + (high - low) / 2;
            int count = 0;
            int i = matrix.length-1 , j = 0;
            //自矩阵左下角开始计算比mid小的数字的个数
            while(i>=0 && j < matrix.length){
                if(matrix[i][j]>mid) i--;
                else{
                    count+=i+1;
                    j++;
                }
            }
            if(count < k) {
                low = mid + 1;
            }else{
                high = mid - 1;
            }
        }
        return low;
    }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107013.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月21日 下午3:40
下一篇 2022年4月21日 下午3:40


相关推荐

  • 华为 eNSP模拟器安装教程

    华为 eNSP模拟器安装教程eNSP 是个很好用的学习工具 但是其安装过程并不那么简单 很多同学在模拟器的安装过程遇到了诸多问题 安装的软件如下 1 V BOX 版本 5 16 经实际测试完美兼容最新版 eNSP 在 win 7 和 win 10 的运转 2 Wireshark 抓包软件 汉化版 在 win 7 win 10 与 ENSP 工作正常 3 eNSP 最新版 1 300 10 实际检验在 win 7 win 10 工作正常 自带镜像工作正

    2026年3月18日
    2
  • 麒麟系统安装splint

    麒麟系统安装splint1 登陆 splint 官网下载原码 http www splint org download html 这里要注意 由于机器是 mips 所以选择上面的原码自行编译 2 tar xzfsplint 3 1 2 src tgzsudo configure prefix usr local splintsudoma 修改配置文件

    2026年3月16日
    2
  • mybatis-plus 在线激活码_在线激活

    (mybatis-plus 在线激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月26日
    247
  • 记一次线上服务器宕机 springboot tomcat

    记一次线上服务器宕机 springboot tomcat记一次线上服务器宕机springboottomcat今天点网站发现请求不了了,到服务器查看,发现tomcat死了。查看log发现但是项目本地跑,没发现问题。查看了一下项目,怀疑是定时任务占用线程池满导致内存泄漏具体看一下定时任务中有没有暂时重启服务器让服务跑通…

    2022年7月23日
    12
  • 【Cursor】Cursor中MCP的接入和使用

    【Cursor】Cursor中MCP的接入和使用

    2026年3月15日
    3
  • 手把手教你实现一个微信自动回复机器人「建议收藏」

    手把手教你实现一个微信自动回复机器人「建议收藏」RebateBot返利机器人项目地址项目描述关键词:返利微信阿里妈妈机器人跨平台返利机器人,基于微信建立机器人通道与用户通过聊天快速生成返利链接利用闲置微信和极小的电脑性能开启24小时无人轮值返利机器人购物只需要发送链接给机器人,机器人能马上给你回复优惠价格及链接功能实现微信机器人这个模块在这里可以看到最新的代码微信机器人[x]消息回调[x]自动回…

    2022年10月1日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号