文章目录

  • 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 rl≤mid≤r,那么矩阵中不大于 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(r−l)),每次操作时间复杂度为 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;}

378. Kth Smallest Element in a Sorted Matrix相关推荐

  1. 378. Kth Smallest Element in a Sorted Matrix 有序矩阵中第K小的元素

    Title 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素. 请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素. 示例: matrix = [ [ ...

  2. leetcode 378. Kth Smallest Element in a Sorted Matrix

    二分的方法解决 class Solution { public:int kthSmallest(vector<vector<int>>& matrix, int k) ...

  3. leetcode 378. Kth Smallest Element in a Sorted Matrix | 378. 有序矩阵中第 K 小的元素(小根堆)

    题目 https://leetcode.com/problems/kth-smallest-element-in-a-sorted-matrix/ 题解 套了下小根堆模板. class Solutio ...

  4. 利用二分法解决 leetcode 378. Kth Smallest Element in a Sorted Matrix

    问题简述 给定一个 n×nn \times n 的矩阵,矩阵中每行和每列的元素都按升序排列.给定一个 k(k∈[1,n2])k (k \in [1, n^2]), 求再整个矩阵中按从小到大排序为 kk ...

  5. Kth Smallest Element in a Sorted Matrix

    类似的题目有: 373. Find K Pairs with Smallest Sums 378. Kth Smallest Element in a Sorted Matrix 668. Kth S ...

  6. 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 ...

  7. leetcode378 Kth Smallest Element in a Sorted Matrix

    思路1: 使用堆. 实现: 1 class Solution 2 { 3 public: 4 int kthSmallest(vector<vector<int>>& ...

  8. LeetCode 230. Kth Smallest Element in a BST--C++,Python解法--面试真题--找二叉树中第K小的元素

    题目地址:Kth Smallest Element in a BST - LeetCode Given a binary search tree, write a function kthSmalle ...

  9. [LeetCode] Kth Smallest Element in a BST

    Kth Smallest Element in a BST Given a binary search tree, write a function kthSmallest to find the k ...

最新文章

  1. 户籍改革更进一步!我国将推动户籍准入年限同城化累计互认
  2. Exchange Server 2016管理系列课件05.邮件转发功能
  3. java手游 《剑心》_java
  4. CSS伪类的又一个小应用,实现下拉菜单
  5. 算法知识点——(2)模型评估
  6. sql连接本地数据库
  7. 昂达v811升级到4.22d之后shell可以使用root权限操控文件系统
  8. linux串口蜂鸣器报警电路,蜂鸣器报警电路图(简单介绍两种!)
  9. Issue during builing Android app with ant under Win7
  10. linux cat命令追加,linux cat命令
  11. word公式编辑器复制粘贴未响应_word2016一复制公式就卡死?
  12. 360安全助手 -- 强力卸载电脑上的软件 的问题
  13. wincap的安装与环境配置
  14. 网络类型---P2P,MA
  15. OpenSSL-SNI
  16. 简单OR复杂?机器学习专家为你解密企业风险量化模型
  17. 一级建造师全套视频课件下载_重要 ▎一建考试告知承诺制,注册、报考、七大问题最全解答!
  18. 计算机基础知识教程excel单元格拆分,如何快速的拆分Excel单元格日期与时间呢?...
  19. 必读的AI和深度学习博客
  20. Cocos2dx 2.1.5 孤狼优化整合版V1.1(32位)

热门文章

  1. Mvc 学习笔记(一)
  2. 内存数据库和关系数据库之间的数据同步原理
  3. Asp.Net MVC4入门指南(5):从控制器访问数据模型
  4. Java程序练习-螺旋矩阵
  5. java builder pool_每周10道Java面试题:String, String Pool, StringBuilder
  6. H5新增的标签和属性
  7. Android 使用ViewPager实现view轮播效果,单个item分页样式,多个item分页样式,横向listview
  8. node 微信开发 json转xml 格式
  9. 原来js的parseInt函数还可以这样用
  10. 硬盘计算机类比推理,判断推理类比推理:储存:光盘:硬盘 A:晾晒:绳索:衣架 B.吃...