【回溯】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(...)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章