378. Kth Smallest Element in a Sorted Matrix

文章目录

  • 1题目理解
  • 2 思路分析
    • 2.1二分思路
    • 2.2计算小于等于middle值的个数
  • 3 拓展解决leetcode 668

1题目理解

输入:一个nxn的矩阵,每一行从左到右按照升序排列,每一列从上到下按照升序排列。一个整数k。
输出:这个矩阵中第k小的数。
规则:矩阵中数字可能重复,输出结果,应该排序后的第k个数。

例如
matrix = [
[ 1, 5, 9],
[10, 11, 13],
[12, 13, 15]
],
k = 8
结果13

2 思路分析

来源于力扣官方分析,网址。
输入矩阵matrix,每一行可以看做是一个排序好的数组,可以将这几个小数组排序好之后取第k个数,即可。排序几个已经排序好的数组,可以参考leetcode23。时间复杂度O(klogn)。

因为同时每一列也是排序号的,考虑用二分查找实现。

2.1二分思路

返回值一定在matrix[0][0]到matrix[n-1][n-1]之间。令函数g(x)={matrix中小于等于x的数量}={#of(matrix[i][j]<=x)}。
g(x)是一个递增的函数,x越大,g(x)越大。
返回值是满足g(x)>=k,的最小值。
套用模板。

class Solution {public int kthSmallest(int[][] matrix, int k) {int n = matrix.length;int l = matrix[0][0];int r = matrix[n-1][n-1];while(l<=r){int middle = l + ((r-l)>>1);if(countSmallerOrEqual(matrix,middle,n)>=k){r = middle - 1;}else{l = middle + 1;}}return l;}
}

2.2计算小于等于middle值的个数

接下来的问题是如何数出<=middle<=middle<=middle的数量。
可以发现一个性质:任取一个数 midmid 满足 l≤mid≤rl\leq mid \leq rlmidr,那么矩阵中不大于 mid 的数,肯定全部分布在矩阵的左上角。

例如下图,取 mid=8:
在这里插入图片描述

从图中可以看到大于middle与小于等于middle的数被一条锯齿形状分成了2部分 。
我们可以从左下角开始遍历。

	private int countSmallerOrEqual(int[][] matrix, int middle, int n){int i = n - 1;int j = 0;int num = 0;while(i>=0 && j<n){if(matrix[i][j]<=middle){num += i+1;j++;}else{i--;}}return num;}

时间复杂度O(nlog(r−l))。二分查找进行次数为O(log(r−l))O(log(r-l))O(log(rl)),每次操作时间复杂度为 O(n)。

当然我们也可以每次遍历一个子数组,二分查找个数。

private int countSmallerOrEqual(int[][] matrix, int middle, int n){int num = 0;for(int i = 0;i<n;i++){int l = 0, r = n-1;while(l<=r){int m = l + ((r-l)>>1);if(matrix[i][m]>middle){r = m - 1;}else{l = m + 1;}}if(l>=0){num += l;}} return num;}

3 拓展解决leetcode 668

leetocde 668 Kth Smallest Number in Multiplication Table 与本题目非常类似。
每个人都知道乘法表。输入整数m,n表示m行n列的乘法表。在这个乘法表中找到第k小元素。
例如
Input: m = 3, n = 3, k = 5
Output: 3
Explanation:
乘法表是这样的:
1 2 3
2 4 6
3 6 9

The 5-th 小元素是 3 (1, 2, 2, 3, 3).

参考网址

这个乘法表与上面题目中的矩阵具有相同的性质:每一行,每一列都是有序的。同样也是要查找第k小元素,同样矩阵中是有重复元素的。把上面代码框架抄写一下。

class Solution {public int findKthNumber(int m, int n, int k) {int l = 1;int r = m*n;while(l<=r){int middle = l + ((r-l)>>1);if(countSmallerOrEqual(m,n,middle)>=k){r = middle - 1;}else{l = middle + 1;}}return l;}}

不同的地方是上提的矩阵是确定的,已经生成好的,而本题需要自己生成矩阵。
题目要求m, n 的范围是[1, 30000],如果生成矩阵可能会引起内存不足。
当我们要计算有多少个数小于等于middle的时候,是不是可以不生成矩阵呢?
在这里插入图片描述
例如 m=3,n=3,middle=5,查找这个矩阵中有多少个值小于等于5。
对于第3行,是从1到3,依次乘以3,5/3=1,有1个元素小于等于5。
对于第2行,是从1到3,依次乘以2,5/2=2,有2个元素小于等于5。
对于第1行,是从1到3,依次乘以1,5/1=5,但是n=3 ,所以有3个元素小于等于5。
总小于等于5元素个数是1+2+3=6。由此可以看出,不需要生成矩阵,也可以计算。

 private int countSmallerOrEqual(int m,int n,int middle){int num = 0;for(int i=1;i<=m;i++){num += Math.min(middle/i,n);}return num;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20 年后,我们怎么看电影?

简评&#xff1a; 几十年来&#xff0c;虚拟现实一直被认为是电影业的未来所在&#xff0c;能够为观众提供比传统影视更身临其境的体验。在 1955 年的一篇题为《未来的电影》的文章中&#xff0c;电影摄影师海里戈就预言「未来的电影将会以生动活泼的形式为人们揭开新科学世界的…

第七十五期:网络 | 5G那些运营商不愿说的秘密

11月1日&#xff0c;国内几大基础运营商正式上线5G资费套餐&#xff1a;月套餐最低128元起&#xff0c;最高869元&#xff0c;这也标志着中国5G通信服务真正进入全民商用时代&#xff0c;不少急于尝鲜者还第一时间购入5G手机并办理相关套餐&#xff0c;率先体验传说中的极速5G网…

烦人的项目

最近被一些挑剔的用户搞了个半死。都要忙晕过去了。作项目真的是好累&#xff01;不知这种烦人的日子还要多久才能过去。转载于:https://www.cnblogs.com/Lancer/archive/2004/05/24/11152.html

第七十七期:可自动生成代码,5款基于AI的开发工具

如今&#xff0c;对机器学习潜力感兴趣的程序员都在讨论&#xff0c;如何使用人工智能和基于人工智能的软件开发工具构建应用程序。例如PyTorch和TensorFlow之类的解决方案。 作者&#xff1a;Sandra Parker 如今&#xff0c;对机器学习潜力感兴趣的程序员都在讨论&#xff0…

第七十八期:2019全球程序员薪酬报告:软件开发比机器学习抢手!40岁后收入下滑

Hired发布了《2019 年度薪酬状况报告》。调查显示&#xff1a;仅有23%的计算机科学相关专业硕士/博士表示高学历为其带来高薪&#xff1b;54%从业者表示不会继续深造&#xff1b;40岁后薪资呈现下降、60岁基本降到30岁水平。 作者&#xff1a;佚名 Hired发布了《2019 年度薪酬…

第七十九期:阿里程序员感慨:码农们过去暴富有多轻松,现在赚钱就有多辛苦

互联网的世界也是一座围城。有人挤破脑袋想要进去。而有人又觉得是被互联网的光鲜表象欺骗了忙着要出来&#xff0c;但最终&#xff0c;这些人都会离开。 作者&#xff1a;职场八卦 互联网的世界也是一座围城。有人挤破脑袋想要进去。而有人又觉得是被互联网的光鲜表象欺骗了…

[导入]画带阴影效果的文字

画带阴影效果的文字文章来源:http://blog.csdn.net/net_lover/archive/2004/07/06/35553.aspx 转载于:https://www.cnblogs.com/zhaoxiaoyang2/archive/2004/07/07/816094.html

第八十期:初创公司5大Java服务困局,阿里工程师如何打破?

初创公司遇到的每一个问题都可能攸关生死。创业之初更应该总结行业的常见问题&#xff0c;对比方案寻找最优解。 作者&#xff1a;常意 初创公司遇到的每一个问题都可能攸关生死。创业之初更应该总结行业的常见问题&#xff0c;对比方案寻找最优解。阿里巴巴地图技术专家常意在…

第八十一期:Java性能优化:35个小细节,提升你的Java代码运行效率

如果项目着眼于尽快无BUG上线&#xff0c;那么此时可以抓大放小&#xff0c;代码的细节可以不精打细磨&#xff1b;但是如果有足够的时间开发、维护代码&#xff0c;这时候就必须考虑每个可以优化的细节了&#xff0c;一个一个细小的优化点累积起来&#xff0c;对于代码的运行效…

Python数据类型与运算符号

一&#xff1a;数据类型 【1】为什么要有数据类型 &#xff08;1&#xff09;不同的数据含有不同的特征 例如&#xff1a;有文本数据 音频数据 视频数据 &#xff08;2&#xff09;不同的特征需要有不同的类型用来描述 二&#xff1a;数据类型的分类 【1】 &#xff08;1&#…

全面搞定jive3.1.1

全面搞定jive3.1.1yippit 原创 (参与分&#xff1a;351&#xff0c;专家分&#xff1a;1740) 发表&#xff1a;2003-9-13 下午8:33 版本&#xff1a;1.0 阅读&#xff1a;8316次 近日坛子里面很多人问起这个问题&#xff0c;要么中文显示乱码出错&#xff0c;要么不能数…

模板——树状数组求逆序对

题目链接&#xff1a;https://www.luogu.org/problemnew/show/P1908 1 #include <map>2 #include <set>3 #include <cmath>4 #include <queue>5 #include <string>6 #include <cstdio>7 #include <cstring>8 #include <iostream&…

818. Race Car

文章目录1 题目理解2 BFS3 dp3.1 基本情况3.2 递归方程分析3.2.1 先超过target再调头3.2.2 不超过target4 说明1 题目理解 先讲规则。一辆小汽车停在位置0&#xff0c;并且方向朝向右侧&#xff0c;并且速度为1。小汽车每次可以选择加速A&#xff0c;那加速一次&#xff0c;新…

spring mvc学习(8):springmvc常用注解代码

目录结构 web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns"http://java.sun.com/xml/ns/javaee" xsi:schemaLocation"http://java.sun.com/xml…

python-if条件判断与while/for循环

条件判断if 让计算机像人一样&#xff0c;能判断是非对错&#xff0c;根据条件做一些事情。 if ------ if代码结构&#xff1a;------- if 条件:代码体tips&#xff1a;同一缩进范围内的代码被视作同一代码体,python官方推荐python缩进一次为4个空格is_happy True if is_happ…

第八十二期:掌握这些监控报警优化技巧,百万年薪不在话下!

运维工程师面试者第一个问题是&#xff1a;需要值班吗?笔者自己也曾经历过月入十万的时期&#xff0c;在那个时候&#xff0c;数个系统同时发布下一代版本&#xff0c;而老系统还需要过渡很长时间&#xff0c;工作量直接翻倍。 作者&#xff1a;焦振清 运维工程师面试者第一…

dp按照规模分类总结

本文章的内容来源于花花酱dp2。 做多了dp的题目之后总觉得有什么规律&#xff0c;但是自己没总结出来。花花酱按照输入规模、子问题个数、在解决一个问题的时候需要依赖的子问题个数为特征对题目做了分类。 其中绿色是比较简单的 &#xff0c;黄色是中等的&#xff0c;粉色是…

看了交大自产的电影《我的太阳》

呵呵&#xff0c;现在大学生自导自拍自演的电影越来越多了&#xff0c;不知道算是中国第几代导演&#xff1a;&#xff09; 我看电影一般比较关注情节&#xff0c;演技暂且不提。因为是校园电影&#xff0c;本片自然比较接近大学生生活&#xff0c;总体情节比较浪漫曲折(虽然部…

第八十三期:这些高性能负载均衡架构知识点,90%的人分不清!

单服务器无论如何优化&#xff0c;无论采用多好的硬件&#xff0c;总会有一个性能天花板&#xff0c;当单服务器的性能无法满足业务需求时&#xff0c;就需要设计高性能集群来提升系统整体的处理性能。 作者&#xff1a;马天池 单服务器无论如何优化&#xff0c;无论采用多好…

第八十四期: Java、Web 和移动程序员学习的 12 个框架

今天的文章中&#xff0c;我将分享一些你可以学习的框架&#xff0c;以提升你在移动和Web开发以及大数据技术方面的知识。 作者&#xff1a;芒果教你学编程 在今天的文章中&#xff0c;我将分享一些你可以学习的框架&#xff0c;以提升你在移动和Web开发以及大数据技术方面的…