算法学习day24-回溯

复原IP地址

核心思路

  • 也是用切割法, 只是切割完之后, 判断一下切割的元素是否符合ip地址的要求: 不以0开头、<=255

    java 复制代码
    public List<String> restoreIpAddresses(String s) {
        findIp(s, 0, 0, new StringBuilder());
        return res;
    }
    
    private final List<String> res = new ArrayList<>();
    
    public void findIp(String s, int index, int count, StringBuilder sb) {
        if (count > 4) {
            return;
        }
        if (count == 4 && index == s.length()) {
            res.add(sb.substring(0, sb.length() - 1));
            return;
        }
        if (count == 4 && index < s.length()) {
            return;
        }
        for (int i = index; i < s.length(); i++) {
            String substring = s.substring(index, i + 1);
            if (isIp(substring)) {
                sb.append(substring);
                sb.append(".");
                count++;
            } else if (substring.length() > 3) {
                break;
            } else {
                continue;
            }
            findIp(s, i + 1, count, sb);
            sb.delete(sb.length() - substring.length() - 1, sb.length());
            count--;
        }
    }
    
    private boolean isIp(String substring) {
        if (substring.length() > 3) {
            return false;
        }
        if (substring.charAt(0) == '0' && substring.length() > 1) {
            return false;
        }
        return Integer.parseInt(substring) <= 255;
    }

子集

核心思路

  • 和切割类似, 只是终止条件变了

    • 不是必须执行完整个数组才结束
    • 如果说组合问题和分割问题都是找树的子节点, 那么子集就是找树的所有节点
    JAVA 复制代码
    public List<List<Integer>> subsets(int[] nums) {
        findChild(nums, 0, new ArrayList<>());
        return subsetsRes;
    }
    
    private List<List<Integer>> subsetsRes = new ArrayList<>();
    
    public void findChild(int[] nums, int index, List<Integer> list) {
        subsetsRes.add(new ArrayList<>(list));
        for (int i = index; i < nums.length; i++) {
            int cur = nums[i];
            list.add(cur);
            findChild(nums, i + 1, list);
            list.removeLast();
        }
    }

子集2

核心思路

  • 就是子集+组合2的used逻辑

  • 记得排序

    java 复制代码
    private List<List<Integer>> subsetsRes = new ArrayList<>();
    
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        Arrays.sort(nums);
        findChild1(nums, 0, new ArrayList<>(), new int[nums.length]);
        return subsetsRes;
    }
    
    public void findChild1(int[] nums, int index, List<Integer> list, int[] used) {
        subsetsRes.add(new ArrayList<>(list));
        for (int i = index; i < nums.length; i++) {
            if (i > 0 && nums[i] == nums[i - 1] && used[i - 1] == 0) {
                continue;
            }
            int cur = nums[i];
            list.add(cur);
            used[i] = 1;
            findChild1(nums, i + 1, list, used);
            list.removeLast();
            used[i] = 0;
        }
    }
相关推荐
大侠归来1 小时前
C 语言 | 在函数中操作数组
c语言·c++·算法
怕浪猫6 小时前
GEO 优化到底是什么?AI时代内容创作者必须懂的新技能
算法·面试·github
朝朝辞暮i7 小时前
C++ 第 23 课:class —— 开始真正进入面向对象
开发语言·c++·算法
Evand J8 小时前
【MATLAB例程】三维RRT+APF避障路径规划与到达角(AOA)定位算法|三维路径优化与定位仿真例程
算法·matlab·路径规划·代码·定位·rrt·aoa
weixin_307779139 小时前
有限产能智能排产与动态重排智能体:从需求解构到技术实现
开发语言·人工智能·算法·架构
朝朝辞暮i9 小时前
C++ 第 27 课:智能指针 shared_ptr
开发语言·c++·算法
朝朝辞暮i10 小时前
C++ 第 29 课:回调函数 Callback
开发语言·c++·算法
青柠之夏cc10 小时前
AI与教育:个性化学习助手让“因材施教“成为现实,但代价是隐私?
人工智能·学习
Godspeed Zhao10 小时前
现代智能雷达技术14——算法(0)
线性代数·算法·雷达
可乐ea10 小时前
Agent 模型分级升级路由:用置信度阈值把贵模型省下来
人工智能·算法·机器学习·结构化输出·置信度路由·模型升级路由·大模型成本优化