每日一题8.10 lc39

39. 组合总和

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

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

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

示例 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,2,3以及2,3,2的重复答案。

要解决这个问题最好的办法就是先进行排序(ps.数组先排序在绝大多数情况都能大大简化骤),然后记录每一步的开始位置,例如循环从2开始则下一步的递归也从2开始。因为我们已经将数组排序好了,所以所有已经过循环的数字都可以确定为不会再使用。

java 复制代码
class Solution {
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        List<List<Integer>> list = new ArrayList<>();
        Stack<Integer> stack = new Stack<>();
        Arrays.sort(candidates);
        dfs(list,stack,candidates,target,0);
        return list;
    }
        public static void dfs(List<List<Integer>> list, Stack<Integer> stack,int[] nums,int target,int begin){
        int temp = target;
        if (temp==0){
            list.add(new ArrayList<>(stack));
            return;
        }
        for (int i=begin;i<nums.length;i++){
            if(temp-nums[i]<0)break;
            temp=temp-nums[i];
            stack.push(nums[i]);
            if (temp>=0){
                dfs(list,stack,nums,temp,i);
            }
            stack.pop();
            temp+=nums[i];
        }
    }
}
相关推荐
zander2589 分钟前
LeetCode 5. 最长回文子串
算法
hanlin031 小时前
刷题笔记:力扣第84题-柱状图中最大的矩形
笔记·算法·leetcode
青少儿编程课堂2 小时前
威佐夫博弈(双堆取子游戏)解析
c++·python·算法·bfs·信息学竞赛
辰烨chenye6 小时前
LeetCode Hot 100 题解 · 普通数组篇
算法·leetcode·职场和发展
hqyjzsb9 小时前
零 AI 项目经验,学 Python 转型 AI 的正确顺序是什么?
开发语言·人工智能·python·算法·职场和发展·数据挖掘·数据分析
辰烨chenye9 小时前
LeetCode Hot 100 题解 · 二分篇
java·算法·leetcode
微功夫信息技术10 小时前
分层多智能体强化学习驱动的非急救转运公平 - 效率统一调度系统研究与实践
人工智能·学习·算法·动态规划
sanjiaomao33310 小时前
从论文公式到Python实现:用单元测试校验滑动平均算法
python·算法·单元测试
乐迪信息10 小时前
如何通过AI防爆摄像机精准判断船舶超速?
大数据·人工智能·算法·安全·目标跟踪
大圣编蚕11 小时前
Java ByteArrayInputStream 详解:从入门到实战
java·开发语言·算法