0
点赞
收藏
分享

微信扫一扫

leetcode1115. 交替打印 FooBar

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

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 条评论