68
68
69
69
<!-- solution:start -->
70
70
71
- ### 方法一
71
+ ### 方法一:DFS
72
+
73
+ 我们可以枚举所有长度为 $n$ 的数字的第一个数字,然后使用深度优先搜索的方法,递归地构造所有符合条件的数字。
74
+
75
+ 具体地,我们首先定义一个边界值 $\textit{boundary} = 10^{n-1}$,表示我们需要构造的数字的最小值。然后,我们从 $1$ 到 $9$ 枚举第一个数字,对于每一个数字 $i$,我们递归地构造以 $i$ 为第一个数字的长度为 $n$ 的数字。
76
+
77
+ 时间复杂度 $(n \times 2^n \times |\Sigma|)$,其中 $|\Sigma|$ 表示数字集合,本题中 $|\Sigma| = 9$。空间复杂度 $O(2^n)$。
72
78
73
79
<!-- tabs:start -->
74
80
@@ -77,50 +83,51 @@ tags:
77
83
``` python
78
84
class Solution :
79
85
def numsSameConsecDiff (self , n : int , k : int ) -> List[int ]:
80
- ans = []
81
-
82
- def dfs (n , k , t ):
83
- if n == 0 :
84
- ans.append(t)
86
+ def dfs (x : int ):
87
+ if x >= boundary:
88
+ ans.append(x)
85
89
return
86
- last = t % 10
90
+ last = x % 10
87
91
if last + k <= 9 :
88
- dfs(n - 1 , k, t * 10 + last + k)
92
+ dfs(x * 10 + last + k)
89
93
if last - k >= 0 and k != 0 :
90
- dfs(n - 1 , k, t * 10 + last - k)
94
+ dfs(x * 10 + last - k)
91
95
96
+ ans = []
97
+ boundary = 10 ** (n - 1 )
92
98
for i in range (1 , 10 ):
93
- dfs(n - 1 , k, i)
99
+ dfs(i)
94
100
return ans
95
101
```
96
102
97
103
#### Java
98
104
99
105
``` java
100
106
class Solution {
107
+ private List<Integer > ans = new ArrayList<> ();
108
+ private int boundary;
109
+ private int k;
110
+
101
111
public int [] numsSameConsecDiff (int n , int k ) {
102
- List<Integer > res = new ArrayList<> ();
112
+ this . k = k;
113
+ boundary = (int ) Math . pow(10 , n - 1 );
103
114
for (int i = 1 ; i < 10 ; ++ i) {
104
- dfs(n - 1 , k, i, res );
115
+ dfs(i );
105
116
}
106
- int [] ans = new int [res. size()];
107
- for (int i = 0 ; i < res. size(); ++ i) {
108
- ans[i] = res. get(i);
109
- }
110
- return ans;
117
+ return ans. stream(). mapToInt(i - > i). toArray();
111
118
}
112
119
113
- private void dfs (int n , int k , int t , List< Integer > res ) {
114
- if (n == 0 ) {
115
- res . add(t );
120
+ private void dfs (int x ) {
121
+ if (x >= boundary ) {
122
+ ans . add(x );
116
123
return ;
117
124
}
118
- int last = t % 10 ;
119
- if (last + k <= 9 ) {
120
- dfs(n - 1 , k, t * 10 + last + k, res );
125
+ int last = x % 10 ;
126
+ if (last + k < 10 ) {
127
+ dfs(x * 10 + last + k);
121
128
}
122
- if (last - k > = 0 && k ! = 0 ) {
123
- dfs(n - 1 , k, t * 10 + last - k, res );
129
+ if (k ! = 0 && last - k > = 0 ) {
130
+ dfs(x * 10 + last - k);
124
131
}
125
132
}
126
133
}
@@ -131,109 +138,111 @@ class Solution {
131
138
``` cpp
132
139
class Solution {
133
140
public:
134
- vector<int > ans;
135
-
136
141
vector<int > numsSameConsecDiff(int n, int k) {
137
- for (int i = 1; i < 10; ++i)
138
- dfs(n - 1, k, i);
139
- return ans;
140
- }
141
-
142
- void dfs (int n, int k, int t) {
143
- if (n == 0) {
144
- ans.push_back(t);
145
- return;
142
+ vector<int > ans;
143
+ int boundary = pow(10, n - 1);
144
+ auto dfs = [ &] (auto&& dfs, int x) {
145
+ if (x >= boundary) {
146
+ ans.push_back(x);
147
+ return;
148
+ }
149
+ int last = x % 10;
150
+ if (last + k < 10) {
151
+ dfs(dfs, x * 10 + last + k);
152
+ }
153
+ if (k != 0 && last - k >= 0) {
154
+ dfs(dfs, x * 10 + last - k);
155
+ }
156
+ };
157
+ for (int i = 1; i < 10; ++i) {
158
+ dfs(dfs, i);
146
159
}
147
- int last = t % 10;
148
- if (last + k <= 9) dfs(n - 1, k, t * 10 + last + k);
149
- if (last - k >= 0 && k != 0) dfs(n - 1, k, t * 10 + last - k);
160
+ return ans;
150
161
}
151
162
};
152
163
```
153
164
154
165
#### Go
155
166
156
167
```go
157
- func numsSameConsecDiff(n int, k int) []int {
158
- var ans [] int
159
- var dfs func(n, k, t int)
160
- dfs = func(n, k, t int) {
161
- if n == 0 {
162
- ans = append(ans, t )
168
+ func numsSameConsecDiff(n int, k int) (ans []int) {
169
+ bounary := int(math.Pow10(n - 1))
170
+ var dfs func(int)
171
+ dfs = func(x int) {
172
+ if x >= bounary {
173
+ ans = append(ans, x )
163
174
return
164
175
}
165
- last := t % 10
166
- if last+k <= 9 {
167
- dfs(n-1, k, t *10+ last+ k)
176
+ last := x % 10
177
+ if last+k < 10 {
178
+ dfs(x *10 + last + k)
168
179
}
169
- if last- k >= 0 && k ! = 0 {
170
- dfs(n-1, k, t *10+ last- k)
180
+ if k > 0 && last-k > = 0 {
181
+ dfs(x *10 + last - k)
171
182
}
172
183
}
173
-
174
184
for i := 1; i < 10; i++ {
175
- dfs(n-1, k, i)
185
+ dfs(i)
176
186
}
177
- return ans
187
+ return
178
188
}
179
189
```
180
190
181
191
#### TypeScript
182
192
183
193
``` ts
184
194
function numsSameConsecDiff(n : number , k : number ): number [] {
185
- const ans = new Set < number >() ;
195
+ const ans: number [] = [] ;
186
196
const boundary = 10 ** (n - 1 );
187
-
188
- const dfs = (nums : number ) => {
189
- if (nums >= boundary ) {
190
- ans .add (nums );
197
+ const dfs = (x : number ) => {
198
+ if (x >= boundary ) {
199
+ ans .push (x );
191
200
return ;
192
201
}
193
-
194
- const num = nums % 10 ;
195
- for ( const x of [ num + k , num - k ]) {
196
- if ( 0 <= x && x < 10 ) {
197
- dfs ( nums * 10 + x );
198
- }
202
+ const last = x % 10 ;
203
+ if ( last + k < 10 ) {
204
+ dfs ( x * 10 + last + k );
205
+ }
206
+ if ( k > 0 && last - k >= 0 ) {
207
+ dfs ( x * 10 + last - k );
199
208
}
200
209
};
201
-
202
210
for (let i = 1 ; i < 10 ; i ++ ) {
203
211
dfs (i );
204
212
}
205
-
206
- return [... ans ];
213
+ return ans ;
207
214
}
208
215
```
209
216
210
217
#### JavaScript
211
218
212
219
``` js
213
- function numsSameConsecDiff (n , k ) {
214
- const ans = new Set ();
220
+ /**
221
+ * @param {number} n
222
+ * @param {number} k
223
+ * @return {number[]}
224
+ */
225
+ var numsSameConsecDiff = function (n , k ) {
226
+ const ans = [];
215
227
const boundary = 10 ** (n - 1 );
216
-
217
- const dfs = nums => {
218
- if (nums >= boundary) {
219
- ans .add (nums);
228
+ const dfs = x => {
229
+ if (x >= boundary) {
230
+ ans .push (x);
220
231
return ;
221
232
}
222
-
223
- const num = nums % 10 ;
224
- for ( const x of [num + k, num - k]) {
225
- if ( 0 <= x && x < 10 ) {
226
- dfs (nums * 10 + x);
227
- }
233
+ const last = x % 10 ;
234
+ if (last + k < 10 ) {
235
+ dfs (x * 10 + last + k);
236
+ }
237
+ if (k > 0 && last - k >= 0 ) {
238
+ dfs (x * 10 + last - k);
228
239
}
229
240
};
230
-
231
241
for (let i = 1 ; i < 10 ; i++ ) {
232
242
dfs (i);
233
243
}
234
-
235
- return [... ans];
236
- }
244
+ return ans;
245
+ };
237
246
```
238
247
239
248
<!-- tabs: end -->
0 commit comments