代码随想录算法训练营第24天 | 题目:93.复原IP地址 、78.子集 、 90.子集II

news2024/9/28 13:16:58

代码随想录算法训练营第24天 | 题目:93.复原IP地址 、78.子集 、 90.子集II

文章来源:代码随想录

题目名称: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 中的任何数字。你可以按 任何 顺序返回答案。

示例 1:

输入:s = “25525511135”
输出:[“255.255.11.135”,“255.255.111.35”]
示例 2:

输入:s = “0000”
输出:[“0.0.0.0”]
示例 3:

输入:s = “101023”
输出:[“1.0.10.23”,“1.0.102.3”,“10.1.0.23”,“10.10.2.3”,“101.0.2.3”]

解答思路:

回溯三部曲
1.递归参数
在131.分割回文串 (opens new window)中我们就提到切割问题类似组合问题。
startIndex一定是需要的,因为不能重复分割,记录下一层递归分割的起始位置。
本题我们还需要一个变量pointNum,记录添加逗点的数量。
2.递归终止条件
终止条件和131.分割回文串 (opens new window)情况就不同了,本题明确要求只会分成4段,所以不能用切割线切到最后作为终止条件,而是分割的段数作为终止条件。
pointNum表示逗点数量,pointNum为3说明字符串分成了4段了。
然后验证一下第四段是否合法,如果合法就加入到结果集里
3.单层搜索的逻辑
在131.分割回文串 (opens new window)中已经讲过在循环遍历中如何截取子串。
在for (int i = startIndex; i < s.size(); i++)循环中 [startIndex, i] 这个区间就是截取的子串,需要判断这个子串是否合法。
如果合法就在字符串后面加上符号.表示已经分割。
如果不合法就结束本层循环,如图中剪掉的分支:
在这里插入图片描述
然后就是递归和回溯的过程:
递归调用时,下一层递归的startIndex要从i+2开始(因为需要在字符串中加入了分隔符.),同时记录分割符的数量pointNum 要 +1。
回溯的时候,就将刚刚加入的分隔符. 删掉就可以了,pointNum也要-1。
判断子串是否合法
最后就是在写一个判断段位是否是有效段位了。
主要考虑到如下三点:
1.段位以0为开头的数字不合法
2.段位里有非正整数字符不合法
3.段位如果大于255了不合法

困难:

类似于分割回文串的结构,使用回溯,需要清楚结束的条件以及其中蕴含的剪枝操作。

题目名称:78.子集

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例: 输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]

第一想法:

先想这颗二叉树怎么画,每一层选取一位,不包含重复元素,则startindex需要为i+1。由于需要所有子集,所以要求记录所有节点而非叶子节点。
尝试使用模板

  1. 需要一个nums和startindex,path记录所有节点,result记录每个子集
  2. 当statindex>=nums.length截止
  3. 单层操作:path.add(nums[i]);
    subsetsHelper(nums,i+1);
    path.removeLast();

解答思路:

在这里插入图片描述

收获:

同样是一道模板题:但是要清楚子集问题和组合问题、分割问题的的区别,子集是收集树形结构中树的所有节点的结果。
而组合问题、分割问题是收集树形结构中叶子节点的结果。

题目名称:90.子集II

给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:

输入: [1,2,2]
输出: [ [2], [1], [1,2,2], [2,2], [1,2], [] ]

第一想法:

和上一道题的区别在于有重复元素,以及重复元素不能重复使用。相似于40.组合总和,同样需要used数组用作提示数组,当nums[i-1]==nums[i],进行剪枝操作,大体的逻辑是与78.子集 相同的。只是要加入去重操作

解答思路:

在这里插入图片描述

class Solution {
       List<List<Integer>> result = new ArrayList<>();// 存放符合条件结果的集合
   LinkedList<Integer> path = new LinkedList<>();// 用来存放符合条件结果
     boolean[] used;
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        if(nums.length==0){
             result.add(path);
            return result;
        }
        Arrays.sort(nums);
        used= new  boolean[nums.length];
    subsetsWithDupHelper(nums,0);
    return result;
    }
    private void subsetsWithDupHelper(int[] nums, int startIndex){
         result.add(new ArrayList<>(path));
        if (startIndex >= nums.length){
            return;
        }
        for(int i=startIndex;i<nums.length;i++){
            if(i>0&&nums[i-1]==nums[i]&&!used[i-1]){
                 continue;
            }
            path.add(nums[i]);
            used[i] = true;
            subsetsWithDupHelper(nums, i + 1);
            path.removeLast();
            used[i] = false;
        }
    }
}

收获:

实际上发现问题在于去重,联想到40题中的去重操作,修改代码即可

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

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

相关文章

Apache EChart前端图表

目录 一、了解Apache EChart 1.1 什么是Apache Echart 1.2 为什么要使用图表 1.3 常见的图表以及特点 二、Apache EChart的基本使用 2.1 下载echarts.js 2.2 echart基本使用案例 三、多类型图表的使用 3.1 柱状图(type:bar) --基本柱状图 --多系列柱状图 --堆叠柱状图…

我面试了个目标 50w 的大厂老哥,很符合预期

大家好&#xff0c;我是程序员鱼皮。上周我直播模拟面试了一位很优秀的老哥&#xff0c;有些感受想和朋友们分享分享。 先简单介绍一下&#xff1a;老哥是一本硕士出身 在大厂做后端开发 2 年&#xff0c;buff 拉满&#xff0c;目标是通过跳槽冲击 50 万的年薪。 说实在的&a…

Python 如何进行图像处理(OpenCV, PIL)

图像处理是计算机视觉的重要组成部分&#xff0c;它涉及对数字图像进行分析、修改和处理。在Python中&#xff0c;OpenCV和Pillow&#xff08;PIL是Pillow的前身&#xff09;是两个非常流行的图像处理库。 一、OpenCV简介 OpenCV&#xff08;Open Source Computer Vision Lib…

【文心智能体】梗图七夕版,一分钟让你看懂如何优化prompt,以及解析低代码工作流编排实现过程和零代码结合插件实现过程,依然是干货满满,进来康康吧

目录 背景什么是梗图梗图概念梗图结构 低代码开发最小运行单元大模型链提示词模板文心模板输出效果 测试工具链HTTP请求工具 梗图工具链全流程 梗图优化Prompt提示词优化后梗图结构提示词前后对比优化前效果优化后效果API接口BOS图片水印 梗图插件格式说明构思插件清单文件定义…

21天学通C++:理解智能指针、IO流、异常处理

理解智能指针 管理堆&#xff08;或自由存储区&#xff09;中的内存时&#xff0c;C程序员并非一定要使用常规指针&#xff0c;而可使用智能指针。 什么是智能指针 简单地说&#xff0c;C智能指针是包含重载运算符的类&#xff0c;其行为像常规指针&#xff0c;但智能指针能…

Spring通过注解优雅实现工厂模式

Spring通过注解优雅实现工厂模式 工厂模式作为开发者&#xff0c;应该都是耳熟能详的&#xff0c;在课本上、在网络上都会有无数的案例&#xff0c;是一个简单、确十分好用的设计模式。但是实现它的方法有很多&#xff0c;早年见过最多的就是用 if 判断类型&#xff0c;然后返回…

Docker部署Minio并配置域名访问

Docker部署Minio并配置域名访问 1、拉取镜像 docker pull minio/minio:RELEASE.2024-08-03T04-33-23Z-cpuv12、启动容器 # 创建数据目录 mkdir /data/minio # 创建配置目录 mkdir /root/.minio # 启动容器(如果不配置域名访问MINIO_BROWSER_URL、MINIO_SERVER_URL可以不用配…

springboot书画在线学习网站-计算机毕业设计源码11849

摘 要 本篇论文旨在设计和开发基于SpringBoot的书画在线学习网站&#xff0c;提供用户便捷的学习方式和丰富的学习资源。在该系统中&#xff0c;用户可以通过网站浏览书画的相关内容&#xff0c;包括诗公告消息、书画资讯、课程信息等。同时&#xff0c;系统还将提供书画的学习…

第七在线联手深服协:以科技之力,绘就时尚 AI 智能商品管理新篇章

7月30日&#xff0c;在深圳&#xff0c;一场堪称行业精英云集、科技锋芒毕露的“科技赋能时尚前沿沙龙”圆满落幕。这场盛会由 7thonline 第七在线与深圳服装行业协会&#xff08;简称“深服协”&#xff09;携手打造&#xff0c;深度聚焦 AI 智能商品管理在时尚天地的创新运用…

Liunx 小程序之进度条

Liunx 小程序之进度条 效果前提条件回车和换行缓冲区倒计时 进度条纯进度条模拟下载的进度条Progressbar.hProgressbar.cmain.cmakefile 效果 先来看效果&#xff0c;这其实是一个动态的进度条&#xff0c;后有源码&#xff0c;运行即可&#xff1a; 前提条件 在制作之前有两…

springboot仓库人力资源管理系统-计算机毕业设计源码45130

摘 要 仓库人力资源管理系统作为一种先进的信息技术工具&#xff0c;在企业中扮演着重要的角色。本文旨在深入探讨SpringBoot仓库人力资源管理系统的各项功能及其优势&#xff0c;以及对企业运营所带来的深远影响。 首先&#xff0c;我们详细探讨了SpringBoot仓库人力资源管理…

Opencv学习-图像变换

1. 图像连接 图像连接是指将两个具有相同高度或者宽度的图像连接在一起&#xff0c;图像的下&#xff08;左&#xff09;边缘是另一个图像的上&#xff08;右&#xff09;边缘。图像连接常在需要对两幅图像内容进行对比或者内容中存在对应信息时显示 对应关系时使用。例如&…

全国十大起名大师排行榜,中国最厉害三个起名大师是谁?

全国十大起名大师排行榜&#xff0c;中国最厉害三个起名大师是谁&#xff1f; 山东济南最受欢迎的起名大师有多位&#xff0c;其中较为知名的包括&#xff1a; ‌颜廷利&#xff0c;被誉为山东济南最出名的起名大师之一&#xff0c;还是现代山东文化名人&#xff0c;通过魔方解…

人工智能时代下,国产服务器操作系统如何加快发展?

人工智能时代下&#xff0c;国产服务器操作系统如何加快发展&#xff1f; 云智融合浪潮下&#xff0c;服务器操作系统产业未来发展将走向何方&#xff1f;英特尔和龙蜥的合作&#xff0c;能为国产操作系统的发展带来什么&#xff1f;双方如何通过合作布局“云AI”时代的未来&am…

配有知识库的AI助手与大模型问答相比,各有哪些优缺点?

1. 配有知识库支持的AI助手 优点&#xff1a; 精确性&#xff1a;知识库是由专业人员整理和维护的&#xff0c;其中的信息通常是经过验证和准确的。因此&#xff0c;配有知识库的AI助手可以提供准确的答案&#xff0c;并且在特定领域的问题上表现良好。可控性&#xff1a;知识…

合并重叠的区间

这一题不能用差分数组&#xff0c;因为 [1 , 4] [5, 6] 这个就会被合并&#xff0c;正确的做法就是先排序 bool cmp(vector<int> a, vector<int> b) {if (a[0] < b[0]) return 1;if (a[0] b[0]) return a[1] < b[1];return 0; } class Solution { public:ve…

Python酷库之旅-第三方库Pandas(065)

目录 一、用法精讲 256、pandas.Series.sparse方法 256-1、语法 256-2、参数 256-3、功能 256-4、返回值 256-5、说明 256-6、用法 256-6-1、数据准备 256-6-2、代码示例 256-6-3、结果输出 257、pandas.DataFrame.sparse方法 257-1、语法 257-2、参数 257-3、功…

分享一个基于人脸识别的小区物业管理系统Spring Boot(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

我花了一天时间,搭了个专属知识库,部署上线了,手把手教,不信你学不会

自动开了这个号以后&#xff0c;陆陆续续写了很多干货文章&#xff0c;一方面是可以帮助自己梳理思路&#xff0c;另一方面也方便日后查找相关内容。 但是&#xff0c;我想检索某个关键词是在之前哪篇文章写过的&#xff0c;就有点捉急了。CSDN 还好&#xff0c;可以检索到相关…

Python 算法交易实验77 QTV200日常推进-经典策略

说明 最初(去年7月)快快上了一版&#xff0c;到现在差不多正好一年。总体上当时做的还是蛮粗糙的&#xff0c;没有考虑模式&#xff0c;只是简单的用判别模型做了一道。 过去的一年&#xff0c;显然不是特别好的一年。我知道的大部分还是以亏损居多。这版策略竟然没有亏钱&am…