题目描述
返回所有长度为N且满足其每两个连续位上的数字之间的差绝对值为K的非负整数。
请注意,除了数字0本身之外,答案中的每个数字都不能有前导零。例如,01因为有一个前导零,所以是无效的;但是0是有效的
你可以按任何顺序返回答案。
示例1
输入:N = 3,K = 7
输出:[181,292,707,818,929]
解释:注意,070不是一个有效的数字,因为它有前导零
示例2
输入:N = 2,K = 1
输出:[10,12,21,23,32,34,43,45,54,56,65,67,76,89,98]
提示:
- 1 <= N <= 9
- 0 <= K <= 9
解题思路
第一位可能是1-9,所以外层有一个循环,假设第idx位为pre,那么第idx+1位可能是pre+K或则pre-K,确定第idx+1位pre'之后,第idx+2位也可能是pre'+K或则pre‘-K,.....直到第N-1位为止。
set<int> st;
int n,k;
bool judge(int x){
return x>=0 && x<=9;
}
void fun(int nowN,int nown,int pre){
if(nowN == n-1){
st.insert(nown);
return;
}
if(judge(pre+k)){
fun(nowN+1,nown*10 + pre+k,pre+k);
}
if(judge(pre-k)){
fun(nowN+1,nown*10 + pre-k,pre-k);
}
}
vector<int> numsSameConsecDiff(int N, int K) {
vector<int> ans;
set<int>::iterator it;
n = N;k = K;
if(N == 1) ans.push_back(0);
for(int i=1;i<=9;i++){
int pre = i;
fun(0,i,pre);
}
for(it=st.begin();it!=st.end();it++) ans.push_back(*it);
return ans;
}
上面是自己写的代码,虽然能通过但是运行时间值超过0.89%其他程序。下面是参考的8ms代码
vector<int> ans;
void dfs(int cur,int dep,int sum,int k,int n)
{
if(dep==n)
{
ans.push_back(sum);
return;
}
if(cur+k<10) dfs(cur+k,dep+1,sum*10+cur+k,k,n);
if(cur-k>=0) dfs(cur-k,dep+1,sum*10+cur-k,k,n);
}
vector<int> numsSameConsecDiff(int N, int K)
{
if(N==1)
{
vector<int> res;
for(int i=0;i<10;i++)
res.push_back(i);
return res;
}
for(int i=1;i<10;i++)
dfs(i,1,i,K,N);
sort(ans.begin(),ans.end());
ans.erase(unique(ans.begin(),ans.end()),ans.end());
return ans;
}