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

题目:
给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。
请注意,它是排序后的第k小元素,而不是第k个元素。
示例:
matrix = [
[ 1, 5, 9],
[10, 11, 13],
[12, 13, 15]
],
k = 8,

返回 13。
说明:
你可以假设 k 的值永远是有效的, 1 ≤ k ≤ n2 。

学习,代码来自leetcode评论

public class Solution {
    public int kthSmallest(int[][] matrix, int k) {
        int n = matrix.length;
        PriorityQueue<Tuple> pq = new PriorityQueue<Tuple>();//优先级队列
        
        //x是[] y是[][y]
        for(int j = 0; j <= n-1; j++) pq.offer(new Tuple(0, j, matrix[0][j]));//把matrix[0](第一行)中的元素都放进去
        
        for(int i = 0; i < k-1; i++) { //imax=k-2
            Tuple t = pq.poll(); //把队列中排序好的元素取出最大值来,第一次应该是matrix[0][n-1]
            if(t.x == n-1) continue; //当取出来的元素是最后一行的时候,返回循环不继续执行
            
            pq.offer(new Tuple(t.x+1, t.y, matrix[t.x+1][t.y]));// 放进去一个元素,该元素的行数=取出来的行数+1,列数相等;
        }
        return pq.poll().val;
    }
}
//定义一个新的类,包含它的行列坐标和它的值
class Tuple implements Comparable<Tuple> {
    int x, y, val;
    public Tuple (int x, int y, int val) {
        this.x = x;
        this.y = y;
        this.val = val;
    }
    
    @Override
    public int compareTo (Tuple that) {
        return this.val - that.val; //学习
    }
}

使用下图便于理解,当我们要想确认?(k)处为第K个最小的值的时候,我们能确定打勾的地方都是比它小的。现在我们只需确认?部分比?(k)小的个数就能确认?(k)处的K值是多少。
下面的代码保证了,
(1)取出来的值如果还未取到?(K)处则?处一定比它小,直到加进去的值比?(K)处 大才不会在取出?(K)之前取出来;
(2)右上部分同理;

Tuple t = pq.poll(); //把队列中排序好的元素取出最大值来,第一次应该是matrix[0][n-1]
if(t.x == n-1) continue; //当取出来的元素是最后一行的时候,返回循环不继续执行
            
pq.offer(new Tuple(t.x+1, t.y, matrix[t.x+1][t.y]));// 放进去一个元素,该元素的行数=取出来的行数+1,列数相等;

猜你喜欢

转载自blog.csdn.net/Fishandbearspaw/article/details/89054397