LEETCODE-DAY29


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

这是暴力去重,还有简化解法,后补



  • 41
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值