title: LEETCODE-DAY29
date: 2024-03-20 15:22:38
tags:
今日内容:491.递增子序列、46.全排列、47.全排列 II
T1
class Solution:
def backtracking(self,nums,index,path,res):
if index==len(nums):
res.append(path.copy())
return
for i in range(index,len(nums)):
if i> index and nums[i]<nums[i-1]:
continue
path.append(nums[i])
self.backtracking(nums,i+1,path,res)
path.pop()
def findSubsequences(self, nums: List[int]) -> List[List[int]]:
res=[]
self.backtracking(nums,0,[],res)
return res
输入
nums =
[4,4,3,2,1]
输出
[[4,4,3,2,1],[4,3,2,1]]
预期结果
[[4,4]]
class Solution:
def backtracking(self,nums,index,path,res):
if index==len(nums):
res.append(path.copy())
return
for i in range(index,len(nums)):
if i> index and nums[i]>=nums[i-1]:
path.append(nums[i])
self.backtracking(nums,i+1,path,res)
path.pop()
else:
continue
def findSubsequences(self, nums: List[int]) -> List[List[int]]:
res=[]
self.backtracking(nums,0,[],res)
return res
输入
nums =
[4,4,3,2,1]
输出
[]
预期结果
[[4,4]]
nums =
[4,6,7,7]
输出
[[6,7],[7]]
预期结果
[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]
逻辑错了应该跟path最后一位比较
class Solution:
def backtracking(self,nums,index,path,res):
if index==len(nums):
res.append(path.copy())
return
for i in range(index,len(nums)):
path.append(nums[i])
if len(path)>=2 and path[-1]<path[-2]:
return
self.backtracking(nums,i+1,path,res)
path.pop()
def findSubsequences(self, nums: List[int]) -> List[List[int]]:
res=[]
self.backtracking(nums,0,[],res)
return res
输入
nums =
[4,6,7,7]
输出
[[4,6,7,7],[4,6,7],[4,7,7],[4,7],[6,7,7],[6,7],[7,7],[7]]
预期结果
[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]
输入
nums =
[4,4,3,2,1]
输出
[]
预期结果
[[4,4]]
应该是收集结果的判断有问题
[4,6]满足递增条件但是还没到队列尾部所以没有放入res中
class Solution:
def backtracking(self,nums,index,path,res):
if len(path)>=2 and path[-1]>=path[-2]:
res.append(path.copy())
return
for i in range(index,len(nums)):
path.append(nums[i])
if len(path)>=2 and path[-1]<path[-2]:
return
self.backtracking(nums,i+1,path,res)
path.pop()
def findSubsequences(self, nums: List[int]) -> List[List[int]]:
res=[]
self.backtracking(nums,0,[],res)
return res
输入
nums =
[4,6,7,7]
输出
[[4,6],[4,7],[4,7],[6,7],[6,7],[7,7]]
预期结果
[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]
貌似也不对
因为是取树上的节点所以不要return
class Solution:
def backtracking(self,nums,index,path,res):
if len(path)>=2 and path[-1]>=path[-2]:
#此处直接写if len(path)>=2: 结果一样
res.append(path.copy())
for i in range(index,len(nums)):
path.append(nums[i])
if len(path)>=2 and path[-1]<path[-2]:
return
self.backtracking(nums,i+1,path,res)
path.pop()
def findSubsequences(self, nums: List[int]) -> List[List[int]]:
res=[]
self.backtracking(nums,0,[],res)
return res
nums =
[4,4,3,2,1]
输出
[[4,4],[4,4,4]]
预期结果
[[4,4]]
输入
nums =
[4,6,7,7]
输出
[[4,6],[4,6,7],[4,6,7,7],[4,6,7],[4,7],[4,7,7],[4,7],[6,7],[6,7,7],[6,7],[7,7]]
预期结果
[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]
有重复
class Solution:
def backtracking(self,nums,index,path,res):
if len(path)>=2 :
res.append(path.copy())
for i in range(index,len(nums)):
if not path:
path.append(nums[i])
self.backtracking(nums,i+1,path,res)
path.pop()
else:
if nums[i]>=path[-1]:
path.append(nums[i])
self.backtracking(nums,i+1,path,res)
path.pop()
else:
return
'''def backtracking(self,nums,index,path,res):
if len(path)>=2 :
res.append(path.copy())
for i in range(index,len(nums)):
if path and nums[i]<path[-1]:
return(continue)
path.append(nums[i])
self.backtracking(nums,i+1,path,res)
path.pop() 结果一样'''
def findSubsequences(self, nums: List[int]) -> List[List[int]]:
res=[]
self.backtracking(nums,0,[],res)
return res
输入
nums =
[4,4,3,2,1]
输出
[[4,4]]
预期结果
[[4,4]]
输入
nums =
[4,6,7,7]
输出
[[4,6],[4,6,7],[4,6,7,7],[4,6,7],[4,7],[4,7,7],[4,7],[6,7],[6,7,7],[6,7],[7,7]]
预期结果
[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]
class Solution:
def backtracking(self,nums,index,path,res):
if len(path)>=2 and path not in res :
res.append(path.copy())
for i in range(index,len(nums)):
if not path:
path.append(nums[i])
self.backtracking(nums,i+1,path,res)
path.pop()
else:
if nums[i]>=path[-1]:
path.append(nums[i])
self.backtracking(nums,i+1,path,res)
path.pop()
else:
return
def findSubsequences(self, nums: List[int]) -> List[List[int]]:
res=[]
self.backtracking(nums,0,[],res)
return res
用例过了但没AC
class Solution:
def backtracking(self,nums,index,path,res):
if len(path)>=2 :
res.append(path.copy())
used=set()
for i in range(index,len(nums)):
if (path and nums[i]<path[-1]) or nums[i] in used:
return
path.append(nums[i])
used.add(nums[i])
self.backtracking(nums,i+1,path,res)
path.pop()
def findSubsequences(self, nums: List[int]) -> List[List[int]]:
res=[]
self.backtracking(nums,0,[],res)
return res
18 / 58 个通过的测试用例
class Solution:
def backtracking(self,nums,index,path,res):
if len(path)>=2 :
res.append(path.copy())
used=set()
for i in range(index,len(nums)):
if (path and nums[i]<path[-1]) or nums[i] in used:
continue
path.append(nums[i])
used.add(nums[i])
self.backtracking(nums,i+1,path,res)
path.pop()
def findSubsequences(self, nums: List[int]) -> List[List[int]]:
res=[]
self.backtracking(nums,0,[],res)
return res
return与continue的区别
return:函数终止
continue:for 循环中 这一层的i终止进入i+1
T2
class Solution:
def backtracking(self,nums,path,res):
if len(path)==len(nums):
res.append(path)
return
used=list()
for i in range(len(nums)):
if nums[i] in used:
continue
path.append(nums[i])
self.backtracking(nums,path,res)
path.pop()
def permute(self, nums: List[int]) -> List[List[int]]:
res=[]
self.backtracking(nums,[],res)
return res
输入
nums =
[0,1]
输出
[[],[],[],[]]
预期结果
[[0,1],[1,0]]
class Solution:
def backtracking(self,nums,path,res,used):
if len(path)==len(nums):
res.append(path)
return
for i in range(len(nums)):
if nums[i] in used:
continue
path.append(nums[i])
used.append(nums[i])
self.backtracking(nums,path,res,used)
path.pop()
def permute(self, nums: List[int]) -> List[List[int]]:
res=[]
self.backtracking(nums,[],res,[])
return res
输入
nums =
[1,2,3]
输出
[[]]
预期结果
[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
细节忘记path.copy了
class Solution:
def backtracking(self,nums,path,res,used):
if len(path)==len(nums):
res.append(path.copy())
return
for i in range(len(nums)):
if nums[i] in used:
continue
path.append(nums[i])
used.append(nums[i])
self.backtracking(nums,path,res,used)
path.pop()
def permute(self, nums: List[int]) -> List[List[int]]:
res=[]
self.backtracking(nums,[],res,[])
return res
输入
nums =
[0,1]
输出
[[0,1]]
预期结果
[[0,1],[1,0]]
要注意used数组也要相应的做回溯
class Solution:
def backtracking(self,nums,path,res,used):
if len(path)==len(nums):
res.append(path.copy())
return
for i in range(len(nums)):
if nums[i] in used:
continue
path.append(nums[i])
used.append(nums[i])
self.backtracking(nums,path,res,used)
path.pop()
used.pop()
def permute(self, nums: List[int]) -> List[List[int]]:
res=[]
self.backtracking(nums,[],res,[])
return res
AC
细节上还是要注意
T3
class Solution:
def backtracking(self,nums,path,res,used):
if len(path)==len(nums):
if path not in res:
res.append(path.copy())
return
for i in range(len(nums)):
if used[i]:
continue
path.append(nums[i])
used[i]=True
self.backtracking(nums,path,res,used)
path.pop()
used[i]=False
def permuteUnique(self, nums: List[int]) -> List[List[int]]:
res=[]
used=[False]*(len(nums))
self.backtracking(nums,[],res,used)
return res
这是暴力去重,还有简化解法,后补