求:
给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。
请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素。
示例:
matrix = [
[ 1, 5, 9],
[10, 11, 13],
[12, 13, 15]
],
k = 8,
返回 13。
提示:
你可以假设 k 的值永远是有效的,1 ≤ k ≤ n2
题目链接: https://leetcode-cn.com/problems/kth-smallest-element-in-a-sorted-matrix/
解:
1、堆排序
最常规的做法就是遍历二维数组,将二维数组中的元素依次放入一个最小堆中。然后再从最小堆中弹出k次元素,最后返回的就是矩阵中的第k小。
这种做法没有利用矩阵的任何性质,所以时间、空间复杂度是最差的。
时间复杂度:O(n^2logk) //对n^2个数进行排序
空间复杂度:O(n^2)
public int kthSmallest(int[][] matrix, int k) { Queue<Integer> q = new PriorityQueue<>(); int n = matrix.length; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { q.offer(matrix[i][j]); } } for (int i = 0; i < k - 1; i++) q.remove(); return q.remove(); }
2、直接排序
时间复杂度:O(n^2logk) //对n^2个数进行排序
空间复杂度:O(n^2)
public int kthSmallest(int[][] matrix, int k) { int N = matrix.length; int t=0; int ret[] = new int[N*N]; for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ ret[t++] = matrix[i][j]; } } Arrays.sort(ret); return ret[k-1]; }
3、归并排序
4、二分查找
来源:oschina
链接:https://my.oschina.net/u/4469818/blog/4331913