將整數按權重排序
迷之標籤、迷之測試數據
記錄一下中間的計算結果就行。
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;
}
};