二刷算法训练营Day28 | 回溯算法(4/6)

news2024/11/18 13:40:29

目录

详细布置:

1. 93. 复原 IP 地址

2. 78. 子集

3. 90. 子集 II


详细布置:

1. 93. 复原 IP 地址

有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。

  • 例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245""192.168.1.312" 和 "192.168@1.1" 是 无效 IP 地址。

给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。

有点类似LC 131,这个切割问题就可以使用回溯搜索法把所有可能性搜出来

class Solution:
    def restoreIpAddresses(self, s: str) -> List[str]:
        result = []
        self.backtracking(s, 0, 0, "", result)
        return result

    def backtracking(self, s, start_index, point_num, current, result):
        if point_num == 3:  # 逗点数量为3时,分隔结束
            if self.is_valid(s, start_index, len(s) - 1):  # 判断第四段子字符串是否合法
                current += s[start_index:]  # 添加最后一段子字符串
                result.append(current)
            return

        for i in range(start_index, len(s)):
            if self.is_valid(s, start_index, i):  # 判断 [start_index, i] 这个区间的子串是否合法
                sub = s[start_index:i + 1]
                self.backtracking(s, i + 1, point_num + 1, current + sub + '.', result)
            else:
                break

    def is_valid(self, s, start, end):
        if start > end:
            return False
        if s[start] == '0' and start != end:  # 0开头的数字不合法
            return False
        num = 0
        for i in range(start, end + 1):
            if not s[i].isdigit():  # 遇到非数字字符不合法
                return False
            num = num * 10 + int(s[i])
            if num > 255:  # 如果大于255了不合法
                return False
        return True

2. 78. 子集

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的

子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

建议:子集问题,就是收集树形结构中,每一个节点的结果。 整体代码其实和 回溯模板都是差不多的。

如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!

其实子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。

那么既然是无序,取过的元素不会重复取,写回溯算法的时候,for就要从startIndex开始,而不是从0开始!

class Solution:
    def subsets(self, nums):
        result = []
        path = []
        self.backtracking(nums, 0, path, result)
        return result

    def backtracking(self, nums, startIndex, path, result):
        result.append(path[:])  # 收集子集,要放在终止添加的上面,否则会漏掉自己
        # if startIndex >= len(nums):  # 终止条件可以不加
        #     return
        for i in range(startIndex, len(nums)):
            path.append(nums[i])
            self.backtracking(nums, i + 1, path, result)
            path.pop()

3. 90. 子集 II

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的 

子集(幂集)。解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。

建议:大家之前做了 40.组合总和II 和 78.子集 ,本题就是这两道题目的结合,建议自己独立做一做,本题涉及的知识,之前都讲过,没有新内容。

这道题和上一题区别就是集合里有重复元素了,而且求取的子集要去重。

从图中可以看出,同一树层上重复取2 就要过滤掉,同一树枝上就可以重复取2,因为同一树枝上元素的集合才是唯一子集!

class Solution:
    def subsetsWithDup(self, nums):
        result = []
        path = []
        used = [False] * len(nums)
        nums.sort()  # 去重需要排序
        self.backtracking(nums, 0, used, path, result)
        return result

    def backtracking(self, nums, startIndex, used, path, result):
        result.append(path[:])  # 收集子集
        for i in range(startIndex, len(nums)):
            # used[i - 1] == True,说明同一树枝 nums[i - 1] 使用过
            # used[i - 1] == False,说明同一树层 nums[i - 1] 使用过
            # 而我们要对同一树层使用过的元素进行跳过
            if i > 0 and nums[i] == nums[i - 1] and not used[i - 1]:
                continue
            path.append(nums[i])
            used[i] = True
            self.backtracking(nums, i + 1, used, path, result)
            used[i] = False
            path.pop()

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络协议四

一、云中网络 物理机的劣势: 1)一旦需要扩容 CPU、内存、硬盘,都需要去机房手动弄,非常麻烦 2)采购的机器往往动不动几百 G 的内存,而每个应用往往可能只需要 4 核 8G 3)一台机器,…

pnpm : 无法加载文件 C:\Users\xxxxx\AppData\Roaming\npm\pnpm.ps1,因为在此系统上禁止运行脚本。

vscode中执行pnpm install的时候,直接报了上面的错误。 解决: 然后输入:set-ExecutionPolicy RemoteSigned,按回车,然后根据提示,我们选A。 然后回车。 这样我们再次回到vscode中的我们就会发现可以了。 …

数字化浪潮下的制造业:WMS仓储系统功能与优势深度解析-亿发

近年来,国内经济增速放缓,中美贸易摩擦加剧,以及制造业产业迁移等因素,使得制造业面临着产能过剩和激烈竞争的局面。制造企业的仓库中常常堆积着大量原材料和积压的成品、半成品,这些库存占用了企业的大量流动资金&…

重点关注!2024年影响因子即将发布!

本周投稿推荐 SSCI • 中科院2区,6.0-7.0(录用友好) EI • 各领域沾边均可(2天录用) CNKI • 7天录用-检索(急录友好) SCI&EI • 4区生物医学类,0.5-1.0(录用…

STM32 MDK Keil5软件调试功能使用(无需连接硬件)

MDK Keil5 在线仿真STM32(无需连接硬件) 首先点击工具栏的魔术棒配置一下:(记得选择自己的STM32芯片类型) 开启调试 使用逻辑分析仪查看IO输出 会打开这个界面,点击左边的setup按钮 会打开这个窗口&am…

洗地机是智商税吗?家用洗地机哪个牌子好?2024年多功能洗地机推荐

洗地机是智商税吗?肯定不是!!!洗地机因为其功能集成了扫地、吸尘、拖地、烘干和消毒的功能,仅需一步操作即可完成所有清洁任务,大大的提升了人们的清洁效率,节省了人们清洁的时间和精力。那么&a…

Ant Design的创意之旅:设计师眼中的界面艺术

你知道什么是蚂蚁Ant Design?事实上,绝大多数人都不知道甚至没有听说过蚂蚁Ant Design,本文将围绕蚂蚁Ant Design是什么为大家深入分析,方便大家对蚂蚁Antt Design有清晰的认识。 1. 蚂蚁Ant Design是什么 蚂蚁Ant Design可以简…

PS系统教程14

铅笔以及颜色替换工具 铅笔工具 模式、不透明度和画笔工具都是一样的 自动抹除 一般默认状态下,画笔颜色与前景色保持一致。 涂满之后如果在图画其他颜色,这时候选择自动抹除,把背景色自动填充到画笔颜色 新建图层用前景色涂满整个画布…

5.2 模块之间的交互和通信方式方法总结

事件驱动通信: 事件驱动通信是一种通信模式,它基于事件的发生和相应来进行通信。在事件驱动通信中,各个组件之间通过发送事件来进行通信,而不是直接调用对方的方法。 事件驱动通信的基本原理是,当一个组件发生某个特…

DevExpress Data Grid

WinForms数据网格是一个由DirectX渲染引擎提供支持的高性能UI组件。数据网格(GridControl)提供了一个灵活的基于视图的体系结构,包括许多数据整形和UI自定义功能。数据网格可以显示和编辑来自任何大小和复杂度的任何数据源的数据。 数据绑定…

【Linux系统】线程与线程控制

本篇博客整理了Linux下线程的概念、线程控制的相关接口,旨在让读者初步认识线程,并为下一篇多线程作铺垫。 目录 一、线程是什么 1.线程是进程的执行流 2.线程的执行、调度、切换 3.页表分级与线程资源分配 4.线程的优缺点 二、线程控制 1.创建…

数据库管理-第201期 优先级事务-01(20240611)

数据库管理201期 2024-06-11 数据库管理-第201期 优先级事务-01(20240611)1 概念2 使用优先级事务2.1 配置会话优先级2.2 配置系统级别等待目标 2.3 确认自动回滚2.4 配置优先级事务模式2.5 使用优先级事务模式确定系统级等待目标 总结 数据库管理-第201…

北斗高精准定位:电动自行车行业的新引擎

近年来,随着科技的发展与智能化进程的加快,电动自行车行业也迎来了新的变革。毫无疑问,北斗高精度定位技术逐渐成为这一行业的关键突破。本文将详细探讨北斗高精度定位技术在电动自行车行业中的多样应用以及其带来的诸多优势。北斗系统的背景…

解决方案:昇腾aarch64服务器安装CUDA+GCC+CMake,编译安装Pytorch,华为昇腾HPC服务器深度学习环境安装全流程

目录 一、安装CUDA和cudnn1.1、下载CUDA驱动1.2、安装CUDA驱动1.3、配置环境变量1.4、安装cudnn1.5、安装magma-cuda 二、安装gcc编译器三、安装CMake四、安装NCCL五、编译安装Pytorch5.1、前提准备5.2、下载pytorch源码5.3、配置环境变量5.4、Pytorch编译安装5.5、测试Pytorch…

你想考取名牌大学吗?那就按我说的学与做

你想考取名牌大学吗?那就按我说的学与做 我讲的这一秘笈,是自己学生时代就读时的实践体会。 本人并不比别人聪慧,当年也正是凭借这一学习技巧,而获得各科均衡且良好成绩考取大学的。在上世纪八十年代,有多少人能考取…

比起本地渲染,渲染100网渲平台有哪些优势?渲染100邀请码1a12

渲染100是知名的网渲平台,比起本地渲染,它有以下几个优势。 1、价格低 渲染100价格便宜,15分钟2毛60分钟8毛的价格非常适合小图,一张图平均2.1元左右,非常的低了,选择渲染100可以节省成本。2、速度快 渲染…

STM32移植Easylogger输出

简介 EasyLogger 是一款超轻量级 、高性能的 C 日志库,非常适合对资源敏感的软件项目,例如:IoT 产品、可穿戴设备、智能家居等等。相比 log4c、zlog 这些知名的 C 日志库,EasyLogger 的功能更加简单,提供给用户的接口…

20240611在飞凌OK3588-C核心板的Linux系统下打通UART0和UART3

20240611在飞凌OK3588-C核心板的Linux系统下打通UART0和UART3 2024/6/11 7:45 Z:\OK3588_Linux_fs\kernel\arch\arm64\boot\dts\rockchip\OK3588-C-common.dtsi &pinctrl { m2 { net_m2_rst_gpio: net_m2_rst_gpio { rockchip,pins <1 RK_PC6 RK_…

轻松掌握两种方法,教你jpg图片怎么改大小kb

在数字时代&#xff0c;我们经常需要在网络上传、分享或存储图片&#xff0c;而其中一项常见的挑战就是将图片的文件大小调整到符合特定要求。对于JPEG格式的图片&#xff0c;改变其大小&#xff08;以KB为单位&#xff09;是一种常见的需求&#xff0c;特别是在网络上传限制或…

国产Sora真的来了!免费体验!实测快手可灵Kling文生视频大模型(附申请方法)

文章首发于公众号&#xff1a;X小鹿AI副业 大家好&#xff0c;我是程序员X小鹿&#xff0c;前互联网大厂程序员&#xff0c;自由职业2年&#xff0c;也一名 AIGC 爱好者&#xff0c;持续分享更多前沿的「AI 工具」和「AI副业玩法」&#xff0c;欢迎一起交流~ 自从年初&#xff…