首页 > 编程语言 >每日算法Day16【复原IP地址、子集、子集II】

每日算法Day16【复原IP地址、子集、子集II】

时间:2025-01-12 17:33:27浏览次数:3  
标签:return nums int II Day16 子集 path new

93.复原IP地址

算法链接:

93. 复原 IP 地址 - 力扣(LeetCode)


类型: 回溯
难度: 中等

思路:

终止条件:IP地址中总共有3个分割点。

每层搜索逻辑:每段数字大小介于0~255之间,通过索引index截取字符串。

题解:

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

    public List<String> restoreIpAddresses(String s) {
        if (s.length() > 12) return result; // 算是剪枝了
        backTrack(s, 0, 0);
        return result;
    }

    // startIndex: 搜索的起始位置, pointNum:添加逗点的数量
    private void backTrack(String s, int startIndex, int pointNum) {
        if (pointNum == 3) {// 逗点数量为3时,分隔结束
            // 判断第四段⼦字符串是否合法,如果合法就放进result中
            if (isValid(s,startIndex,s.length()-1)) {
                result.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++;
                backTrack(s, i + 2, pointNum);// 插⼊逗点之后下⼀个⼦串的起始位置为i+2
                pointNum--;// 回溯
                s = s.substring(0, i + 1) + s.substring(i + 2);// 回溯删掉逗点
            } 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;
    }
}

78.子集

算法链接:

78. 子集 - 力扣(LeetCode)


类型: 回溯
难度: 中等

思路:通过数组得到子集,转化为树结构,每个节点都收集路径到结果集里。

题解:

class Solution {
    List<List<Integer>> res = new ArrayList<>();
    public List<List<Integer>> subsets(int[] nums) {
        build(nums,new LinkedList<Integer>(),0);
        return res;
    }

    void build(int[] nums,LinkedList<Integer> path,int idx){
        res.add(new ArrayList(path));
        for(int i=idx;i<nums.length;i++){
            path.add(nums[i]);
            build(nums,path,i+1);;
            path.removeLast();
        }
    }
}

90.子集II

算法链接:

90. 子集 II - 力扣(LeetCode)


类型: 回溯
难度: 中等

思路:题目要求解集 不能 包含重复的子集,则需要在同一层的情况下进行去重。

题解:

class Solution {
    List<List<Integer>> res = new ArrayList<>();
    boolean[] used = null;
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        Arrays.sort(nums);
        used = new boolean[nums.length];
        build(nums,new LinkedList(),0);
        Arrays.fill(used,true);
        return res;
    }

    void build(int[] nums,LinkedList<Integer> path,int idx){
        res.add(new ArrayList(path));
        if(idx>= nums.length){
            return;
        }
        for(int i = idx;i<nums.length;i++){
            if(i>0&&nums[i]==nums[i-1]&&used[i-1]){
                continue;
            }
            path.add(nums[i]);
            used[i]=false;
            build(nums,path,i+1);
            path.removeLast();
            used[i]=true;
        }
    }
}

标签:return,nums,int,II,Day16,子集,path,new
From: https://blog.csdn.net/2303_76696898/article/details/145072758

相关文章

  • 数据结构与算法之二叉树: LeetCode 117. 填充每个节点的下一个右侧节点指针 II (Ts版)
    填充每个节点的下一个右侧节点指针IIhttps://leetcode.cn/problems/populating-next-right-pointers-in-each-node-ii/description/描述给定一个二叉树:structNode{intval;Node*left;Node*right;Node*next;}填充它的每个next指针,让这个指针指向其......
  • 如何定期清理IIS的错误记录日志文件以防止磁盘空间不足?
    随着IIS组件的长期使用,错误日志文件会逐渐增大,可能导致磁盘空间被占满,进而影响服务器性能和网站正常运行。因此,定期清理IIS的错误记录日志文件非常重要。以下是详细的清理步骤和注意事项,帮助您有效管理日志文件,确保系统稳定运行:了解日志文件位置:IIS的错误日志文件通常存储在以......
  • 【LeetCode: 240. 搜索二维矩阵 II + 指针 + 遍历】
    ......
  • .NET 9.0 WebApi 发布到 IIS 详细步骤
            微软表示,.NET9是迄今为止性能最高的.NET版本,对运行时、工作负载和语言方面进行了1,000多项与性能相关的改进,并采用了更高效的算法来生成更好的代码。        .NET9是.NET8的继任者,特别侧重于云原生应用和性能。作为标准期限支持(STS)......
  • 在IIS Express下部署NuGet私服
    用途个人开发,部署自己的NuGetpkg.环境Win11IISExpress(轻度使用,不安装IIS,而使用VS预装的IISExpress)VS2022步骤开发环境准备因我拟用NuGet.Server,它最后的版本是基于.NETFramework4.6。传统的Web项目VS2022默认已不预装,需要手动安装项目模板。新建Asp.NETWebSite......
  • IIS6 MP4无法播放视频或无法找到文件的解决方法
    在WindowsServer2003的IIS6中,MP4文件无法播放通常是因为IIS没有正确配置MP4文件的MIME类型。为了解决这个问题,请按照以下步骤操作:检查文件路径和URL路径:确保上传的MP4文件路径正确。确认播放代码中的URL路径正确无误。配置IIS的MIME类型:打开IIS管理器。在需要设置......
  • LeetCode热题100(二十六) —— 142.环形链表II
    LeetCode热题100(二十六)——142.环形链表II题目描述代码实现思路解析你好,我是杨十一,一名热爱健身的程序员在Coding的征程中,不断探索与成长LeetCode热题100——刷题记录(不定期更新)此系列文章用于记录我在学习LeetCode热题100过程中的总结和收获愿与诸君共同探讨,在......
  • 代码随想录算法训练营第4天 | 24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,面
    一、刷题部分1.124.两两交换链表中的节点原文链接:代码随想录题目链接:24.两两交换链表中的节点-力扣(LeetCode)1.1.1题目描述给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:输......
  • 在IIS上实现部署https和域名的服务网址
    在IIS上实现部署https和域名的服务网址一、开发背景原本公司的项目都是在局域网中进行开发与部署,但是有一个系统需要用到微信小程序,并且小程序需要对外开发使用,微信小程序本身部署就要求后端的地址是使用https和域名的格式,因此需要将服务器的端口向外暴露,并且配置https和......
  • 摘樱桃II
    摘樱桃II“作为一个合格的程序员,理应具有修bug修到凌晨4点的魄力”戳我查看原题。题目大意给定一个矩阵,矩阵中的每个数代表该点的樱桃个数。Robot1、Robot2分别从左上角与右上角出发,每次只能选择向正下方、左下方、右下方三个方向移动去采摘樱桃,到达矩阵的最后一行终止。若Ro......