将整数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个数。
class Solution
{
public:
int weight[1000010];//记忆化数组
int get(int i)
{
//计算权重
if(i==1) return 0;
if(weight[i]!=-1) return weight[i];//若计算过直接返回
return weight[i]= i&1 ? get(3*i+1)+1 : get(i/2)+1;
}
int getKth(int lo,int hi,int k)
{
memset(weight,-1,sizeof(weight));//表示未计算过
vector<pair<int,int>> ans;
for(int i=lo;i<=hi;i++)
{
ans.push_back({get(i),i});
}
sort(ans.begin(),ans.end());
return ans[k-1].second;
}
};