leetcode378(有序矩阵中第K小的元素)--Java语言实现

拈花ヽ惹草 提交于 2020-08-16 05:18:10

求:

给定一个 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、二分查找

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!