39. 组合总和 - LeetCode

39. 组合总和

题目链接

dfs

class Solution {

    List<List<Integer>> ans;

    public List<List<Integer>> combinationSum(int[] candidates, int target) { 
        ans = new ArrayList<>();
        dfs(candidates, target, new ArrayList<Integer>(), 0);
        return ans;
    }

    private void dfs(int[] candidates, int target, List<Integer> now, int k){
        if(target < 0) return;
        if(target == 0){
            ans.add(new ArrayList<Integer>(now));
            return;
        }
        for(int i = k; i < candidates.length; i++){
            now.add(candidates[i]);
            target -= candidates[i];
            dfs(candidates, target, now, i);
            now.remove(now.size() - 1);
            target += candidates[i];
        }
    }

}
  • 这是代码经过优化的版本,ans放在外面无需传参,target直接减,不用计算sum
  • 注意:加入ans的时候,需要重新new一个ArrayList,否则改变now会改变ans中元素的值

优化

  • 上面的版本跑出来的时间不尽如人意,想来想去,觉得是List的add和remove太慢了,于是有了下面的优化
class Solution {

    List<List<Integer>> ans;

    public List<List<Integer>> combinationSum(int[] candidates, int target) { 
        ans = new ArrayList<>();
        dfs(candidates, target, new ArrayList<Integer>(), 0);
        return ans;
    }

    private void dfs(int[] candidates, int target, List<Integer> now, int k){
        if(target == 0){
            ans.add(new ArrayList<Integer>(now));
            return;
        }
        for(int i = k; i < candidates.length; i++){
            target -= candidates[i];
            if(target >= 0){
                now.add(candidates[i]);
                dfs(candidates, target, now, i);
                now.remove(now.size() - 1);
            }
            target += candidates[i];
        }
    }

}
  • 将target大于等于0的判断提前,这样就不用操作List进下一层递归了
  • 实测快了一倍
posted @ 2021-02-22 10:19  一天到晚睡觉的鱼  阅读(45)  评论(0)    收藏  举报