Leetcode刷题100天—378. 有序矩阵中第 K 小的元素(优先队列)—day16

Posted 神的孩子都在歌唱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode刷题100天—378. 有序矩阵中第 K 小的元素(优先队列)—day16相关的知识,希望对你有一定的参考价值。

前言:

作者:神的孩子在歌唱

大家好,我叫运智

给你一个 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
  • -109 <= matrix[i][j] <= 109
  • 题目数据 保证 matrix 中的所有行和列都按 非递减顺序 排列
  • 1 <= k <= n2

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-smallest-element-in-a-sorted-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

package 优先队列;

import java.util.Comparator;
import java.util.PriorityQueue;
/*
 * 4
 * https://leetcode-cn.com/problems/kth-smallest-element-in-a-sorted-matrix/
 */
public class _378_有序矩阵中第K小的元素 {
	public int kthSmallest(int[][] matrix, int k) {
		
		int[] n;
		 
        int len = 0;
        // 计算一维数组长度
        for (int[] element : matrix) {
            len += element.length;
        }
        // 复制元素
        n = new int[len];
        int index = 0;
        for (int[] element : matrix) {
            for (int element2 : element) {
                n[index++] = element2;
            }
        }
//        通过优先队列存入数据
        PriorityQueue<Integer> queue=new PriorityQueue<>(new Comparator<Integer>() {
        	public int compare(Integer o1,Integer o2) {
				return o2-o1;//大顶堆
			}
        });
//        for循环入栈
        for(int i=0;i<k;i++) {
        	queue.offer(n[i]);
        }
//        在for循环判断
        for(int i=k;i<n.length;i++) {
        	if (queue.peek()>n[i]) {
				queue.poll();
				queue.offer(n[i]);
			}
        }
        return queue.peek();
	}
	
//  方法二:效率有点底
//  for (int[] nums:matrix){
//      for(int num:nums) {
//      	if(queue.size()>=k) {
//      		if (queue.peek()>num) {
//  				queue.poll();
//  				queue.offer(num);
//  			}
//      	}else {
//      		queue.offer(num);
//      	}
//      }
//  }
//可以通过优先队列中的大顶堆判断
	public static void main(String[] args) {

	}

}

本人csdn博客:https://blog.csdn.net/weixin_46654114

转载说明:跟我说明,务必注明来源,附带本人博客连接。

以上是关于Leetcode刷题100天—378. 有序矩阵中第 K 小的元素(优先队列)—day16的主要内容,如果未能解决你的问题,请参考以下文章

leetcode刷题记录——数组与矩阵

[leetcode]378. 有序矩阵中第K小的元素

Leetcode-378 有序矩阵中的第k小元素

leetcode.矩阵.378有序矩阵中第K小的元素-Java

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

Leetcode刷题100天—566. 重塑矩阵(数组)—day25