1387. 将整数按权重排序
我们将整数 x 的 权重 定义为按照下述规则将 x 变成 1 所需要的步数:
如果 x 是偶数,那么 x = x / 2 如果 x 是奇数,那么 x = 3 * x + 1 比方说,x=3 的权重为 7 。因为 3
需要 7 步变成 1 (3 --> 10 --> 5 --> 16 --> 8 --> 4 --> 2 --> 1)。给你三个整数 lo, hi 和 k 。你的任务是将区间 [lo, hi] 之间的整数按照它们的权重 升序排序 ,如果大于等于 2 个整数有
相同 的权重,那么按照数字自身的数值 升序排序 。请你返回区间 [lo, hi] 之间的整数按权重排序后的第 k 个数。
注意,题目保证对于任意整数 x (lo <= x <= hi) ,它变成 1 所需要的步数是一个 32 位有符号整数。
思路
建立 vector<pair<int,int> >ans;进行映射;
重写sort函数,
建立 函数func() 返回每个数的权重
代码
class Solution {
int func(int m){
if(m==1) return 0;
if(m%2==0) return func(m/2)+1;
else return func(3*m+1)+1;
}
static bool cmp(pair<int,int> a,pair<int,int> b){ //重写sort
if(a.second<b.second) return true;
else if(a.second==b.second) {
if(a.first<b.first) return true;
else return false;
}
else return false;
}
public:
int getKth(int lo, int hi, int k) {
vector<pair<int,int> > ans;
for(int i=lo;i<=hi;i++){
ans.push_back(pair(i,func(i)));
}
sort(ans.begin(),ans.end(),cmp);
return ans[k-1].first;
}
};