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

定陶住房和城乡建设局网站微信小程序开发公司

定陶住房和城乡建设局网站,微信小程序开发公司,wordpress第一张缩略图,心馨人生珠海网站建设给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。 请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素。 你必须找到一个内存复杂度优于 O(n2) 的解决方案。 示例 1&#xff1…

给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。
请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素。

你必须找到一个内存复杂度优于 O(n2) 的解决方案。

示例 1:

输入:matrix = [[1,5,9],[10,11,13],[12,13,15]], k = 8
输出:13
解释:矩阵中的元素为 [1,5,9,10,11,12,13,13,15],第 8 小元素是 13
示例 2:

输入:matrix = [[-5]], k = 1
输出:-5

提示:

n == matrix.length
n == matrix[i].length
1 <= n <= 300
-109 <= matrix[i][j] <= 109
题目数据 保证 matrix 中的所有行和列都按 非递减顺序 排列
1 <= k <= n2

题解

有序 + 确定范围 可以使用二分查找

  1. 左上角matrix[0][0]是下限,右下角matrix[n-1][n-1]是上限,就有了一个值,第 k 小的元素在这个值域中
    我们对值域进行二分查找(mid=(matrix[0][0]+matrix[n-1][n-1])/2),使得mid逼近值域中的目标值(第 k 小的元素)
  2. 求出矩阵里小于等于mid的有几个,num个
  3. num 和 k 比较
    如果比 k 小,说明中间值小了,调整值域范围(left=mid+1)
    否则,说明中间值大了,调整值域范围(right=mid),一步步锁定目标值

注:

1. 为什么对值二分而不是对索引二分

二分查找可以根据索引二分,也可以根据数值二分,有序数组中,索引的大小可以反映值的大小,对索引二分就行
但这里不是有序的一维数组,索引不能体现值谁大谁小,无法通过二分索引逼近目标值

2. 为什么最后left是第k小的数||二分法如何保证最后的left or right 是数组中的元素?

因为每次值域收缩都保证了第 k 小的数在 left ~ right 之间,当 left==right 时,第 k 小的数即被找出,等于left

class Solution {public int kthSmallest(int[][] matrix, int k) {int n = matrix.length;//left和right是矩阵值不是矩阵下标int left = matrix[0][0];int right = matrix[n - 1][n - 1];//一步步收缩值域范围直至left==right//因为每次值域收缩都保证了第 k 小的数在 left ~ right 之间,当 left==right 时,第 k 小的数即被找出,等于leftwhile (left < right) {//避免溢出int mid = left + (right - left)/2;//满足 num >= k,范围太大,移动right至mid, 范围收缩//注意num=k时说明小于等于mid数的数量等于k,但不代表mid就是结果,因为此时mid不一定在matrix中if (check(matrix, mid, k, n)) {right = mid;} else {//满足 num < k,范围太小,移动left至mid+1, 范围收缩left = mid + 1;}}//跳出循环时left=right,返回值left是什么???return left;}//从矩阵左下角开始按列遍历每一列,计算每一列中比mid小的元素个数并累加获得num,将num与k比较//返回值boolean:矩阵中小于mid的数>=k//为什么不直接返回num=k时的mid值?因为mid是通过值域二分法计算出的值,不是实际的矩阵值public boolean check(int[][] matrix, int mid, int k, int n) {int i = n - 1;int j = 0;int num = 0;while (i >= 0 && j < n) {if (matrix[i][j] <= mid) {//当前元素小于mid,则本列此元素及上方元素均小于mid,num+=i+1(行号是i,行的数目是i+1)num += i + 1;//列向右移动,计算下一列小于mid的元素的个数j++;} else {//当前元素大于mid,则向上移动,直到找到比mid小的值,或者出矩阵i--;}}return num>=k;}}
http://www.dtcms.com/wzjs/184375.html

相关文章:

  • 做网站如何让用户注册windows优化软件哪个好
  • 淄博专业网站建设哪家专业西安新站网站推广优化
  • wordpress pre标签网站seo优化心得
  • 布吉附近做网站百度seo是啥意思
  • 长沙网站优化掌营天下seo赚钱培训
  • 网站集约化建设工作打算手机百度引擎搜索入口
  • 建设网站定制北京网络营销推广公司
  • wordpress看文网站seo引擎优化工具
  • 中国最大的做网站公司免费技能培训在哪里报名
  • 邯郸网站设计报价广州seo外包
  • 怎么做套版网站百度入驻商家
  • 程序员源码网站设计案例网
  • idea 做网站登录淘宝美工培训
  • 怎么免费建自己的网站东莞营销型网站建设
  • wordpress怎装模板seo就业哪家好
  • 惠州品牌网站建设公司哪里有沪深300指数怎么买
  • 网站建设哪家技术好网站广告接入
  • 用javascirpt做的网站手机端关键词排名优化
  • 电子商务网站的建设费用案例自制网站 免费
  • 南阳高质量建设大城市网站昆明做网站的公司
  • 常宁市城乡和住房建设网站百度热点排行榜
  • 东丽区网站建设公司百度定位店铺位置怎么设置
  • 如何在腾讯云上建设网站百度推广登录入口官网
  • 集团网站策划方案seo是指
  • 手机网站建设 的作用看b站视频软件下载安装手机
  • 做网站要下载的软件营销策划书范文1000字
  • 实训做网站收获外贸网站都有哪些
  • 韩国男女做游戏视频网站seo关键词排名优化手机
  • 全网营销网站怎么做设计素材网站
  • 商务网站开发文档餐饮营销策划与运营