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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 求余运算符_取余运算规则

    求余运算符_取余运算规则笔记摘自《极客学院》求余运算(a%b)是计算b的多少倍刚刚好可以容入a,返回多出来的那部分(余数)。注意:求余运算(%)在其他语言也叫取模运算。然而严格说来,我们看该运算符对负数的操作结果,&

    2022年8月1日
    3
  • 抽象工厂设计模式例题_什么是抽象工厂模式

    抽象工厂设计模式例题_什么是抽象工厂模式定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。类型:创建类模式类图:抽象工厂模式与工厂方法模式的区别       抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品结构,表现为一个接口或者抽

    2022年10月29日
    0
  • Java生成随机数组_java生成唯一数字

    Java生成随机数组_java生成唯一数字java生成uuid介绍:UUID(通用唯一标识符)表示一个128位长的唯一值。它也被普遍称为GUID(全球唯一标识符)。UUID的标准表示形式由十六进制数字组成:533a4559-e55c-18b3-8456-555563322002并具有36个字符,其中包括四个连字符’-‘。Java中的java.util.UUID类表示一个不变的UUID。我们可以使用UUID类来生成…

    2022年9月22日
    0
  • 最新SEO寄生虫排名

    最新SEO寄生虫排名黑帽SEO怎么做寄生虫这里说下寄生虫问题!需要的可以联系qQ325和056还有6854.对于小编来说!对寄生虫程序的选择没啥讲究!顺手好用就好!最近新出很多寄生虫!各种各样的,说得有多牛逼多牛逼的!其实都是骗人的、哪个在营销自己的产品的时候不把自己的产品说得好一些!难道会告诉大家垃圾吗?实际上市面上的虫子程序都是把原始版本改版过来的!有的把程序和菜刀软件二合一起来为了大家方便生成,看着简单易操作…

    2022年5月13日
    54
  • Oracle 11g安装教程(详细步骤)

    Oracle 11g安装教程(详细步骤) 电脑装个Oracle装了三次,经历颇有点坎坷。主要这东西卸载也比较麻烦,卸载不干净重新安装还是有问题。参考了网上的一些资料,自己总结了一下。希望大家都能少猜一些坑吧!  Oracle11g安装 1.解压下载的包,然后进入包内,点击setup.exe开始安装。2.出现如下:一般把那个小对勾取消,点击下一步进行, 弹出下图这个后点‘是’3.下图后,选择创建和配置数据库,点击下一步。 4.下图,选…

    2022年7月26日
    1
  • ViewStub用法介绍

    ViewStub用法介绍在开发应用程序的时候,经常会遇到这样的情况,会在运行时动态根据条件来决定显示哪个View或某个布局。那么最通常的想法就是把可能用到的View都写在上面,先把它们的可见性都设为View.GONE,然后在代码中动态的更改它的可见性。这样的做法的优点是逻辑简单而且控制起来比较灵活。但是它的缺点就是,耗费资源。虽然把View的初始可见View.GONE但是在Inflate布局的时候View仍然会被Infl

    2022年6月28日
    24

发表回复

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

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