Day29 || 93.复原IP地址 、 78.子集 、90.子集II

93.复原IP地址

题目链接:力扣题目链接

思路:与“131.分割回文串”相似,回文中的回文检查替换为是否0开头和是否在0-255范围内的检查即可,回溯中需要检查current是否是4个部分且String是否用尽作为退出条件,for循环可以限制执只循环三次。

78.子集

题目链接:力扣题目链接

思路:从第一个数组就放入current中,不管怎样都放入最后的结果result中,迭代即可。

class Solution {
    List<List<Integer>> result = new ArrayList<>();
    List<Integer> current = new ArrayList<>();
    public List<List<Integer>> subsets(int[] nums) {
       backtracking(nums,0);
        return result;
    }
    public void backtracking(int[] nums,int j){
        result.add(new ArrayList<>(current));
        
        for(int i= j;i<nums.length;i++){
            current.add(nums[i]);
            backtracking(nums,i+1);
            current.remove(current.size()-1);
        }
        
    }
}

要清楚子集问题和组合问题、分割问题的的区别,子集是收集树形结构中树的所有节点的结果

而组合问题、分割问题是收集树形结构中叶子节点的结果

90.子集II

题目链接:力扣题目链接

思路:就是“78.子集”和“40.组合总和II”的组合而已。在递归for循环中添加一个判断即可。

class Solution {
    List<List<Integer>> result = new ArrayList<>();
    List<Integer> current = new ArrayList<>();
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        Arrays.sort(nums);
        backtracking(nums,0);
        return result;
    }
     public void backtracking(int[] nums,int j){
        result.add(new ArrayList<>(current));
        
        for(int i= j;i<nums.length;i++){
            if(i>j&&nums[i]==nums[i-1]){
                continue;
            }
            current.add(nums[i]);
            backtracking(nums,i+1);
            current.remove(current.size()-1);
        }
        
    }
}

时间:1.5h

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值