【leetcode】#378. 有序矩阵中第 K 小的元素

题目

leetcode
英文
Given an n x n matrix where each of the rows and columns are sorted in ascending order, return the kth smallest element in the matrix.

Note that it is the kth smallest element in the sorted order, not the kth distinct element.
中文
给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。
请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素。

示例

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

函数

int kthSmallest(int** matrix, int matrixSize, int* matrixColSize, int k){
}

分析

240 Search a 2D Matrix II 有点类似。画图研究了一下官方给的二分法,看懂大概思想就开始自己动手实现,计数 count 等于 k 时就结束,返回 mid……
结果当然是错了。。。

错误示例
输入:[[1,5,9],[10,11,13],[12,13,15]],k = 8;
预期输出:13
实际输出:8

然后开始一步一步的推导,left, mid, right……终于明白了当 count == k 时,只能说明 第 k 小的数小于等于 mid,这时需要缩小区间,这个视频讲得比较清楚
在这里插入图片描述

实现

int kthSmallest(int** matrix, int matrixSize, int* matrixColSize, int k){
	int n = matrixSize;
	int left = matrix[0][0], right = matrix[n-1][n-1];
	while (left < right){
		int mid = (left + right) / 2;
		int i = n-1, j = 0;
		int count = 0;
		while (i >= 0 && j < n){
			if (matrix[i][j] <= mid){
				count += i + 1;
				j++;
			}else{
				i--;
			}
		}
		if (count >= k){
			right = mid;
		}else{
			left = mid + 1;
		}
	}
	return left; // 这里。。
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值