題目:node
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.ios
Note that it is the kth smallest element in the sorted order, not the kth distinct element.算法
Example:spa
matrix = [ [ 1, 5, 9], [10, 11, 13], [12, 13, 15] ], k = 8, return 13.
給了一個n×n的矩陣,每行、每列都是遞增的,要咱們找出最小的第k個值。注意:容許重複數字。(原本還想用set的這下不行了。。。老老實實用了list)
方法:
沒用高級算法,勝在思路簡單。。。先思考寫出了一個可行版本。
方法關鍵在於:
注意:矩陣只有1個元素,和k=1兩種特殊狀況。blog
代碼:element
#include <iostream> #include <algorithm> #include <list> using namespace std; typedef struct node { int row; int lie; int data; }node; node popMin(list<node> & compare){ auto iter=compare.cbegin(); node min; min=(*iter); while (iter!=compare.cend()) { if (min.data>(*iter).data) { min=(*iter); } iter++; } //當前最小值出棧 iter=compare.cbegin(); while (iter!=compare.cend()) { if ((*iter).data==min.data) { compare.erase(iter); break; } iter++; } //返回最小值,信息包括:最小值data,最小值位於行、列 return min; } int main(int argc, const char * argv[]) { vector<vector<int>> matrix={{1,2},{1,3}}; //矩陣的行列值 auto matrixRow=matrix.size(); auto matrixLie=matrix[0].size(); list<node>compare; int k=1; int count=1; node min; int ans=0;//返回第k小元素 if (matrixRow>1) { //初始化compare雙向鏈表 node tempnode; tempnode.data=matrix[0][1]; tempnode.row=0; tempnode.lie=1; compare.push_back(tempnode); tempnode.data=matrix[1][0]; tempnode.row=1; tempnode.lie=0; compare.push_back(tempnode); if(1<k){ while (count<k) { min=popMin(compare); count++;//每找到一個最小值,count+1 //第一列 if(min.lie==0){ if (min.row<matrixRow-1) {//非最後一行 //下邊入棧 tempnode.data=matrix[min.row+1][min.lie]; // cout<<tempnode.data<<endl; tempnode.row=min.row+1; tempnode.lie=min.lie; compare.push_back(tempnode); //右邊入棧 tempnode.data=matrix[min.row][min.lie+1]; // cout<<tempnode.data<<endl; tempnode.row=min.row; tempnode.lie=min.lie+1; compare.push_back(tempnode); }else if(min.row==matrixRow-1){//最後一行 //右邊入棧 tempnode.data=matrix[min.row][min.lie+1]; // cout<<tempnode.data<<endl; tempnode.row=min.row; tempnode.lie=min.lie+1; compare.push_back(tempnode); } }else{//非第一列 if (min.lie<matrixLie-1) {//非最後一列 //右邊入棧 tempnode.data=matrix[min.row][min.lie+1]; // cout<<tempnode.data<<endl; tempnode.row=min.row; tempnode.lie=min.lie+1; compare.push_back(tempnode); }else if (min.lie==matrixLie-1){//一列 //沒有能夠入棧的 continue; } } } ans=min.data; }else if(k==1){ ans=matrix[0][0]; } }else{ ans=matrix[0][0]; } cout<<ans<<endl; return 0; }