算法训练营day24--93.复原IP地址 +78.子集 +90.子集II

一、93.复原IP地址

题目链接:https://leetcode.cn/problems/restore-ip-addresses/
文章讲解:https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html
视频讲解:https://www.bilibili.com/video/BV1fA4y1o715

1.1 初见思路

  1. 思路也不难,按个数来将数字进行分组,然后判断分出来的IP是否合法
  2. 递归终止条件是什么?这个需要想明白
  3. IP地址有两个限制:1-单个不能超过255 2-总共只有4段
  4. 判断IP段是否合法的内部函数应该怎么实现?

1.2 具体实现

class Solution {
    List<String> result = new ArrayList<>();
    String tempStr = "";
    public List<String> restoreIpAddresses(String s) {
        backtracing(s,0,0);
        return result;
    }

    public void backtracing(String str,int startIndex,int pointNum){
        if(pointNum==3){
            if(isValid(str,startIndex,str.length()-1)){
                tempStr+=str.substring(startIndex,str.length());
                result.add(tempStr);
                tempStr = tempStr.substring(0,startIndex);
            }
            return;
        }
        for(int i=startIndex;i<str.length();i++){
            if(isValid(str,startIndex,i)){
                String t1=tempStr;
                tempStr+=str.substring(startIndex,i+1)+".";
                pointNum++;
                backtracing(str,i+1,pointNum);
                pointNum--;
                tempStr = t1;
            }
            else{
                break;
            }
        }

    }

    // 判断字符串s在左闭⼜闭区间[start, end]所组成的数字是否合法
    private Boolean isValid(String s, int start, int end) {
        if (start > end) {
            return false;
        }
        if (s.charAt(start) == '0' && start != end) { // 0开头的数字不合法
            return false;
        }
        int num = 0;
        for (int i = start; i <= end; i++) {
            if (s.charAt(i) > '9' || s.charAt(i) < '0') { // 遇到⾮数字字符不合法
                return false;
            }
            num = num * 10 + (s.charAt(i) - '0');
            if (num > 255) { // 如果⼤于255了不合法
                return false;
            }
        }
        return true;
    }
}

1.3 重难点

  • 使用变量pointNum,记录添加逗点的数量,来作为判断递归终止条件

二、78.子集

题目链接:https://leetcode.cn/problems/subsets/
文章讲解:https://programmercarl.com/0078.%E5%AD%90%E9%9B%86.html
视频讲解:https://www.bilibili.com/video/BV1U84y1q7Ci

2.1 初见思路

  1. 常规递归题目

2.2 具体实现

`class Solution {
List<List> result = new ArrayList<>();// 存放符合条件结果的集合
LinkedList path = new LinkedList<>();// 用来存放符合条件结果

public List<List<Integer>> subsets(int[] nums) {
    subsetsHelper(nums, 0);
    return result;
}

private void subsetsHelper(int[] nums, int startIndex) {
    result.add(new ArrayList<>(path));// 「遍历这个树的时候,把所有节点都记录下来,就是要求的子集集合」。
    if (startIndex >= nums.length) { // 终止条件可不加
        return;
    }
    for (int i = startIndex; i < nums.length; i++) {
        path.add(nums[i]);
        subsetsHelper(nums, i + 1);
        path.removeLast();
    }
}

}`## 2.3 重难点

  • 这里path 使用LinkedList类,原因是这里频繁需要进行删除链表的最后一个元素,如果使用ArrayList的话,肯定效率没有LinkedList高,ArrayList底层是数组,查询快,LinkedList底层是链表,增删快;

三、 90.子集II

题目链接:https://leetcode.cn/problems/subsets-ii/
文章讲解:https://programmercarl.com/0090.%E5%AD%90%E9%9B%86II.htm
视频讲解:https://www.bilibili.com/video/BV1vm4y1F71J/

3.1 初见思路

  1. 包含重复元素,把原数组排序后,然后使用startIndex来控制
  2. 排序后,相同的元素不重复处理

3.2 具体实现

class Solution {

    List<List<Integer>> res = new ArrayList<>();
    LinkedList<Integer> path = new LinkedList<>();

    public List<List<Integer>> subsetsWithDup(int[] nums) {
        Arrays.sort(nums);
        subsetsWithDupHelper(nums, 0);
        return res;
    }

    private void subsetsWithDupHelper(int[] nums, int start) {
        res.add(new ArrayList<>(path));

        for (int i = start; i < nums.length; i++) {
            // 跳过当前树层使用过的、相同的元素
            if (i > start && nums[i - 1] == nums[i]) {
                continue;
            }
            path.add(nums[i]);
            subsetsWithDupHelper(nums, i + 1);
            path.removeLast();
        }
    }

}

3.3 重难点

在这里插入图片描述

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

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

相关文章

MyBatis入门案例

实施前的准备工作&#xff1a; 1.准备数据库表2.创建一个新的springboot工程&#xff0c;选择引入对应的起步依赖&#xff08;mybatis、mysql驱动、lombok&#xff09;3.在application.properties文件中引入数据库连接信息4.创建对应的实体类Emp&#xff08;实体类属性采用驼峰…

终身免费的Navicat数据库,不需要破解,官方支持

终身免费的Navicat数据库&#xff0c;不需要破解&#xff0c;官方支持 卸载了Navicat&#xff0c;很不爽上干货&#xff0c;Navicat免费版下载地址 卸载了Navicat&#xff0c;很不爽 公司不让用那些破解的数据库软件&#xff0c;之前一直使用Navicat。换了几款其他的数据库试了…

WebStorm 2024 for Mac JavaScript前端开发工具

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff08;适合自己的M芯片版或Intel芯片版&#xff09;&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功3、打开访达&#xff0c;点击【文…

web权限到系统权限 内网学习第一天 权限提升 使用手工还是cs???msf可以不??

现在开始学习内网的相关的知识了&#xff0c;我们在拿下web权限过后&#xff0c;我们要看自己拿下的是什么权限&#xff0c;可能是普通的用户权限&#xff0c;这个连添加用户都不可以&#xff0c;这个时候我们就要进行权限提升操作了。 权限提升这点与我们后门进行内网渗透是乘…

代码查重软件-自力更生

为了减轻工作量&#xff0c;自研了简单实用的代码查重工具&#xff0c;可以对若干文件之间进行查重。通过调试&#xff0c;相似度大于80%的没有一个是冤枉的。好用。去掉雷同的&#xff0c;其他的代码再慢慢看。

pads layout 脚本导出不能运行excle解决办法

在一台新的电脑上安装好PADS&#xff0c;打开PCB文件导出坐标文件时&#xff1a; 出现“ActiveX Automation: server could not be found.”的问题,导致无法成功导出文件,错误提示截图如下&#xff1a; 导致上述问题的原因是在我们配置导出带坐标的脚本时,默认使用的是微软…

服务器连接不上

记录今天2024/07/02的问题&#xff1a; 我今天真的是非常无语&#xff0c;今天在连服务器的时候&#xff0c;突然发现连不上了。 后来才意识到&#xff0c;原来是我笔记本先是开了全局代理&#xff0c;然后再用easy connected连接。当时还跳出了一个窗口如下&#xff0c;我当时…

2024 MWC上海:创新力量驱动未来先行,移远智慧点亮数字蓝海

6月26日&#xff0c;2024年世界移动通信大会&#xff08;MWC上海&#xff09;如期举行&#xff0c;今年的展会以“未来先行”为主题&#xff0c;涵盖“超越 5G、数智制造和人工智能经济”三大技术主题。移远通信作为全球物联网行业的引领者之一&#xff0c;今年不仅在展示内容上…

性能调优 性能监控

1.影响性能考虑点包括&#xff1a; 数据库、应用程序、中间件(tomcat、nginx)、网络和操作系统等方面。 首先考虑自己的应用属于 CPU密集型 还是 IO密集型 cpu密集型 计算&#xff0c;排序&#xff0c;分组查询&#xff0c;各种算法 IO密集型 网络传输&#xff0c;磁盘读…

将数据切分成N份,采用NCCL异步通信,让all_gather+matmul尽量Overlap

将数据切分成N份,采用NCCL异步通信,让all_gathermatmul尽量Overlap 一.测试数据二.测试环境三.普通实现四.分块实现 本文演示了如何将数据切分成N份,采用NCCL异步通信,让all_gathermatmul尽量Overlap 一.测试数据 1.测试规模:8192*8192 world_size22.单算子:all_gather:0.035…

JDBC链接kerberos认证的impala数据库报错问题解决

先上代码 public static Connection connectToImpala() {try {log.info("ketTabPath:" ketTabPath);log.info("krb5Path:" krb5Path);System.setProperty("java.security.krb5.conf", krb5Path);System.setProperty("sun.security.krb5.…

冒泡排序、选择排序、菱形

冒泡排序、选择排序、菱形 文章目录 一、冒泡排序二、选择排序三、菱形 一、冒泡排序 思路&#xff1a; 外层&#xff08;第一层&#xff09;循环控制循环次数&#xff0c;和业务无关 内层&#xff08;第二层&#xff09;循环用于比较相邻的2个值的大小&#xff0c;根据小到大…

用MySQL+node+vue做一个学生信息管理系统(五):学生信息增删改的实现

先实现增加信息&#xff1a; post参数的获取&#xff1a;express中接受post请求参数需要借助第三方包 body-parser 下载npm install body-parser //引入body-parser模块 const bodyParser require(body-parser); //拦截所有请求,配置body-parser模块 //extended:false 方法…

TransMIL:基于Transformer的多实例学习

MIL是弱监督分类问题的有力工具。然而&#xff0c;目前的MIL方法通常基于iid假设&#xff0c;忽略了不同实例之间的相关性。为了解决这个问题&#xff0c;作者提出了一个新的框架&#xff0c;称为相关性MIL&#xff0c;并提供了收敛性的证明。基于此框架&#xff0c;还设计了一…

昇思MindSpore学习总结六——函数式自动微分

神经网络的训练主要使用反向传播算法&#xff0c;模型预测值&#xff08;logits&#xff09;与正确标签&#xff08;label&#xff09;送入损失函数&#xff08;loss function&#xff09;获得loss&#xff0c;然后进行反向传播计算&#xff0c;求得梯度&#xff08;gradients&…

怎么使用MarkDown画矩阵

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 今天写文章需要用到矩阵&#xff0c;记录一下 画矩阵需要用到特殊的语法 &#xff08;1&#xff09;画普通矩阵&#xff0c;不带括号的 $$be…

SHA1算法

什么是SHA1算法&#xff08;Secure Hash Algorithm&#xff09; SHA1算法也是一种哈希算法&#xff0c;也称单向散列算法&#xff0c;不可逆&#xff0c;适用于数字签名标准。与MD5大同小异。 算法流程 &#xff08;1&#xff09;明文处理&#xff0c;对明文进行填充&#x…

一文揭秘:CRM如何助力家居建材企业可持续发展?

01、家居建材行业业务高速发展&#xff0c;对数字化转型提出越来越高诉求 家居建材行业是国民经济的重要基础产业&#xff0c;是改善人居条件、治理生态环境和发展循环经济的重要支撑。家居建材是土木工程和建筑工程中使用材料的统称&#xff0c;包括天花板、瓷砖、门、窗、锁…

【Rust基础入门】Hello Cargo

文章目录 前言Cargo是什么&#xff1f;Cargo的作用查看cargo版本使用cargo创建项目Cargo.toml文件cargo build命令cargo runcargo check为发布构建 总结 前言 在Rust编程中&#xff0c;Cargo扮演着至关重要的角色。它是Rust的包管理器&#xff0c;负责处理许多任务&#xff0c…

echarts用pictorialBar实现3D柱状图

先看下效果 实现思路 描绘一个普通的柱状图通过象形柱图&#xff08;pictorialBar&#xff09;在柱状图的顶部添加一个图形类型&#xff08;symbol&#xff09;菱形 代码实现 <template><div id"symbolBar"></div> </template> <scrip…