给定一个 n x n
矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k
小的元素。
请注意,它是排序后的第 k
小元素,而不是第 k
个不同的元素。
Example:
matrix = [ [ 1, 5, 9], [10, 11, 13], [12, 13, 15] ], k = 8, ouput: 13
class Solution { int xTurn[2]= {0,1}; int yTurn[2]= {1,0}; bool vis[1005][1005]; priority_queue<int,vector<int>,less<int> > MaxQue; queue<pair<int, int> > que; public: int kthSmallest(vector<vector<int>>& matrix, int k) { int n = matrix.size(); //n = sqrt(n); bfs(matrix, k, n); int ans = MaxQue.top(); return ans; } void bfs(vector<vector<int>>& Map, int k, int n) { init(); int x = 0; int y = 0; int num = Map[x][y]; //最小的元素 if (! que.empty()) que.pop(); que.push(make_pair(x, y)); if (! MaxQue.empty()) MaxQue.pop(); MaxQue.push(num); vis[x][y] = true; while (! que.empty()) { pair<int, int> temp = que.front(); que.pop(); int ux = temp.first; int uy = temp.second; for (int i = 0; i< 2; i ++) { int tx = ux+ xTurn[i]; int ty = uy+ yTurn[i]; if (tx< 0|| tx>= n) continue; if (ty< 0|| ty>= n) continue; if (vis[tx][ty]) continue; vis[tx][ty] = true; int tempNum = Map[tx][ty]; if (MaxQue.size()< k) { MaxQue.push(tempNum); que.push(make_pair(tx,ty)); } else { if (MaxQue.top()> tempNum) { MaxQue.pop(); MaxQue.push(tempNum); que.push(make_pair(tx,ty)); } } } } } void init() { for (int i= 0; i < 1001; i ++) { for (int j= 0; j < 1001; j ++) { vis[i][j] = false; } } } };