0
点赞
收藏
分享

微信扫一扫

leetcode1115. 交替打印 FooBar

小典典Rikako 2023-12-14 阅读 46

1.暴力回溯+剪枝优化

 回溯算法三个常见步骤:

        确定返回值和参数列表

        确定终止条件:集合中所有元素遍历完,即startIndex>nums.size

        确定单层逻辑:使用uset来记录当前层用过的值。

注意: 子集递增,单不是严格递增,所以允许重复值存在。

            剪枝: 当前层当前树枝的重复值要剪枝。

                        递减子序列要剪枝。

List<List<Integer>> result=new ArrayList<>();
    LinkedList<Integer> path=new LinkedList<>();
    public List<List<Integer>> findSubsequences(int[] nums) {
        backtracking(nums,0);
        return result;
    }
    public void backtracking(int[] nums,int startIndex){
        //结果收集
        if(path.size()>=2) result.add(new ArrayList<>(path));
        if(startIndex>=nums.length) return;//可以省略,因为startIndex>=nums.length,下面循环不会进入
        //记录当前树枝当前层用过的值
        Set<Integer> uset=new HashSet<>();
        for(int i=startIndex;i<nums.length;i++){
            if(uset.contains(nums[i])){//当前树枝当前层树枝重复则剪枝
                continue;
            }
            if(path.size()!=0&&nums[i]< path.getLast()) continue;//递减时剪枝
            uset.add(nums[i]);
            path.add(nums[i]);
            backtracking(nums,i+1);
            path.removeLast();
        }
    }

2.分析

举报

相关推荐

0 条评论