1. 程式人生 > >leetcode_378. Kth Smallest Element in a Sorted Matrix_堆的應用

leetcode_378. Kth Smallest Element in a Sorted Matrix_堆的應用

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.

 

矩陣元素按行按列遞增有序,將matr[0][0]元素壓進堆中,然後進行k-1次下面操作:

  取堆頂元素,將其在矩陣中的右邊和下邊的元素入堆,pop堆頂元素。

最後堆頂元素即是第k小的數。

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;

struct Node
{
    
int x,y,num; Node(int a,int b,int c) { x=a; y=b; num=c; } bool operator < (const Node& x)const { return num>x.num; } }; class Solution { public: int kthSmallest(vector<vector<int> >& matrix, int k) { int
len=matrix.size(); bool inheap[1000][1000]; memset(inheap,0,sizeof(inheap)); priority_queue<Node> heap; heap.push(Node(0,0,matrix[0][0])); for(int i=0; i<k-1; i++) { Node now=heap.top(); if(now.x<len-1&&inheap[now.x+1][now.y]==0) { heap.push(Node(now.x+1,now.y,matrix[now.x+1][now.y])); inheap[now.x+1][now.y]=1; } if(now.y<len-1&&inheap[now.x][now.y+1]==0) { heap.push(Node(now.x,now.y+1,matrix[now.x][now.y+1])); inheap[now.x][now.y+1]=1; } heap.pop(); } return heap.top().num; } };