脑子不清醒看错了。。。把DAY29的任务看成DAY28的了,标题已更正。这个是DAY29的打卡。
491.递增子序列
- 题目链接:491.递增子序列
- 注意uset在每一层内定义!
- 其实就是前面的层用过了之后后面不能再用(除非相等),之前试过全局定义,会出现后面的层用完之后就标记使用过导致缺少结果的情况
class Solution(object):
def backtracking(self, nums, path, result):
if len(path)>1:
result.append(path[:])
uset = set()
for i in range(len(nums)):
if (path and nums[i] < path[-1]) or nums[i] in uset:
continue
uset.add(nums[i])
path.append(nums[i])
self.backtracking(nums[i+1:], path, result)
path.pop()
def findSubsequences(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
path = []
result = []
self.backtracking(nums, path, result)
return result
46.全排列
- 题目链接:46.全排列
class Solution(object):
def backtracking(self, nums, path, result):
if not nums:
result.append(path[:])
return
for i in range(len(nums)):
path.append(nums[i])
nums_new = nums[:i]+nums[i+1:]
self.backtracking(nums_new, path, result)
path.pop()
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
path = []
result = []
self.backtracking(nums, path, result)
return result
47.全排列II
- 题目链接:47.全排列II
class Solution(object):
def backtracking(self, nums, path, result,l):
if len(path)==l:
result.append(path[:])
return
for i in range(len(nums)):
path.append(nums[i])
if i+1<len(nums) and nums[i]==nums[i+1]:
new_nums = nums[:i]+nums[i+2:]
else:
new_nums = nums[:i]+nums[i+1:]
self.backtracking(new_nums, path, result,l)
path.pop()
def permuteUnique(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
path = []
result = []
nums.sort()
l = len(nums)
self.backtracking(nums, path, result,l)
return result
- 直接加判断path not in result(耗时会比较长好像)
class Solution(object):
def backtracking(self, nums, path, result):
if not nums:
if path not in result:
result.append(path[:])
return
for i in range(len(nums)):
path.append(nums[i])
new_nums = nums[:i]+nums[i+1:]
self.backtracking(new_nums, path, result)
path.pop()
def permuteUnique(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
path = []
result = []
self.backtracking(nums, path, result)
return result