1.题目
LeetCode: 378. 有序矩阵中第 K 小的元素
【medium】
给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。
请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素。
示例 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
- − 1 0 9 < = m a t r i x [ i ] [ j ] < = − 1 0 9 -10^9 <= matrix[i][j] <= -10^9 −109<=matrix[i][j]<=−109
- 题目数据 保证 matrix 中的所有行和列都按 非递减顺序 排列
- 1 < = k < = n 2 1 <= k <= n^2 1<=k<=n2
2.解题
方法一:直接法
将二维数组放入一维数组中进行排序取k-1的值即可。
java
class Solution {
public int kthSmallest(int[][] matrix, int k) {
int m = matrix.length, n = matrix[0].length;
int[] res = new int[m * n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
res[j + i * m] = matrix[i][j];
}
}
Arrays.sort(res);
return res[k - 1];
}
}
时间复杂度: O ( n 2 l o g n ) , 对 n 2 个 数 排 序 O(n^2logn),对 n^2个数排序 O(n2logn),对n2个数排序。
空间复杂度: O ( n 2 ) , 一 维 数 组 需 要 存 储 这 n 2 个 数 O(n^2),一维数组需要存储这 n^2个数 O(n2),一维数组需要存储这n2个数。
*方法二:二分法
java:
class Solution {
public int kthSmallest(int[][] matrix, int k) {
int m = matrix.length, n = matrix[0].length;
int l = matrix[0][0], h = matrix[m - 1][n - 1];
while (l <= h) {
int mid = l + (h - l) / 2;
int count = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n && matrix[i][j] <= mid; j++) {
count++;
}
}
if (count < k) l = mid + 1;
else h = mid - 1;
}
return l;
}
}
时间复杂度: O ( n log ( h − l ) ) , 二 分 查 找 进 行 次 数 为 O ( log ( h − l ) ) , 每 次 操 作 时 间 复 杂 度 为 O ( n ) O(n\log(h-l)),二分查找进行次数为 O(\log(h-l)),每次操作时间复杂度为 O(n) O(nlog(h−l)),二分查找进行次数为O(log(h−l)),每次操作时间复杂度为O(n)。
空间复杂度:O(1)。