回溯

组合总和

中等#39Java时间 与搜索树和结果规模相关,粗略上界 O(n^(target/min))空间 O(target/min),不计结果

题目要做什么

候选数组含互异正整数,每个数可重复使用,返回和为 target 的所有组合。组合顺序不限,不能重复。

题目示例输入candidates = [2,3,6,7], target = 7
题目示例输出[[2,2,3],[7]]

01 为什么这样做

先排序。递归选择时允许再次选择当前下标,支持重复使用;下标不回退,避免排列重复。候选大于剩余目标时,后面更大的数也不可选,直接剪枝。

始终成立的条件

path 非递减,其和加 remaining 等于原目标。

02 看见算法执行

动画与代码同步

修改输入,播放自己的例子

当前使用题目示例
修改输入会改变执行过程;预期输出用于核对结果。
数组 / nums步骤 1
执行状态
本次演示输出播放到最后查看

Solution.java参考解法
1class Solution {2    public List<List<Integer>> combinationSum(int[] candidates, int target) {3        Arrays.sort(candidates);4        List<List<Integer>> result = new ArrayList<>();5        search(candidates, 0, target, new ArrayList<>(), result);6        return result;7    }8    private void search(int[] nums, int start, int remaining, List<Integer> path, List<List<Integer>> result) {9        if (remaining == 0) {10            result.add(new ArrayList<>(path));11            return;12        }13        for (int i = start; i < nums.length; i++) {14            if (nums[i] > remaining) break;15            path.add(nums[i]);16            search(nums, i, remaining - nums[i], path, result);17            path.remove(path.size() - 1);18        }19    }20}

键盘控制:A 后退 · D 前进

编程练习

↑↓ 选择↵ 打开Pagefind 全文检索