关闭

378. Kth Smallest Element in a Sorted Matrix

标签: LeetCode
64人阅读 评论(0) 收藏 举报
分类:

Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth smallest element in the matrix.

Note that it is the kth smallest element in the sorted order, not the kth distinct element.

Example:

matrix = [
   [ 1,  5,  9],
   [10, 11, 13],
   [12, 13, 15]
],
k = 8,

return 13.

Note: 
You may assume k is always valid, 1 ≤ k ≤ n2.

思路:

使用PriorityQueue进行优先级排序,由于矩阵每行每列都是递增,所以每次往PriorityQueue中添加右边和下面一位的数字

    public int kthSmallest(int[][] matrix, int k) {
        int m = matrix.length;
	if (m == 0)
		return 0;
	int n = matrix[0].length;
	int cnt = 0;
	boolean[][] used = new boolean[m][n];
	PriorityQueue<kthsNode> heap = new PriorityQueue<kthsNode>();
	heap.add(new kthsNode(0, 0, matrix[0][0]));
	used[0][0] = true;
	kthsNode node = null;
	int[] xoff = { 0, 1 };
	int[] yoff = { 1, 0 };
	while (cnt < k) {
		node = heap.poll();
		int x = node.x;
		int y = node.y;
		for (int i = 0; i < 2; i++) {
			int xx = x + xoff[i];
			int yy = y + yoff[i];
			if (xx >= 0 && xx < m && yy >= 0 && yy < n && !used[xx][yy]) {
				used[xx][yy] = true;
				heap.add(new kthsNode(xx, yy, matrix[xx][yy]));
			}
		}
		cnt++;
	}
	return node.val;
    }
    static class kthsNode implements Comparable<kthsNode> {
	int x, y;
	int val;
	public kthsNode(int x, int y, int val) {
		this.x = x;
		this.y = y;
		this.val = val;
		// TODO Auto-generated constructor stub
	}

	@Override
	public int compareTo(kthsNode o) {
		// TODO Auto-generated method stub
		return val - o.val;
	}



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:37135次
    • 积分:555
    • 等级:
    • 排名:千里之外
    • 原创:177篇
    • 转载:21篇
    • 译文:0篇
    • 评论:4条
    文章分类
    最新评论