leetcode day 29 * 491.递增子序列 * 46.全排列 * 47.全排列 II


提示:以下是本篇文章正文内容,下面案例可供参考

一、leetcode 491.递增子序列 §§§§§

1.题目链接:

link

2.独立做题问题总结

运行时间过长

3.解法总结:

  1. 求子集后进行判断
		def check(store):                
            if len(store) < 2:
                return False
            # for i in range(len(store)):
            #     if i > 0 and store[i - 1] > store[i]:
            #         return False
            return True

        def backtracking(nums, startindex):

            if check(store):
                if store not in res:
                    res.append(store[:])
            for i in range(startindex, len(nums)):

                if i > startindex and nums[i] == nums[i - 1]:
                    continue
                if len(store) != 0 and nums[i] < store[-1]:
                    continue
                store.append(nums[i])
                backtracking(nums, i + 1)
                store.pop()
        res = []
        store = []
        backtracking(nums, 0)
        return res
		
  1. 回溯+剪枝
    @@因为不是有序数组,不能直接通过前一位和后一位相等去重
    §. 砍掉树层上重复的:因为原数组无序:
    用set记录已存放数组:
    used = set()
    if nums[i] in used
    used.add(nums[i])
    §. 砍掉元素小于store最后一位的
		 def backtracking(nums, startindex):

            if len(store) >= 2:                    
                res.append(store[:])
            used = set()#所放位置保证了当进行到下一层时进行清零
            for i in range(startindex, len(nums)):

                # if i > startindex and nums[i] == nums[i - 1] :
                #     continue
                if store and nums[i] < store[-1] or nums[i] in used:
                    continue
                used.add(nums[i])
                store.append(nums[i])
                backtracking(nums, i + 1)
                store.pop()
        res = []
        store = []
        backtracking(nums, 0)
        return res
		

二、leetcode 46.全排列 §§§§

1.题目链接:

link

2.独立做题问题总结

3.解法总结:

  1. 回溯+去重
    用used数组进行记录,若用过则continue
		def backtracking(nums):
            if len(store) == len(nums):
                res.append(store[:])
                return            
            for i in range(len(nums)):
                if used[i] == True:
                    continue
                store.append(nums[i])
                used[i] = True
                backtracking(nums)
                store.pop()
                used[i] = False
        res = []
        store = []
        used = [0] * len(nums)
        backtracking(nums)
        return res
		
				if used[i] == True:
                    continue

§§§用continue跳过,因为还可以取同一层的其他元素
或者:

		# 若遇到self.path里已收录的元素,跳过
            if nums[i] in self.path:
                continue

三、leetcode 47.全排列 II §§§

1.题目链接:

link

2.独立做题问题总结

3.解法总结:

在这里插入图片描述
nums[i] == nums[i - 1] and used[i - 1] == False -------前半部分判断重复元素,后半部分判断在同一层

		used = [0] * len(nums)
        res = []
        store = []
        def backtracking(nums):

            if len(nums) == len(store):
                res.append(store[:])
                return
            
            for i in range(len(nums)):
                if i > 0 and nums[i] == nums[i - 1] and used[i - 1] == False:
                    continue
                if used[i] == False:
                    store.append(nums[i])
                    used[i] = True
                    backtracking(nums)
                    used[i] = False
                    store.pop()
        nums.sort()
        backtracking(nums)
        return res
		

(used[i - 1] == true)
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值