首页 > 其他分享 >力扣216 组合综合3

力扣216 组合综合3

时间:2023-02-28 21:36:54浏览次数:44  
标签:216 return 组合 int res sum 力扣 new path

题目:

找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:
    只使用数字1到9
    每个数字最多使用一次 
返回所有可能的有效组合的列表。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

示例:

输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
解释:
1 + 2 + 6 = 9
1 + 3 + 5 = 9
2 + 3 + 4 = 9
没有其他符合的组合了。

思路:

  自己画个图就清楚了(这里放个代码随想录的图)。

class Solution {
    List<List<Integer>> res=new ArrayList<>();
    LinkedList<Integer> path=new LinkedList<>();
    public List<List<Integer>> combinationSum3(int k, int n) {
        combinationSum3back(k,n,1);
        return res;
    }

    public void combinationSum3back(int k,int n,int startIndex){
        //终止条件
        if(path.size()==k){//当遍历到深度为k时
            int sum=0;
            for(int a:path){
                sum+=a;
            }
            if(sum==n){//并且当前路径节点和为n
                res.add(new ArrayList<>(path));//找到结果   
                return;  
            }
        }
        //回溯遍历过程
        for(int i=startIndex;i<=9;i++){
            path.add(i);//处理节点
            combinationSum3back(k,n,i+1);//递归
            path.removeLast();//回溯
        }
    }
}

剪枝处理:

class Solution {
    List<List<Integer>> res=new ArrayList<>();
    LinkedList<Integer> path=new LinkedList<>();
    public List<List<Integer>> combinationSum3(int k, int n) {
        combinationSum3back(k,n,1);
        return res;
    }

    public void combinationSum3back(int k,int n,int startIndex){
        //剪枝
        int sum=0;
        for(int a:path){
            sum+=a;
        }
        if(sum>n){
            return;
        }
        //终止条件
        if(path.size()==k&&sum==n){//当遍历到深度为k时//并且当前路径节点和为n
            res.add(new ArrayList<>(path));//找到结果   
            return;  
        }
        //回溯遍历过程
        /*for(int i=startIndex;i<=9;i++){
            path.add(i);//处理节点
            combinationSum3back(k,n,i+1);//递归
            path.removeLast();//回溯
        }*/
        for(int i=startIndex;i<=9-(k-path.size())+1;i++){
            path.add(i);//处理节点
            combinationSum3back(k,n,i+1);//递归
            path.removeLast();//回溯
        }
    }
}

 

标签:216,return,组合,int,res,sum,力扣,new,path
From: https://www.cnblogs.com/cjhtxdy/p/17166055.html

相关文章

  • 力扣77 组合
    题目:给定两个整数n和k,返回范围[1,n]中所有可能的k个数的组合。你可以按任何顺序返回答案。示例:输入:n=4,k=2输出:[[2,4],[3,4],[2,3],[......
  • 组合数学笔记-排列与组合
    目录排列与组合排列排列的定义与基本性质错位排列错位排列的定义与基本性质圆排列圆排列的定义与基本性质多重集排列多重集排列的定义与基本性质组合组合的定义与基本性质......
  • 组合数学笔记-计数原理
    目录计数原理基本计数原理加法原理(分类)乘法原理(分步)减法原理(正难则反)除法原理(等价划分)重要计数原理抽屉原理(鸽巢原理)容斥原理约定:本笔记涉及的一切变量,若未特殊指明,则默......
  • 「组合数学」二:排列与组合
    四个基本计数原理四原理之外:一个非常基础的原理,全体等于各部分之和设\(S\)是集合,集合\(S\)的一个划分是满足下面条件的\(S\)的子集\(S_1,S_2,…,S_m\)的集合,即使得\(S\)......
  • 力扣---33. 搜索旋转排序数组
    整数数组nums按升序排列,数组中的值互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为[nums[k],nums[k+1],...,......
  • 力扣---2363. 合并相似的物品
    给你两个二维整数数组items1和items2,表示两个物品集合。每个数组items有以下特质:   items[i]=[valuei,weighti]其中valuei表示第i件物品的价值,weighti......
  • 代码随想录算法Day27 | 39. 组合总和 , 40.组合总和II ,131.分割回文串
    39.组合总和题目链接:39.组合总和-力扣(LeetCode)思路既然题目说可以数组中的数可以无限制重复被选取,那么说明在选取该元素的下一个分支也可以继续使用。选取和剪枝过......
  • 力扣1049 最后一块石头的重量2
    题目:有一堆石头,用整数数组stones表示。其中stones[i]表示第i块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为x和y,且x<=......
  • 算法随想Day24【回溯算法】| LC39-组合总和、LC40-组合总和Ⅱ、LC131-分割回文串
    LC39.组合总和vector<int>temp;intsum=0;voidcombinationSumLoop(vector<vector<int>>&result,vector<int>&candidates,intindex,constint&target){......
  • 代码随想录算法训练营Day27 回溯算法|39. 组合总和 40.组合总和II 131.分割回文串
    代码随想录算法训练营39.组合总和题目链接:39.组合总和给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 targ......