Leetcode:378. Kth Smallest Element in a Sorted Matrix

題目: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. 單獨設立一個list,每次從裏面篩選最小值出棧。(簡單的把它稱爲「棧」)對於第一列,但不是最後一行的元素出棧,則將它右邊和下面的元素進棧。
  2. 第一列可是最後一行的元素出棧,則將它右邊元素進棧。
  3. 對於非第一列元素,若是又不是最後一列,則將它右邊元素進棧。對於非第一列可是最後一列的元素出棧,則什麼都不作(即每行最後一個元素)。
  4. 00位置必定是第一個最小值,那麼對於k>1的狀況初始化01,10位置進list開始在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;
}
相關文章
相關標籤/搜索