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

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;
    }

相关文章:

  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • Dojo 表单校验
  • 扩展访问:Uber Lite App开发始末
  • 嵌入式开发教程,学习嵌入式怎么入门和提高?
  • 5G来之前,视频UGC选择产品解决方案?
  • nodejs处理高并发的原理机制
  • 关于List、List?、ListObject的区别
  • 如何合理的规划jvm性能调优
  • 异步
  • 这一次,彻底弄懂TCP三次握手,四次挥手
  • 线程的等待和唤醒
  • js中forEach回调同异步问题
  • 整行读字符串且需分割计算字符串个数
  • 比特大陆新一轮裁员50%,回应称系人员调整
  • zabbix linux系统模板更新
  • 30天自制操作系统-2
  • iOS | NSProxy
  • Javascript 原型链
  • Joomla 2.x, 3.x useful code cheatsheet
  • JS数组方法汇总
  • Laravel核心解读--Facades
  • mockjs让前端开发独立于后端
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • React中的“虫洞”——Context
  • select2 取值 遍历 设置默认值
  • SQLServer之创建数据库快照
  • vue脚手架vue-cli
  • 闭包--闭包作用之保存(一)
  • 基于HAProxy的高性能缓存服务器nuster
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 讲清楚之javascript作用域
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 使用common-codec进行md5加密
  • 我建了一个叫Hello World的项目
  • 学习ES6 变量的解构赋值
  • 学习JavaScript数据结构与算法 — 树
  • - 转 Ext2.0 form使用实例
  • linux 淘宝开源监控工具tsar
  • Spring第一个helloWorld
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #define、const、typedef的差别
  • #Z0458. 树的中心2
  • #单片机(TB6600驱动42步进电机)
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (六)vue-router+UI组件库
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (三)docker:Dockerfile构建容器运行jar包
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (四)模仿学习-完成后台管理页面查询
  • (转载)(官方)UE4--图像编程----着色器开发
  • .NET 中的轻量级线程安全