491. 递增子序列:
代码思路
这题剪枝会有点烦,但是刷新了新的思路,就是在无序的数组,删掉重复的条件判断要改成 i > node_index+1 and nums[i] in nums[node_index+1:i]。因为这是树的每一层的广度,不是深度!广度是不可以有重复的。注意,不仅仅是根节点有广度,子节点也有他的广度。
class Solution:
def findSubsequences(self, nums: List[int]) -> List[List[int]]:
res = []
def bt(node_index, ans_list):
if len(ans_list) >= 2:
res.append(ans_list)
if len(ans_list) > len(nums):
return
for i in range(node_index+1, len(nums)):
if i > node_index+1 and nums[i] in nums[node_index+1:i]:
continue
if nums[i] >= ans_list[-1]:
bt(i, ans_list+[nums[i]])
for i in range(len(nums)):
if i > 0 and nums[i] in nums[0:i]:
continue
bt(i, [nums[i]])
return res
46. 全排列:
代码思路
这题的剪枝思路就是nums[i] not in ans_list,也就是不重复递归。
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
res = []
def bt(node_index, ans_list):
if len(ans_list) == len(nums):
res.append(ans_list)
return
for i in range(0, len(nums)):
if nums[i] not in ans_list:
bt(i, ans_list+[nums[i]])
for i in range(len(nums)):
bt(i, [nums[i]])
return res
47. 全排列 II:
代码思路
要好好改善一下回溯的代码了。人家回溯都是从空开始,而你是从第一个元素开始,会有点麻烦。
class Solution:
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
res = []
nums = sorted(nums)
check = [0 for i in range(len(nums))]
def bt(node_index, ans_list):
if len(ans_list) == len(nums):
res.append(ans_list)
return
for i in range(0, len(nums)):
if check[i] != 1:
if i == 0:
check[i] = 1
bt(i, ans_list+[nums[i]])
check[i] = 0
else:
if check[i-1] == 0 and nums[i] == nums[i-1]:
continue
check[i] = 1
bt(i, ans_list+[nums[i]])
check[i] = 0
for i in range(len(nums)):
if i > 0 and nums[i] == nums[i-1]:
continue
check[i] = 1
bt(i, [nums[i]])
check[i] = 0
return res