代码随想录算法训练营第25天—回溯算法05 | *491.递增子序列 *46.全排列 47.全排列 II

*491.递增子序列

https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html
视频讲解:https://www.bilibili.com/video/BV1EG4y1h78v

  • 考点
    • 回溯+子集+去重
  • 我的思路
    • 暴力法,不进行去重,仅在最后加入结果时判断当前子序列是否之前出现过
    • 能通过力扣,但是效率排在后10%
  • 视频讲解关键点总结
    • 重点在于去重逻辑和判断递增子序列的逻辑
    • 本题的树结构
    • 去重逻辑:由于本题的数组不是有序数组,因此对于重复的元素,需要使用的判断条件是其是否在同一树层出现过,而不是同一树层的前一元素;为此,需要使用哈希结构(数组或集合)记录同一树层中已出现元素的情况
    • 判断递增子序列的逻辑:在将当前元素加入子序列之前,先判断该元素是否小于子序列的最后一个元素,如果小于,就跳过当前元素;这样,所得到的所有子序列就全都是递增的了,不需要进行额外判断,能提升一些效率
  • 我的思路的问题
    • 运行效率慢
  • 代码书写问题
    • list.sort()没有返回值,因此想要把排序后的列表和其它列表进行比对,要先进行sort,再用列表本身进行对比
  • 可执行代码
# 暴力法
class Solution:
    def backtracking(self, nums, sequence, result, start_index):
        if start_index == len(nums):
            return
        for i in range(start_index, len(nums)):
            sequence.append(nums[i])
            cur = sequence[:]
            cur.sort()
            if len(sequence) >= 2 and cur == sequence and sequence not in result:
                result.append(sequence[:])
            self.backtracking(nums, sequence, result, i + 1)
            sequence.pop()

    def findSubsequences(self, nums: List[int]) -> List[List[int]]:
        result = []
        self.backtracking(nums, [], result, 0)
        return result
# 过程去重版(去掉了判断sequence in result,效率提升70-80倍)
class Solution:
    def backtracking(self, nums, sequence, result, start_index):
        used = set()
        if start_index == len(nums):
            return
        for i in range(start_index, len(nums)):
            if sequence and nums[i] < sequence[-1]:
                continue
            elif nums[i] in used:
                continue
            used.add(nums[i])
            sequence.append(nums[i])
            if len(sequence) >= 2:
                result.append(sequence[:])
            self.backtracking(nums, sequence, result, i + 1)
            sequence.pop()

    def findSubsequences(self, nums: List[int]) -> List[List[int]]:
        result = []
        self.backtracking(nums, [], result, 0)
        return result

*46.全排列

https://programmercarl.com/0046.%E5%85%A8%E6%8E%92%E5%88%97.html
视频讲解:https://www.bilibili.com/video/BV19v4y1S79W

  • 考点
    • 回溯+排列
  • 我的思路
    • 无思路
  • 视频讲解关键点总结
    • 排列问题也是依次取值然后逐步生成完整的排列
    • 回溯三要素
      • 形参:候选数组,候选数组使用情况used,单个排列,结果变量;返回值为空
      • 退出条件:当单个排列的长度等于候选数组时,将排列加入结果并返回
      • 回溯逻辑
        • 循环范围为候选数组:
          • 如果当前元素已经被使用过了(used对应标志位为1),则跳过当前元素
          • 将当前元素的used数组对应位置标记为1
          • 当前元素加入排列
          • 递归
          • 当前元素弹出
          • used标记位改回0
  • 我的思路的问题
    • 无思路
  • 代码书写问题
  • 可执行代码
class Solution:
    def backtracking(self, nums, used, permutation, result):
        if len(permutation) == len(nums):
            result.append(permutation[:])
            return
        for i in range(len(nums)):
            if used[i] == 1:
                continue
            used[i] = 1
            permutation.append(nums[i])
            self.backtracking(nums, used, permutation, result)
            permutation.pop()
            used[i] = 0

    def permute(self, nums: List[int]) -> List[List[int]]:
        result = []
        used = [0] * len(nums)
        self.backtracking(nums, used, [], result)
        return result

47.全排列 II

https://programmercarl.com/0047.%E5%85%A8%E6%8E%92%E5%88%97II.html
视频讲解:https://www.bilibili.com/video/BV1R84y1i7Tm

  • 考点
    • 回溯+排列+去重
  • 我的思路
    • 本题就是在上一题的基础上,加上树层去重即可
  • 视频讲解关键点总结
    • 和我的思路一致
  • 我的思路的问题
  • 代码书写问题
  • 可执行代码
class Solution:
    def backtracking(self, nums, used, permutation, result):
        if len(permutation) == len(nums):
            result.append(permutation[:])
            return
        for i in range(len(nums)):
            if used[i] == 1 or (i > 0 and nums[i] == nums[i - 1] and used[i - 1] == 0):
                continue
            used[i] = 1
            permutation.append(nums[i])
            self.backtracking(nums, used, permutation, result)
            permutation.pop()
            used[i] = 0

    def permuteUnique(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        result = []
        used = [0] * len(nums)
        self.backtracking(nums, used, [], result)
        return result

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/413473.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探索比特币现货 ETF 对加密货币价格的潜在影响

撰文&#xff1a;Sean&#xff0c;Techub News 文章来源Techub News&#xff0c;搜Tehub News下载查看更多Web3资讯。 自美国比特币现货交易所交易基金&#xff08;ETF&#xff09;上市以来&#xff0c;比特币现货 ETF 的相关信息无疑成为了影响比特币价格及加密货币市场走向…

提升 Node.js 服务端性能:Fastify 框架

微信搜索“好朋友乐平”关注公众号。 1. fastify Fastify 是一个高效且快速的 Node.js web 框架&#xff0c;专为提供最佳的性能而设计。它是相对较新的&#xff0c;但已经因其高性能和低开销而受到许多开发者的欢迎。Fastify 提供了一个简洁的开发体验&#xff0c;同时支持快…

【基于Ubuntu20.04的Autoware.universe安装过程】方案一:虚拟机 | 详细记录 | Vmware | 全过程图文 by.Akaxi

目录 一、Autoware.universe背景 二、虚拟机配置 三、Ubuntu20.04安装 四、GPU显卡安装 五、ROS2-Galactic安装 六、ROS2-dev-tools安装 七、rmw-implementation安装 八、pacmod安装 九、autoware-core安装 十、autoware universe dependencies安装 十一、安装pre-c…

光速入门spark(待续)

目录 Spark概述Spark 是什么Spark VS Hadoop (MapReduce)Spark or HadoopSpark四大特点速度快易于使用通用性强运行方式 Spark 框架模块&#xff08;架构&#xff09;Spark的运行模式Spark的架构角色 Spark环境搭建LocalStandaloneSpark程序运行层次结构 Spark on YARN部署模式…

有适合短视频剪辑软件的吗?分享4款热门软件!

在数字时代&#xff0c;短视频已成为人们获取信息、娱乐消遣的重要形式。随着短视频行业的蓬勃发展&#xff0c;市场上涌现出众多短视频剪辑软件&#xff0c;它们功能各异&#xff0c;各具特色。本文将为您详细介绍几款热门短视频剪辑软件&#xff0c;助您轻松掌握短视频剪辑技…

Linux拉取SVN服务器代码

1. window10系统上安装了Ubuntu&#xff0c;然后在Ubuntu上拉去SVN服务器的代码&#xff0c;我这是用VScode连接的ubuntu 终端Terminal&#xff0c;我这里相当于有三台电脑了&#xff0c;公司的服务器上windows的&#xff0c;svn代码就是在这台服务器里面&#xff0c;然后我又在…

idea集成git(实用篇)

0.Git常用命令 Git常用命令-CSDN博客 1.下载git Git - Downloads 一路傻瓜式安装即可&#xff08;NEXT&#xff09; 2.软件测试 在Windows桌面空白处&#xff0c;点击鼠标右键&#xff0c;弹出右键菜单 Git软件安装后&#xff0c;会在右键菜单中增加两个菜单 Git GUI He…

ClickHouse 指南(三)最佳实践 -- 跳数索引

Data Skipping Indexes Data Skipping Indexes 2 1、简介 影响ClickHouse查询性能的因素很多。在大多数情况下&#xff0c;关键因素是ClickHouse在计算查询WHERE子句条件时是否可以使用主键。因此&#xff0c;选择适用于最常见查询模式的主键对于有效的表设计至关重要。 然…

华为OD机试真题-靠谱的车-2023年OD统一考试(C卷)---Python3-开源

题目&#xff1a; 考察内容&#xff1a; 思维转化&#xff0c;进制转化&#xff0c;9进制转为10进制&#xff0c;在4的位置1&#xff0c;需要判断是否大于4 代码&#xff1a; """ 题目分析&#xff1a; 9进制转化为10进制23-25 39-50 399-500输入&#xff1a…

系统性能提升70%!华润万家某核心系统数据库升级实践

华润万家是华润集团旗下优秀零售连锁企业&#xff0c;业务覆盖中国内地及香港市场&#xff0c;面对万家众多业务需求和互相关联的业务环境&#xff0c;亟需加强各业务耦合性&#xff0c;以适应线上、线下、物流、财务等各个业务环境的快速发展。 随着信息技术的快速发展和数字化…

blender bvh显示关节名称

导入bvh&#xff0c;菜单选择布局&#xff0c;右边出现属性窗口&#xff0c; 在下图红色框依次点击选中&#xff0c;就可以查看bvh关节名称了。

ReentrantLock详解-可重入锁-默认非公平

ReentrantLock是Java中的一个可重入锁&#xff0c;也被称为“独占锁”。它基于AQS&#xff08;AbstractQueuedSynchronizer&#xff09;框架实现&#xff0c;是JDK中提供的一种线程并发访问的同步手段&#xff0c;与synchronized类似&#xff0c;但具有更多特性。 ReentrantLo…

【Linux】进程优先级和Linux内核进程调度队列的简要介绍

进程优先级 基本概念查看系统进程修改进程的优先级Linux2.6内核进程调度队列的简要介绍和进程优先级有关的概念进程切换 基本概念 为什么会存在进程优先级&#xff1f;   进程优先级用于确定在资源竞争的情况下&#xff0c;哪个进程将被操作系统调度为下一个运行的进程。进程…

【java】15:抽象类

当父类的一些方法不能确定时,可以用abstract关键字来修饰该方法&#xff0c;这个方法就是抽象方法&#xff0c;用abstract来修饰该类就是抽象类。 //我们看看如何把Animal做成抽象类&#xff0c;并让子类Cat类实现。 abstract class Animal{ String name; int age; abstract p…

【C++精简版回顾】12.友元函数

1.友元函数 1.class class MM { public:MM(int age,string name):age(age),name(name){}friend void print(MM mm); private:int age;string name;void print() {cout << age << "岁的" << name << "喜欢你" << endl;} }; f…

k8s 进阶实战笔记 | NFS 动态存储类的部署与使用

文章目录 NFS 动态存储类的部署与使用演示环境说明NFS subdir external provisioner准备 NFS 服务器手动部署 NFS Subdir External Provisioner部署 StorageClass验证使用更多信息 NFS 动态存储类的部署与使用 演示环境说明 演示环境信息&#xff1a;单机K3s 1.28.2 操作系统…

Ansible 简介安装

1、概念介绍 Ansible 是一款为类 Unix 系统开发的自由开源的配置和自动化工具。由 Red Hat 公司使用 python 研发&#xff0c;类似于 saltstack 和 Puppet&#xff0c;但是有一个不同和优点是我们不需要在节点中安装任何客户端。它使用 SSH 来和节点进行通信。Ansible 基于 Py…

信号系统之FFT卷积

1 Overlap-Add 方法 在许多 DSP 应用中&#xff0c;长信号必须分段过滤。例如&#xff0c;高保真数字音频需要大约 5 MB/min 的数据速率&#xff0c;而数字视频需要大约 500 MB/min 的数据速率。在数据速率如此之高的情况下&#xff0c;计算机通常没有足够的内存来同时保存要处…

【程序员英语】【美语从头学】初级篇(入门)(笔记)Lesson 16 At the Shoe Store 在鞋店

《美语从头学初级入门篇》 注意&#xff1a;被 删除线 划掉的不一定不正确&#xff0c;只是不是标准答案。 文章目录 Lesson 16 At the Shoe Store 在鞋店对话A对话B笔记会话A会话B替换 Lesson 16 At the Shoe Store 在鞋店 对话A A: Do you have these shoes in size 8? B:…

SQLlabs46关

看看源码 最终我们的id是放到order by后面了 如果我们直接用列去排序 ?sortusername/password username&#xff1a; passward 可以看到顺序是不同的&#xff0c;当然第一列第二列第三列也可以&#xff0c;基本上都是这个原理&#xff0c;那怎么去实现注入呢&#xff0c;我…
最新文章