Problem Statement
leetcode problem link
Back track [Accepted]
class Solution:
def numsSameConsecDiff(self, n: int, k: int) -> List[int]:
res = []
def backtrack(i, curr):
if i == n:
num = [str(x) for x in curr]
res.append(int(''.join(num)))
return
for j in range(10):
if j == 0 and not curr:
continue
if not curr or abs(curr[-1] - j) == k:
backtrack(i + 1, curr + [j])
backtrack(0, [])
res.sort()
return res
Editorial
Approach 1: DFS (Depth-First Search)
class Solution:
def numsSameConsecDiff(self, N: int, K: int) -> List[int]:
if N == 1:
return [i for i in range(10)]
ans = []
def DFS(N, num):
# base case
if N == 0:
return ans.append(num)
tail_digit = num % 10
# using set() to avoid duplicates when K == 0
next_digits = set([tail_digit + K, tail_digit - K])
for next_digit in next_digits:
if 0 <= next_digit < 10:
new_num = num * 10 + next_digit
DFS(N-1, new_num)
for num in range(1, 10):
DFS(N-1, num)
return list(ans)
Approach 2: BFS (Breadth-First Search)
class Solution:
def numsSameConsecDiff(self, N: int, K: int) -> List[int]:
if N == 1:
return [i for i in range(10)]
# initialize the queue with candidates for the first level
queue = [digit for digit in range(1, 10)]
for level in range(N-1):
next_queue = []
for num in queue:
tail_digit = num % 10
# using set() to avoid duplicates when K == 0
next_digits = set([tail_digit + K, tail_digit - K])
for next_digit in next_digits:
if 0 <= next_digit < 10:
new_num = num * 10 + next_digit
next_queue.append(new_num)
# start the next level
queue = next_queue
return queue