【回溯】B010_LC_连续差相同的数字(构造)

一、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;
    }
};

复杂度分析

  • 时间复杂度:O(2N)O(2^N)
  • 空间复杂度:O(...)O(...)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章