LeetCode 1387. 將整數按權重排序(記憶化、遞歸)

將整數按權重排序
迷之標籤、迷之測試數據
記錄一下中間的計算結果就行。

class Solution {
public:
    unordered_map<int,int> vis;
    struct Node{
        int v,x;
        Node(int v,int x):v(v),x(x){}
        bool operator<(const Node &b){
            return v<b.v || (v==b.v && x<b.x);
        }
    };
    int getKth(int lo, int hi, int k) {

        vector<Node> res;  
        for(int i=lo;i<=hi;i++){
            res.push_back(Node(getStep(i),i));
        }
        sort(res.begin(),res.end());
        return res[k-1].x;
    }
    int getStep(int x){
        int step = 0;
        while(x!=1){
            if(  vis.count(x) ){
                return step+vis[x];
            }
            if(x&1){
                x = x*3+1;
            }else{
                x>>=1;
            }
            step++;
        }
        vis[x] = step;
        return step;
    }
};

更簡潔的寫法。

class Solution {
public:
    unordered_map<int,int> vis;
    int getStep(int x){
        if(vis.count(x)) return vis[x];
        if(x==1) return 0;
        if(x&1) return vis[x]=getStep(3*x+1)+1;
        return vis[x]=getStep(x>>1)+1;
    }
    int getKth(int lo, int hi, int k) {
        vector<pair<int,int>> res;
        for(int i=lo;i<=hi;i++){
            res.push_back(make_pair(getStep(i),i));
        }
        sort(res.begin(),res.end());
        return res[k-1].second;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章