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())returnfor i in range(index,len(nums)):if i> index and nums[i]<nums[i-1]:continuepath.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())returnfor 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:continuedef 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())returnfor i in range(index,len(nums)):path.append(nums[i])if len(path)>=2 and path[-1]<path[-2]: returnself.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())returnfor i in range(index,len(nums)):path.append(nums[i])if len(path)>=2 and path[-1]<path[-2]: returnself.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]: returnself.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:returndef 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:returnpath.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:continuepath.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)returnused=list()for i in range(len(nums)):if nums[i] in used: continuepath.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)returnfor i in range(len(nums)):if nums[i] in used: continuepath.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())returnfor i in range(len(nums)):if nums[i] in used: continuepath.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())returnfor i in range(len(nums)):if nums[i] in used: continuepath.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())returnfor i in range(len(nums)):if used[i]:continuepath.append(nums[i])used[i]=Trueself.backtracking(nums,path,res,used)path.pop()used[i]=Falsedef permuteUnique(self, nums: List[int]) -> List[List[int]]:res=[]used=[False]*(len(nums))self.backtracking(nums,[],res,used)return res
这是暴力去重,还有简化解法,后补