378. 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 kth smallest element in the matrix.

Note that it is the kth smallest element in the sorted order, not the kth distinct element.


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

return 13.

行列都是有序的,有两个方法。一是二分查找,二是维护K个元素一个小根堆

二分查找我琢磨了2天,主要是最后的循环条件那里卡壳,需要归纳法论证。

class Solution
{
public:
	int kthSmallest(vector<vector<int>>& matrix, int k)
	{
		int n = matrix.size();
		int le = matrix[0][0], ri = matrix[n - 1][n - 1];
		int mid = 0;
		while (le < ri)
		{
			mid = (le + ri) >> 1;
			int num = 0;
			for (int i = 0; i < n; i++)
			{
				int pos = upper_bound(matrix[i].begin(), matrix[i].end(), mid) - matrix[i].begin();
				num += pos;
			}
			if (num < k)
			{
				le = mid + 1;
			}
			else
			{
				ri = mid;
			}
		}
		return le;
	}
};


这个算法之前我就有疑惑,如何确保le在数组中?

论证:   第k小的数一定是在left 和right之间:即 left<= answer <= right

循环结束的条件必定是 left >= right

left <= answer <= right and left>=right  means left==answer==right

那么,换个角度思考

我们要的答案是kth. 

kth必定是大于left(matrix[0][0]),小于right的(matrix[n-1][n-1])

即在[left,right]区间,循环不断调整left,和right的值,使他们不断接近最后等于kth的时候,也就找到了kth具体是哪个数。

另外核心代码段:


if(count<k){

left = mid +1;

}

else{

right = mid;

}




第二种方法是堆排序,用python吧,相对简单:

import heapq
class Solution(object):
    def kthSmallest(self, matrix, k):
        return list(heapq.merge(*matrix))[k-1]



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值