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();
    }
}

 

posted @ 2021-12-19 23:39  一乐乐  阅读(26)  评论(0编辑  收藏  举报