【代码随想录训练营】【Day 31】【回溯-5】| Leetcode 491, 46, 47

【代码随想录训练营】【Day 31】【回溯-5】| Leetcode 491, 46, 47

需强化知识点

  • 排列问题和组合分割子集问题的区别:
    • 排列是讲究顺序的,不同顺序的组合是不同的,因此不能使用startIndex来限制选择顺序,需要used来判断是否已被选择
    • 组合分割子集问题是不讲究顺序的,不同顺序的组合是相同的,因此需要使用startIndex来限制选择的顺序,保持一个从前到后的选择顺序,避免出现重复

题目

491. 非递减子序列

  • 因为原数组并非有序的,因此不能使用之前的startIndex去重方式,判定是否出现相等,需要使用set或者dict来进行,同样是横向遍历去重,需要注意这里used并不需要pop,因为同层使用过了就使用过了,需要保留这种使用过的状态来进行判定
  • 注意set 加入数据是add
class Solution:
    def findSubsequences(self, nums: List[int]) -> List[List[int]]:

        def backtracking(nums, path, result, startIndex):
            if len(path) > 1:
                result.append(path[:])
            
            used = set()
            for i in range(startIndex, len(nums)):
                if nums[i] in used:
                    continue
                if len(path) == 0 or nums[i] >= path[-1]:
                    used.add(nums[i])
                    path.append(nums[i])
                    backtracking(nums, path, result, i+1)
                    path.pop()
        
        result = []
        backtracking(nums, [], result, 0)
        return result

46. 全排列

  • 排列问题:不使用startIndex,使用used
class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:

        def backtracking(nums, path, result, used):
            if len(path) == len(nums):
                result.append(path[:])
                return
            
            for i in range(len(nums)):
                if not used[i]:
                    path.append(nums[i])
                    used[i] = True
                    backtracking(nums, path, result, used)
                    path.pop()
                    used[i] = False
        result = []
        used = [False] * len(nums)
        backtracking(nums, [], result, used)
        return result

47. 全排列 II

  • 横向遍历去重,和组合问题一致
class Solution:
    def permuteUnique(self, nums: List[int]) -> List[List[int]]:

        def backtracking(nums, path, result, used):
            if len(path) == len(nums):
                result.append(path[:])
                return
            
            for i in range(len(nums)):
                if i > 0 and nums[i] == nums[i-1] and used[i-1] == False:
                    continue
                if not used[i]:
                    path.append(nums[i])
                    used[i] = True
                    backtracking(nums, path, result, used)
                    used[i] = False
                    path.pop()
        nums.sort()
        result = []
        used = [False] * len(nums)
        backtracking(nums, [], result, used)
        return result
           
  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值