491.递增子序列
未去重的代码
class Solution:
def findSubsequences(self, nums: List[int]) -> List[List[int]]:
result = []
self.backtracking(nums, result, [], 0)
return result
def backtracking(self, nums, result, path, startIndex):
if len(path) >= 2:
result.append(path[:])
for i in range(startIndex, len(nums)):
if len(path) >= 1 and nums[i] < path[-1]:
continue
path.append(nums[i])
self.backtracking(nums, result, path, i+1)
path.pop()
本题是树结构的同一层剪枝
但是本题不能排序,和之前的剪枝差别很大
class Solution:
def findSubsequences(self, nums: List[int]) -> List[List[int]]:
result = []
self.backtracking(nums, result, [], 0)
return result
def backtracking(self, nums, result, path, startIndex):
if len(path) >= 2:
result.append(path[:])
used = set()
for i in range(startIndex, len(nums)):
if len(path) >= 1 and nums[i] < path[-1]:
continue
if nums[i] in used:
continue
used.add(nums[i])
path.append(nums[i])
self.backtracking(nums, result, path, i+1)
path.pop()
优化点:因为给定的数字范围是-100 <= nums[i] <= 100,因此set可以优化为数组
46.全排列
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
result = []
used = [False] * len(nums)
self.backtracking(nums, result, [], used)
return result
def backtracking(self, nums, result, path, used):
if len(path) == len(nums):
result.append(path[:])
return
for i in range(len(nums)):
if used[i]:
continue
path.append(nums[i])
used[i] = True
self.backtracking(nums, result, path, used)
path.pop()
used[i] = False
47.全排列 II
去重的思路需要继续理解
class Solution:
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
result = []
used = [False] * len(nums)
nums.sort()
self.backtracking(nums, result, [], used)
return result
def backtracking(self, nums, result, path, used):
if len(path) == len(nums):
result.append(path[:])
return
for i in range(len(nums)):
if used[i]:
continue
if i > 0 and nums[i] == nums[i-1] and not used[i-1]:
continue
path.append(nums[i])
used[i] = True
self.backtracking(nums, result, path, used)
path.pop()
used[i] = False