标签:双向 实用 compare stream 双向链表 方法 find argv data
题目:
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.
给了一个n×n的矩阵,每行、每列都是递增的,要我们找出最小的第k个值。注意:允许重复数字。(本来还想用set的这下不行了。。。老老实实用了list)
方法:
没用高级算法,胜在思路简单。。。先思考写出了一个可行版本。
方法关键在于:
注意:矩阵只有1个元素,和k=1两种特殊情况。
代码:
#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; }
Leetcode:378. Kth Smallest Element in a Sorted Matrix
标签:双向 实用 compare stream 双向链表 方法 find argv data
原文地址:http://www.cnblogs.com/candybread/p/6023596.html