力扣第378题 有序矩阵中第K小的元素

题目描述

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

示例:

matrix = [
[ 1, 5, 9],
[10, 11, 13],
[12, 13, 15]
],
k = 8,
返回 13。

解法1:使用flat()加上sort()之后根据index进行

var kthSmallest = function(matrix, k) {
    const list = matrix.flat().sort((a,b)=>a-b)
    return list[k-1]
};

解法2:二分查找法

var kthSmallest = function(matrix, k) {
  let left = matrix[0][0],
      row = matrix.length,
      col = matrix[0].length,
      right = matrix[row - 1][col - 1];
  
  // 判断矩阵中 <= value 的数是不是 >= k
  //总体思想就是:当前数的下面和右边数都是大于当前当前数
  const isValid = (value, k, arr, row, col) => {
    let count = 0,
        i = 0,
        j = col - 1;
    while (i < row && j >= 0) {  //i < row判断是否到了最后一行,j >= 0是否到了数组最前面
      if (arr[i][j] <= value) {
        count += j + 1;  //中位数对比每一行的最后一个数,如果比arr[i][col - 1]大,则直接进入下一行对比
        i++;
      } else {
        j--;  //如果中位数比当前行最后一个数小且比上一行大,则在当前行倒序遍历
      }
    }
    //遍历完后得到count,判断当前弄出的中位数第几小是不是大于指定k
    return count >= k;
  }
  
  // 二分查找
  while (left < right) {
    let mid = left + ((right - left) >> 1);  //第一步  找到中位数
    if (isValid(mid, k, matrix, row, col)) {  //如果当前k值比当前中位数小,则右侧数减小
      right = mid;
    } else {
      left = mid + 1;//如果当前k值比当前中位数小,左侧数在中位数的基础上+1
    }
  }
  
  return left;
};

拓展:

二分查找法:折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值