题目:
如果一个整数上的每一位数字与其相邻位上的数字的绝对差都是 1,那么这个数就是一个「步进数」。
例如,321 是一个步进数,而 421 不是。
给你两个整数,low 和 high,请你找出在 [low, high] 范围内的所有步进数,并返回 排序后 的结果。
输入:low = 0, high = 21 输出:[0,1,2,3,4,5,6,7,8,9,10,12,21]
这一题,刚开始我以为是状态转移,其实应该是dfs,比如【1245,4555】这个区间,
那么我从1000开始,深度搜索下去无非就是1200 和1000;然后1200可以转向12300 和 12100,然后1000 可以转向 10100 ;
因此每次刚开始,我就是先判断low的位数,然后从1*pow(10,low的位数) 开始,开始深度搜索;然后加上边界条件;
这里有可能会溢出;
//不使用long long signed int 会溢出
class Solution {
public:
void push(long long signed int num,int a,long long int b,vector<int> &res,long long signed int lo,long long signed int hi)
{
if(b!=0){
if((a+1)<=9&&(long long signed int)(num+(a+1)*b)<=hi) push(num+(a+1)*(b),a+1,b/10,res,lo,hi);
//注意这里,为什么num+(a-1)*b不加边界条件>=lo;因为可能刚开始是小于lo的;
//但是累加到个位数,以后就是大于lo的;所以这里不能加边界条件
if((a-1)>=0) push(num+(a-1)*(b),a-1,b/10,res,lo,hi);
}
else {
if(num<=hi&&num>=lo) res.push_back(num);
return ;
}
}
vector<int> countSteppingNumbers(int low, int high) {
long long signed int a=0;
string min=to_string(low);
int b=low;
int i=min.size()-1; //先判断区间的最低位数,然后从1*pow(10,i)开始DFS
vector<int> res;
if(low==0) res.push_back(0); //0的话,单独加上
long long signed int k=0;
while(pow(10,i)<=high)
{
a=pow(10,i);
for(int j=1;j<10;++j)
{
k=(long long signed int)j*a;
if(k>high) break;
push(k,j,a/10,res,low,high);
}
++i;
}
sort(res.begin(),res.end());
return res;
}
};