首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >39. 组合总和

39. 组合总和

作者头像
名字是乱打的
发布2021-12-23 18:48:06
发布2021-12-23 18:48:06
3560
举报
文章被收录于专栏:软件工程软件工程

思路:

回溯法: 大神写的思路框架,基本涵盖了回溯的流转方式 1.写好结束条件(记住如果是list要新建list,防止添加的引用对象被修改) 2.循环进行元素选择 3.递归 4.回撤(保持原样)

代码语言:javascript
复制
result = []
def backtrack(路径, 选择列表):
    if 满足结束条件:
        result.add(路径)
        return

for 选择 in 选择列表:
    做选择
    backtrack(路径, 选择列表)
    撤销选择

代码:

代码语言:javascript
复制
class Solution {

    List<List<Integer>> res=new LinkedList<>();

    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        //排序方便剪枝
        Arrays.sort(candidates);
        searchRes(candidates,0,target,new LinkedList<>());
        return res;
    }

    /**
     * path其实就是taget每次减的数字记录的值,如果我们target减为0的,那么该路径就是其和的路径了
     * 随着path变深,
     */
    public void searchRes(int[] candidates,int start, int target, LinkedList<Integer> path){
        //结束循环
        if (target<0){
            return;
        }
        if (target==0){
            res.add(new LinkedList<>(path));
            return;
        }

        //每次从自己和自己后面的数字遍历即可减少很多重复计算
        for (int i = start; i < candidates.length; i++) {
            // 如果target<当前数,则跳过
            // 因为如果target小于当前值也就说当前值已不能构成path的加数了,不然总值会大于taget
            if (target<candidates[i]) {
                break;
            };
            path.add(candidates[i]);
            searchRes(candidates,i,target-candidates[i],path);
            //回撤
            path.removeLast();
        }


    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/7/16 上,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 思路:
    • 代码:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档