Leetcode--Java--216. 组合总和 III

该博客探讨了如何使用深度优先搜索(DFS)和剪枝策略来解决LeetCode上的216题——组合总和III。问题要求找到所有和为n的正整数k个数的组合,限制数字范围为1到9,并确保组合中没有重复数字。解题思路是利用DFS进行搜索,并在满足特定条件下才将结果添加到集合中,以避免无效的路径和重复的组合。

题目描述

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

说明:

所有数字都是正整数。
解集不能包含重复的组合。

样例描述

示例 1:

输入: k = 3, n = 7
输出: [[1,2,4]]
示例 2:

输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]

思路

DFS + 剪枝

  1. 两个条件都满足才加入结果集,如果只满足其中一个就直接返回。(剪枝)
  2. 用当前下标表示从1~9来选,不需要另外的判重数组,下标控制循环保证不会重复。

代码

class Solution {
    List<List<Integer>> res = new ArrayList<>();
    List<Integer> path = new ArrayList<>();
    public List<List<Integer>> combinationSum3(int k, int n) {
       dfs(k, n, 0, 0, 1);
       return res;
    }
    public void dfs(int k, int n, int sum, int cnt, int idx) {
        //总和为n,并且数的个数为n时
        if (cnt == k && sum == n) {
           res.add(new ArrayList<>(path));
        }
        //如果只满足其中一个条件,就返回
        if (cnt == k || sum == n) return;
        //开始枚举1~9,用idx来控制循环保证不重复
        for (int i = idx; i <= 9; i ++ ) {
            //i既是下标,也作为值
            path.add(i);
            dfs(k, n, sum + i, cnt + 1, i + 1);
            path.remove(path.size() - 1);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值