主要内容
- 组合
- 全排列
题目
491.递增子序列
思路分析
同一父节点下的同层使用过的元素不能再使用了
代码
class Solution:
def __init__(self):
self.res = []
self.path = []
def findSubsequences(self, nums: List[int]) -> List[List[int]]:
self.backtracking(nums, 0)
return self.res
def backtracking(self, nums, startindex):
# 收集结果
if len(self.path) >= 2:
self.res.append(self.path[:])
# 终止条件,可忽略
if startindex >= len(nums):
return
# 记录同一父节点的本层元素是否使用过
used = set()
for i in range(startindex, len(nums)):
if (self.path and nums[i] < self.path[-1]) or nums[i] in used:
continue
else:
used.add(nums[i])
self.path.append(nums[i])
self.backtracking(nums, i + 1)
self.path.pop()
class Solution:
def __init__(self):
self.res = []
self.path = []
def findSubsequences(self, nums: List[int]) -> List[List[int]]:
self.backtracking(nums, 0)
return self.res
def backtracking(self, nums, startindex):
# 收集结果
if len(self.path) >= 2:
self.res.append(self.path[:])
# 终止条件,可忽略
if startindex >= len(nums):
return
# 记录同一父节点的本层元素是否使用过
used = [False] * 201
for i in range(startindex, len(nums)):
if (self.path and nums[i] < self.path[-1]) or used[nums[i] + 100]:
continue
else:
used[nums[i] + 100] = True
self.path.append(nums[i])
self.backtracking(nums, i + 1)
self.path.pop()
46.全排列
思路分析
代码
class Solution:
def __init__(self):
self.res = []
self.path = []
def permute(self, nums: List[int]) -> List[List[int]]:
self.backtracking(nums)
return self.res
def backtracking(self, nums):
if not nums:
self.res.append(self.path[:])
for i in range(len(nums)):
self.path.append(nums[i])
self.backtracking(nums[:i]+nums[i+1:])
self.path.pop()
class Solution:
def __init__(self):
self.res = []
self.path = []
def permute(self, nums: List[int]) -> List[List[int]]:
self.backtracking(nums)
return self.res
def backtracking(self, nums):
if len(self.path) == len(nums):
self.res.append(self.path[:])
for i in range(len(nums)):
if nums[i] in self.path:
continue
self.path.append(nums[i])
self.backtracking(nums)
self.path.pop()
class Solution:
def __init__(self):
self.res = []
self.path = []
def permute(self, nums: List[int]) -> List[List[int]]:
used = [False] * len(nums)
self.backtracking(nums,used)
return self.res
def backtracking(self, nums, used):
if len(self.path) == len(nums):
self.res.append(self.path[:])
for i in range(len(nums)):
if used[i]:
continue
else:
used[i] = True
self.path.append(nums[i])
self.backtracking(nums, used)
self.path.pop()
used[i] = False
47.全排列 II
思路分析
used 记录同一树枝上的元素别重复选取
layer_used 记录同一父节点上同一层不使用重复元素
代码
class Solution:
def __init__(self):
self.res = []
self.path = []
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
used = [False] * len(nums)
self.backtracking(nums, used)
return self.res
def backtracking(self, nums, used):
# 同一树枝的元素不可重复选取,同一父节点同一层使用过的元素,不能再使用
if len(self.path) == len(nums):
self.res.append(self.path[:])
return
# used 记录同一树枝上是否重复选取,layer_used 记录同一层是否有重复元素
layer_used = set()
for i in range(len(nums)):
if used[i] or nums[i] in layer_used:
continue
else:
layer_used.add(nums[i])
used[i] = True
self.path.append(nums[i])
self.backtracking(nums, used)
self.path.pop()
used[i] = False