一、Problem
返回所有長度爲 N 且滿足其每兩個連續位上的數字之間的差的絕對值爲 K 的非負整數。
請注意,除了數字 0 本身之外,答案中的每個數字都不能有前導零。例如,01 因爲有一個前導零,所以是無效的;但 0 是有效的。
你可以按任何順序返回答案。
輸入:N = 3, K = 7
輸出:[181,292,707,818,929]
解釋:注意,070 不是一個有效的數字,因爲它有前導零。
提示:
1 <= N <= 9
0 <= K <= 9
二、Solution
方法一:回溯
N、K 都很小,所以可以直接用搜索做,這裏不必用字符串去拼接字符,因爲數字的位數是在遞增的,記錄最後一位枚舉到的數字,以及直接用乘法和加法構造數字
注意這裏所說的是絕對值差,所以:
- 當 k = 0 時,dig + k 和 dig - k 會產生同樣的數字,所以爲了防止重複,可以在兩個分支之一加上 k > 0 的判斷
class Solution {
public:
vector<int> ans;
int n, k;
void dfs(int idx, int dig, int num) {
if (idx == n) {
ans.push_back(num);
return;
}
if (dig + k < 10) dfs(idx+1, dig+k, num*10 + dig+k);
if (k > 0 && dig - k >= 0) dfs(idx+1, dig-k, num*10 + dig-k);
}
vector<int> numsSameConsecDiff(int N, int K) {
if (N == 1)
return {0, 1, 2, 3, 4,5,6,7,8,9};
n = N; k = K;
for (int i = 1; i < 10; i++)
dfs(1, i, i);
return ans;
}
};
複雜度分析
- 時間複雜度:,
- 空間複雜度:,