首页 > 编程语言 >代码随想录算法训练营,9月20日 | 93.复原IP地址,78.子集,90.子集II

代码随想录算法训练营,9月20日 | 93.复原IP地址,78.子集,90.子集II

时间:2024-09-20 20:14:38浏览次数:1  
标签:20 nums int res 随想录 startIndex 子集 path backTracking

93.复原IP地址
题目链接:93.复原IP地址
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰复原IP地址
日期:2024-09-20

Java代码如下:

class Solution {
    List<String> res = new ArrayList<>();

    private void backTracking(String s, int startIndex, int pointNum){
        if(pointNum == 3){
            if(isValid(s, startIndex, s.length() - 1)){
                res.add(s);
            }
            return;
        }
        for(int i = startIndex; i < s.length(); i++) {
            if (isValid(s, startIndex, i)) {
                s = s.substring(0, i + 1) + "." + s.substring(i + 1);//在str的后⾯插⼊⼀个逗点
                pointNum++;
                backTracking(s, i + 2, pointNum);// 插⼊逗点之后下⼀个⼦串的起始位置为i+2
                pointNum--;// 回溯
                s = s.substring(0, i + 1) + s.substring(i + 2);// 回溯删掉逗点
            } else {
                break;
            }
        }
    }

    private boolean isValid(String s, int start, int end){
        if (start > end) {
            return false;
        }
        if (s.charAt(start) == '0' && start != end) {
            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) {
                return false;
            }
        }
        return true;
    }

    public List<String> restoreIpAddresses(String s) {
        backTracking(s, 0, 0);
        return res;
    }
}

78.子集
题目链接:78.子集
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰子集
日期:2024-09-20

想法:与前面组合问题不同点在于是要遍历树的所有节点,而不是叶子了,终止条件与for的范围是重叠了所以可以没有。
Java代码如下:

class Solution {
    List<Integer> path = new ArrayList<>();
    List<List<Integer>> res = new ArrayList<>();

    public void backTracking(int[] nums, int startIndex) {
        res.add(new ArrayList(path));
        
        for(int i = startIndex; i < nums.length; i++){
            path.add(nums[i]);
            backTracking(nums, i + 1);
            path.removeLast();
        }
    }

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

90.子集II
题目链接:90.子集II
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰子集II
日期:2024-09-20

想法:跟昨天去重手段一样。
Java代码如下:

//不用used数组
class Solution {
    List<Integer> path = new ArrayList<>();
    List<List<Integer>> res = new ArrayList<>();
    public void backTracking(int[] nums, int startIndex) {
        res.add(new ArrayList(path));
        for(int i = startIndex; i < nums.length; i++){
            if(i > startIndex && nums[i] == nums[i - 1]){
                continue;
            }
            path.add(nums[i]);
            backTracking(nums, i + 1);
            path.removeLast();
        }
    }
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        Arrays.sort(nums);
        backTracking(nums, 0);
        return res;
    }
}
//使用used数组
class Solution {
    List<Integer> path = new ArrayList<>();
    List<List<Integer>> res = new ArrayList<>();
    boolean[] used;
    public void backTracking(int[] nums, int startIndex) {
        res.add(new ArrayList(path));
        for(int i = startIndex; i < nums.length; i++){
            if(i > startIndex && used[i - 1] == false && nums[i] == nums[i - 1]){
                continue;
            }
            path.add(nums[i]);
            used[i] = true;
            backTracking(nums, i + 1);
            path.removeLast();
            used[i] = false;
        }
    }
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        used = new boolean[nums.length];
        Arrays.fill(used, false);
        Arrays.sort(nums);
        backTracking(nums, 0);
        return res;
    }
}

总结:注意判定条件i > startIndex才是进入同一层后面,写的时候想了好一会。

标签:20,nums,int,res,随想录,startIndex,子集,path,backTracking
From: https://www.cnblogs.com/wowoioo/p/18423199

相关文章

  • 9.20 模拟赛
    C.[CSP-S--三十连测第二十七套]--T3--fac-S---【云智计划】---6月30日---模拟测#27div2【补题】-比赛-梦熊联盟(mna.wang)题意\(n\)次询问,给定\(a,k\)。有一个可重集合,初始只有一个元素\(a\)。每次操作将集合中所有元素替换为它的所有约数。求\(k\)次操作后集......
  • 9月20c语言程序设计实验作业
    #include<stdio.h>#include<stdlib.h>//本程序用于统计优秀(A),及格(B),不及格(C)人数intmain(){   intA=0,B=0,C=0;   intn;//n是参与本次测试的学生人数   inthigh=0,low= 0;//划分线分数   printf("输入学生人数:\n");   scanf_s("%d......
  • 【游记】CSP2024 游记
    初赛Day4294967295:LFW:考前做一下前几年初赛卷。打开2020年初赛卷\(30\min\)later......“读程好烦,猜几个直接交了。”一眼丁真,鉴定为RP=-infSB复杂度计算能不能414好,赢。......
  • 未来通信抢先看!遨游通讯2024年中国国际信息通信展亮点剧透
    2024年中国国际信息通信展览会将于9月25日-27日在北京国家会议中心举行,本界展会以“推动数实深度融合,共筑新质生产力”为主题。在通信技术日新月异的今天,卫星通信、人工智能、低碳节能等技术理念正引领着通信行业迈向新的高度。遨游通讯作为“危、急、特”赛道的开创者,同时作为......
  • 博弈论学习笔记(2024.8.17)
    基本概念博弈定义:在一定条件下,遵守一定的规则,一个或几个拥有绝对理性思维的人或团队,从各自允许选择的行为或策略进行选择并加以实施,并从中各自取得相应结果或收益的过程。举几个例子来说说什么是博弈:经济学:股市是按照这样的方式运行的:每个人可以持有股票,如果抛出过多股票则股......
  • CSP-J2024年全真模拟题 阅读程序篇2
    因为明天考试,这回给大家准备了超详细的解析~ 22.程序中n和m只有输入正整数,程序的输出值才可能是YESA.对B.错23.程序中用到了递归函数boolfun(intn)A.对B.错24.若输入n和m都是素数,程序的输出值一定是YESA.对B.错25.若输入n和m的值分别是-1和2027,则程......
  • 0920
    线代舒尔公式,化上三角,下三角,对角阵范德蒙德行列式X型行列式,{主对角中下标之和为(2k+1)的两项乘积-副对角中下标之和为(2k+1)的两项乘积【需与前面两项下标号相同】}的连乘宽对角,a2=4bc,a2≠4bc 计组MAR位数说明存储单元位数MDR位数说明字长编译器:将高级语言翻译成汇编语言......
  • P2414 [NOI2011] 阿狸的打字机
    题目思路将每一个输出的串放入一个Trie树中。考虑离线处理询问\((x,y)\),对于每一个\(y\)集中处理所有的\(x\),\(y\)在Trie树上走,走过的点标记一下,结果就是\(x\)字符串结尾节点在fail树上的对应节点的子树的标记数量。记得在节点离开的时候撤销标记。代码#incl......
  • 【安徽大学主办丨ACM独立出版丨Fellow资深嘉宾与会报告】第四届计算机、人工智能与控
    第四届计算机、人工智能与控制工程国际学术会议(CAICE2025)将于2025年1月10-12日在合肥隆重举行!大会面向基础与前沿、学科与产业,建立起前沿的学术交流平台,将汇聚国内外专家、学者和企业界优秀人才,围绕着计算机、人工智能与控制工程等相关学科领域,探究学术界和产业界面临的机......
  • 【Py/Java/C++三种语言OD独家2024E卷真题】20天拿下华为OD笔试之【模拟】2024E-转骰子
    可上欧弟OJ系统练习华子OD、大厂真题绿色聊天软件戳od1441了解算法冲刺训练(备注【CSDN】否则不通过)文章目录相关推荐阅读题目描述与示例题目描述输入描述输出描述示例一输入输出说明示例二输入输出说明解题思路构建长度为6的数组表......