更弱智的算法学习 day25

491.递增子序列

简单整理一下逻辑:本题和昨天的看上去像,实际上不太相同:

首先要考虑因为重复问题引起的去重需求,对于4676数组而言,会出现不同的两个46,而该数组不能排序,所以无法用之前的逻辑进行去重,我们新的去重逻辑应该是,在本层树中使用过该数字了,如6,就不再使用了,因此给定一个set集合,每使用一个数,就装入集合中,后续使用的时候,检查是否在集合中已经出现过了。

加入out数组的逻辑是,在out存在时,检查其最后一位和当前i位置数组大小

python 复制代码
class Solution:
    def findSubsequences(self, nums: List[int]) -> List[List[int]]:
        self.out = []
        self.res = []
        self.backtrack(nums, 0)
        return self.res

    def backtrack(self, nums, start):
        if len(self.out) >= 2:
            self.res.append(list(self.out))
            # return  这里不返回,而是继续寻找更长的子序列
        used = set()

        for i in range(start, len(nums)):
            if self.out and nums[i] < self.out[-1]:
                continue
            if nums[i] in used:
                continue
            used.add(nums[i])
            self.out.append(nums[i])
            self.backtrack(nums,i+1)
            self.out.pop()

46.全排列

这个题前面已经做过,但是依然做错,嘻嘻。

全排列和组合的区别是顺序,也即132和123都是一个组合,但是不是一个排列,因此只要保证每一子树下面不适用相同元素即可,这里用used数组标注了使用过的元素

python 复制代码
class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
        self.out = []
        self.res = []
        self.used = [False] * len(nums)
        self.backtrack(nums)
        return self.res

    def backtrack(self,nums):
        if len(self.out) == len(nums):
            self.res.append(list(self.out))
            return

        for i in range(len(nums)):
            if self.used[i] is True:
                continue
            self.out.append(nums[i])
            self.used[i] = True 
            self.backtrack(nums)
            self.out.pop()
            self.used[i] = False

47.全排列 II

由于包含了可重复数,因此多了一个去重的逻辑,和之前使用的相似

if self.used[i-1] and nums[i-1] == nums[i] and i>0:

其他地方的内容相似

python 复制代码
class Solution:
    def permuteUnique(self, nums: List[int]) -> List[List[int]]:
        self.out = []
        self.res = []
        self.used = [False] * len(nums)
        nums.sort()
        self.backtrack(nums)
        return self.res


    def backtrack(self, nums):
        if len(self.out) == len(nums):
            self.res.append(list(self.out))
            return

        for i in range(len(nums)):
            if self.used[i-1] and nums[i-1] == nums[i] and i>0:
                continue
            if self.used[i]:
                continue
            self.out.append(nums[i])
            self.used[i] = True
            self.backtrack(nums)
            self.out.pop()
            self.used[i] = False 

N皇后(适当跳过)

巧妙啊。

这个题目小时候抱过我,印象真是很深刻。

下面这个思路用上,我们逐行处理位置即可

python 复制代码
class Solution:
    def solveNQueens(self, n: int) -> List[List[str]]:
        self.out = []
        self.res = []
        self.sumqueen = []
        self.diffqueen = []
        self.used = [False]*n


        self.backtrack(n,0) #从0行开始
        return self.res

    def backtrack(self,n,row):
        if len(self.out) == n:
            chessboard = []
            for i in self.out:
                row = '.'*i + 'Q'+'.'*(n-1-i)
                chessboard.append(row)
            self.res.append(chessboard)
            return

        for i in range(n):
            if self.used[i] is True:
                continue
            if row+i in self.sumqueen or row-i in self.diffqueen:
                continue
            self.out.append(i)
            self.used[i] = True
            self.sumqueen.append(row+i)
            self.diffqueen.append(row-i)
            self.backtrack(n,row+1)
            self.out.pop()
            self.used[i] = False
            self.sumqueen.pop()
            self.diffqueen.pop()

解数独(适当跳过)

这有点复杂了,我看不如跳过

总结

相关推荐
wj3055853783 小时前
课程 9:模型测试记录与 Prompt 策略
linux·人工智能·python·comfyui
吃好睡好便好3 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
星寂樱易李3 小时前
iperf3 + Python-- 网络带宽、网速、网络稳定性
开发语言·网络·python
仰泳之鹅4 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
nashane4 小时前
HarmonyOS 6学习:CapsLock键失效诊断与长截图完整实现指南
学习·华为·harmonyos
qingfeng154154 小时前
企业微信机器人开发:如何实现自动化与智能运营?
人工智能·python·机器人·自动化·企业微信
xian_wwq6 小时前
【学习笔记】AGC协调控制系统概述
笔记·学习
x_yeyue6 小时前
三角形数
笔记·算法·数论·组合数学
憧憬成为java架构高手的小白7 小时前
docker学习笔记(基于b站多个视频学习)【未完结】
笔记·学习