每日一题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];
        }
    }
}
相关推荐
2401_841495646 分钟前
【数据结构】汉诺塔问题
java·数据结构·c++·python·算法·递归·
Q741_14731 分钟前
C++ 位运算 高频面试考点 力扣137. 只出现一次的数字 II 题解 每日一题
c++·算法·leetcode·面试·位运算
天特肿瘤电场研究所41 分钟前
专业的肿瘤电场疗法厂家
算法
DASXSDW1 小时前
NET性能优化-使用RecyclableBuffer取代RecyclableMemoryStream
java·算法·性能优化
kfepiza1 小时前
CAS (Compare and Swap) 笔记251007
java·算法
墨染点香2 小时前
LeetCode 刷题【103. 二叉树的锯齿形层序遍历、104. 二叉树的最大深度、105. 从前序与中序遍历序列构造二叉树】
算法·leetcode·职场和发展
啊我不会诶2 小时前
23ICPC澳门站补题
算法·深度优先·图论
Brookty3 小时前
【算法】二分查找(一)朴素二分
java·学习·算法·leetcode·二分查找
黑色的山岗在沉睡4 小时前
LeetCode 2761. 和等于目标值的质数对
算法·leetcode·职场和发展
bawangtianzun4 小时前
重链剖分 学习记录
数据结构·c++·学习·算法