今天的题有点难,和之前的回溯方法不一样
491. Non-decreasing Subsequences
这道题涉及到如果去重的问题,基本思路就是同一层的node不能一致
Way1:
在回溯之前,每层设置一个数数组用来记录当前的值是不是已经被选择过
class Solution:
def findSubsequences(self, nums: List[int]) -> List[List[int]]:
res=[]
path=[]
def dfs(index):
if len(path)>1:
res.append(path[:])
if index >=len(nums):
return
used=set()
for i in range(index,len(nums)):
if path and nums[i]<path[-1] or nums[i] in used:
continue
used.add(nums[i])
path.append(nums[i])
dfs(i+1)
path.pop()
dfs(0)
return res
46. Permutations
这道题的不一样的点在于所有的元素都需要,所以for循环的index变了
Way1:
还是用一个used数组来记录每一位是否被回溯过,如果被回溯过则跳过本次回溯
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
path=[]
res=[]
used=[False]*len(nums)
def dfs():
if len(path)==len(nums):
res.append(path[:])
return
for i in range(len(nums)):
if used[i]:
continue
used[i]=True
path.append(nums[i])
dfs()
path.pop()
used[i]=False
dfs()
return res
47. Permutations II
这道题比46 更加复杂一点
去重的思路之前已经说过了就是先给数组排序,然后判断是不是nums[i]==nums[i-1].但是对于这道题而言还涉及到另一个数组问题
Way1:
还要额外用一个used 数组来看当前层的node的值是不是被用过了.反正用没用过都可以但是只能取一边
class Solution:
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
path=[]
res=[]
used=[False]*len(nums)
nums.sort()
def dfs():
if len(path)==len(nums):
res.append(path[:])
return
for i in range(len(nums)):
if not used[i]:
if i!=0 and nums[i]==nums[i-1] and not used[i-1]:
continue
used[i]=True
path.append(nums[i])
dfs()
path.pop()
used[i]=False
dfs()
return res