问题简述

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

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

解题思路

该矩阵的行和列都是按从小到大的顺序排列的,这样的问题一般都是可以用二分法解决的。再来看,我们的输入 kk,输出是第 kk 大的元素,不难发现,kk 越大,输出的元素也就越大。好了,决定用二分法了~
首先,我们以整个矩阵中的最小值为下边界(左上角元素),最大值为上边界(右下角元素)。然后用二分的方法猜过去,猜输出的结果是多少。只要满足猜的条件,我们就会把整个元素记录下来,然后看看有没有比这个元素小,并且满足猜的条件的元素。这个过程的时间复杂度为 O( log(maxVal−minVal) )O(\ log(maxVal-minVal)\ ),其中的 minValminVal 为矩阵左上角的元素,maxValmaxVal 为矩阵右下角的元素。
好了,接下来就是看看怎么猜了~
这里猜的时候又用到了一次二分法,其目的是找到每行中不大于猜的值 valval 的数有多少,然后算出整个矩阵中不大于 valval 的数有多少。如果不大于 valval 的数大于 kk 则返回true,否则返回false。这个过程的时间复杂度为 O( nlog(n) )O(\ nlog(n)\ )。这一步是可以进一步优化的~
这个过程的时间复杂度为 O( nlog(n)log(maxVal−minVal) )O(\ nlog(n)log(maxVal-minVal)\ )。
最后,上代码~

代码

class Solution {
private:bool guess(vector<vector<int>>& matrix, int k, int val){for (int i = 0; i < matrix.size(); i++){int left = 0;int right = matrix[i].size() - 1;int ans = 0;while (left <= right){int mid = left + (right - left) / 2;if (matrix[i][mid] <= val){left = mid + 1;ans = mid + 1;}else{right = mid - 1;}}k -= ans;if (k < 1)return true;}return false;}public:int kthSmallest(vector<vector<int>>& matrix, int k) {int n = matrix.size();int left = matrix[0][0];int right = matrix[n - 1][n - 1];int ans;while (left <= right){int mid = left + (right - left) / 2;if (guess(matrix, k, mid)){ans = mid;right = mid - 1;}else{left = mid + 1;}}return ans;}
};

利用二分法解决 leetcode 378. Kth Smallest Element in a Sorted Matrix相关推荐

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

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

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

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

  3. 378. Kth Smallest Element in a Sorted Matrix

    文章目录 1题目理解 2 思路分析 2.1二分思路 2.2计算小于等于middle值的个数 3 拓展解决leetcode 668 1题目理解 输入:一个nxn的矩阵,每一行从左到右按照升序排列,每一列 ...

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

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

  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] 230. Kth Smallest Element in a BST 找出二叉搜索树中的第k小的元素

    题目大意 https://leetcode.com/problems/kth-smallest-element-in-a-bst/description/ 230. Kth Smallest Elem ...

最新文章

  1. 《Android App开发入门:使用Android Studio 2.X开发环境》——1-3 Android Studio 快速上手...
  2. 了解 ElasticSearch 这几个知识点后,查询起飞~
  3. 关于vue,angularjs1,react之间的对比
  4. Matlab化简符号表达式
  5. C语言 IP地址合法性判断 去除字符串首尾空格
  6. ubuntu下面 将桌面换成 英文
  7. LeetCode 53:最大子序和解题以及优化思路(第一次独立刷题记录)
  8. 字符编码·ISO8859
  9. java的for循环取出数据只是拿到最后一个_如何保证缓存与数据库双写的一致性...
  10. server xcode 云服务器_SRT推流测试及服务器搭建
  11. hdu3949(线性基,求第k小的异或和
  12. DriverManager 连接不同的连接池
  13. Map的keyset() 方法和entrySet() 方法
  14. 小型功率三极管S9013
  15. mysql stmt fetch,mysql_stmt_fetch 奇怪的问题..
  16. 为什么CU和DU要分离?
  17. 茶艺概述20210411
  18. 从新手到高手c++全方位学习 pdf + 视频教程 共18章
  19. 7针oled显示中文及图片arduino。ug8lib
  20. Linux达人养成计划I详细笔记(二)Linux分区与安装

热门文章

  1. 前端之 jQuery 入门
  2. Flask 第三方组件之 WTForms
  3. Colly实现豆瓣电影Top250爬取
  4. linux运维适合女生么,女生真的不适合做IT行业吗?Linux运维适合女生学习吗?
  5. 脚本命令配置mysql_MySQL 自动化部署脚本
  6. 《DIY四轴飞行器》读书笔记1
  7. 使用Vue写一个登陆页面并在管理页面查看和修改
  8. 深入理解ES6之迭代器与生成器
  9. ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程)...
  10. Android面试总结经