有序矩阵中第K小的元素Scala实现

 

 

 


前言

运用Scala中的语法实现有序矩阵中第K小的元素


 

一、有序矩阵中第K小的元素是什么?

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

示例:

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

返回 13。

二、具体实现

代码如下(示例):

这就是二分法的思路。假定查找的范围为[left, right],首先计算int mid = left + (right - left) / 2,
 然后在矩阵中计数有多少个元素小于等于mid,这个数量为count。
如果count < k,那么第k小的数至少为mid + 1,所以left = mid + 1。
反之,right = mid。
循环结束的条件为left >= right,此时left即为答案。


def kthSmallest(matrix: Array[Array[Int]], k: Int): Int = {
  val len=matrix.length-1
  //二分法的思路。假定查找的范围为[left, right]
  var left=matrix(0)(0)//left的初始值为数组中的最小值
  var right=matrix(len)(len)//right的初始值为数组中的最大值
  while (left < right){
    val mid=left+(right-left)/2
    val count=countNotMoreThanMid(matrix, mid, len);//统计多少个数小于mid
    if (count < k)//如果count < k,那么第k小的数至少为mid + 1,所以left = mid + 1。
      left=mid+1
    else//反之,第k小的数最多为mid + 1,right = mid。
      right=mid
  }
  left
}
def countNotMoreThanMid(matrix: Array[Array[Int]], mid: Int, len: Int)={
  var count = 0
  var i=0
  var j=len
  //从左下角开始找
  while (i<=len && j>=0)
    if(matrix(i)(j) <= mid){//如何mid值大于当前值,肯定大于当前值所在列的前j行值
      count += j + 1;//count=j+1
      i+=1//往右移动一列
    }else{
      j-=1如何mid值小于当前值,往上移动一行
    }
  count
}

例如 mid=8:

我们可以看到,矩阵中大于 midmid 的数就和不大于 midmid 的数分别形成了两个板块,沿着一条锯齿线将这个矩形分开。其中左上角板块的大小即为矩阵中不大于 midmid 的数的数量。

 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值