LeetCode 39 Java 实现

1. 题目

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。

candidates 中的 同一个 数字可以无限制 重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。

对于给定的输入,保证和为 target 的不同组合数少于 150 个。

1 <= candidates.length <= 30
1 <= candidates[i] <= 200
candidate 中的每个元素都 互不相同
1 <= target <= 500
示例1

输入:candidates = [2,3,6,7], target = 7
输出:[[2,2,3],[7]]
解释:
2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。
7 也是一个候选, 7 = 7 。
仅有这两种组合。

示例2

输入: candidates = [2,3,5], target = 8
输出: [[2,2,2,2],[2,3,3],[3,5]]

示例3

输入: candidates = [2], target = 1
输出: []

2. 题解参考

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class LeetCode39_02_01 {
    // 定义返回的结果集
    public List<List<Integer>> ret = new ArrayList<>();
    // 临时存储单个结果(即组合)
    public List<Integer> tempList = new ArrayList<>();

    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        // 对数组进行排序方便后续的剪枝操作
        Arrays.sort(candidates);
        backTracking(candidates, target, 0);
        return ret;
    }

    /**
     * 回溯递归函数
     * @param candidates 提供数字的数组
     * @param target 当前递归剩余需要的目标整数
     * @param startIndex 当前递归开始遍历的索引位置
     */
    public void backTracking(int[] candidates, int target, int startIndex) {
        if (target == 0) {
            ret.add(new ArrayList(tempList));
            return;
        } else if (target < 0 || startIndex == candidates.length) {
            return;
        }

        // candidates[i] <= target 剪枝操作,由于之前进行了排序,所以当值大于 target 时
        // 后续的元素就不需要遍历了
        for (int i = startIndex; i < candidates.length && candidates[i] <= target; i++) {
            tempList.add(candidates[i]);
            // startIndex 取 i 表示可以重复取当前的值,以及之后的值
            backTracking(candidates, target - candidates[i], i);
            tempList.remove(tempList.size() - 1);
        }
    }
}

3. 解题思路

  • 感觉是一道相对平常的回溯题,整体思路可以参考我之前在 LeetCode 77 中的思路图。
  • 一个小变化,就是这道题可以重复取值,所以 startIndex 不需要 i+1

4. 代码下载

  1. Github algorithm-learning/LeetCode39_02_01.java at master · cc01cc/algorithm-learning: https://github.com/cc01cc/algorithm-learning/blob/master/practice/leetcode/LeetCode39_02_01.java
  2. (备用,非同步)城通网盘 algorithm-learning/LeetCode39_02_01.java: https://url57.ctfile.com/f/37032957-629196308-2fcb27?p=9427 (访问密码: 9427)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

零一魔法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值