378_有序矩阵中第K小的元素

简介: 378_有序矩阵中第K小的元素

378_有序矩阵中第K小的元素

 

package 队列.优先级队列;
import java.util.Comparator;
import java.util.PriorityQueue;
/**
 * https://leetcode-cn.com/problems/kth-smallest-element-in-a-sorted-matrix/
 * 其中每行和每列元素均按升序排序
 * 
 * @author Huangyujun
 *
 */
public class _378_有序矩阵中第K小的元素 {
    // 优先队列
    // 方法二:优先队列
    /**
     * 思路一:先在大根堆组里放上k 个数,然后遍历后边所有数据,数据 小于堆顶,替换到k个数里,然后,最后可以得到的是 不断地用小的数去替换,这k个数据变成了小数组
     * @param matrix
     * @param k
     * @return
     */
    public int kthSmallest1(int[][] matrix, int k) {
        PriorityQueue<Integer> pQueue = new PriorityQueue<Integer>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2 - o1; // 注意java中 升序是 o1 - o2【小根堆】, 降序才是 o2 - o1【大根堆】
            }
        });
        int len = matrix[0].length;
        for (int i = 0; i < len; i++) {
            for (int j = 0; j < len; j++) {
                if (pQueue.size() < k) {
                    pQueue.add(matrix[i][j]);
                } else if ( matrix[i][j] < pQueue.peek()) {
                    pQueue.remove();
                    pQueue.add(matrix[i][j]);
                }
            }
        }
        return pQueue.peek();
    }
    /**
     * 思路二:就是量到了k 之后,进来调整,然后poll掉一个最小的【最后留下的也肯定是最大的那些数据呀】
     * @param matrix
     * @param k
     * @return
     */
    public int kthSmallest(int[][] matrix, int k) { 
        //大根堆
          PriorityQueue<Integer> queue = new PriorityQueue<>((o1, o2) -> o2 - o1);
        int len = matrix[0].length;
        for (int i = 0; i < len; i++) {
            for (int j = 0; j < len; j++) {
                //先直接放入数据的,然后 不断地poll,最终留下的数据就是最大组那批数据啦
                queue.add(matrix[i][j]);
                if (queue.size() > k) {
                    queue.poll();
                }
            }
        }
        return queue.peek();
    }
}



目录
相关文章
|
6月前
|
存储 人工智能 Java
【线性表 - 数组和矩阵】
int[][] reshapedNums = new int[r][c]; int index = 0; for (int i = 0; i < r; i++) { for (int j = 0; j < c; j++) { reshapedNums[i][j] = nums[index /
|
6月前
|
算法 测试技术 Serverless
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素
【二分查找】【C++算法】378. 有序矩阵中第 K 小的元素
|
6月前
|
算法
|
6月前
leetcode-378:有序矩阵中第 K 小的元素
leetcode-378:有序矩阵中第 K 小的元素
38 0
|
11月前
|
算法 测试技术 C++
C++二分查找算法:有序矩阵中的第 k 个最小数组和(一)
C++二分查找算法:有序矩阵中的第 k 个最小数组和
|
11月前
|
算法 测试技术 C#
C++二分查找算法:有序矩阵中的第 k 个最小数组和(二)
C++二分查找算法:有序矩阵中的第 k 个最小数组和
|
人工智能
有序序列中插入一个整数
有序序列中插入一个整数
81 0
|
网络架构 Python
矩阵各行元素之和
矩阵各行元素之和
95 0
R7-5 求矩阵各行元素之和
R7-5 求矩阵各行元素之和
106 0
7-234 两个有序序列的中位数
7-234 两个有序序列的中位数
114 0