11、组合总数III

题目描述:
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

说明:

所有数字都是正整数。
解集不能包含重复的组合。
示例 1:

输入: k = 3, n = 7
输出: [[1,2,4]]
示例 2:

输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]

比较简单,但是为什么,我将 result.add(new ArrayList(tem));换成这个result.add(tem),难道是因为使用了一个内存空间,导致后面加入的均是一个tem?所以需要另外新建一个tem,这样就不会冲突了??
就是空的呢??

class Solution {
    public List<List<Integer>> combinationSum3(int k, int n) {
     
		//k个数字,和为n
		List<List<Integer>> result = new ArrayList<>();
		int[] nums = {1,2,3,4,5,6,7,8,9};
		List<Integer> tem = new ArrayList<>();
		getcombinatisonSum3(nums, 0, k, result, tem, n);
		return result;
    }
	public  static void getcombinatisonSum3(int nums[],int start,int k ,List<List<Integer>> result, List<Integer> tem,int target){
		if(k == tem.size() && target == 0){
			result.add(new ArrayList<Integer>(tem));
			return ;
		}
		for (int i = start; i < 9; i++) {
			tem.add(nums[i]);
			getcombinatisonSum3(nums, i +1, k, result, tem, target - nums[i]);
			tem.remove(tem.size() - 1);
		}
		
	}
	
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 思路: 1. 首先需要生成1到100的数字序列。 2. 然后需要对数字序列进行组合,可以采用递归的方式进行遍历和组合。 3. 在组合的过程中,需要对每一个组合进行求和,判断是否等于100,如果等于100,则将该组合计数器加1。 4. 最后输出计数器的结果。 代码实现: ```java public class SumCombination { private static int count = 0; // 统计满足条件的组合数 public static void main(String[] args) { int[] nums = new int[100]; for (int i = 0; i < 100; i++) { nums[i] = i + 1; } generateCombination(nums, 0, new ArrayList<Integer>()); System.out.println(count); } public static void generateCombination(int[] nums, int start, List<Integer> list) { if (list.size() > 0 && sumList(list) == 100) { // 判断是否满足条件 count++; } for (int i = start; i < nums.length; i++) { list.add(nums[i]); generateCombination(nums, i + 1, list); // 递归生成组合 list.remove(list.size() - 1); } } public static int sumList(List<Integer> list) { int sum = 0; for (Integer num : list) { sum += num; } return sum; } } ``` ### 回答2: 题目要求从1到100的数中,取任意组合的数,对组合里的数进行求和,求有多少组和为100的组合。先遍历1到100的所有数字作为组合的起始数字,然后通过递归函数进行深度优先搜索,找到和为100的组合,并记录下来。 思路如下: 1. 定义一个递归函数,函数参数包括当前组合的和sum,当前组合列表List<Integer>,当前数字的索引index。 2. 在递归函数中,首先判断当前组合的和是否等于100,如果是的话,说明找到了一种组合,统计次数,并结束递归。 3. 如果还没有达到100,继续在当前数字之后的数字中进行递归搜索。递归时,需要更新当前组合的和sum和列表List<Integer>。 4. 在递归搜索中,有两种情况,一种是不选择当前数字,添加下一个数字进行递归;另一种是选择当前数字,将当前数字添加到组合列表中进行递归。 5. 递归回溯结束后,返回统计的结果。 示例代码如下: ```java public class CombinationSum { // 全局变量,用于统计组合和为100的次数 static int count = 0; public static void main(String[] args) { List<List<Integer>> combinations = new ArrayList<>(); List<Integer> temp = new ArrayList<>(); // 从1开始进行递归搜索 for (int i = 1; i <= 100; i++) { temp.add(i); dfs(i, i, temp, combinations); temp.remove(temp.size() - 1); } System.out.println("和为100的组合个数:" + count); System.out.println("组合列表:" + combinations); } public static void dfs(int index, int sum, List<Integer> temp, List<List<Integer>> combinations) { // 和为100,找到一种组合 if (sum == 100) { count++; combinations.add(new ArrayList<>(temp)); return; } // 继续搜索 for (int i = index; i <= 100; i++) { // 不选择当前数字 dfs(i + 1, sum, temp, combinations); // 选择当前数字 if (sum + i <= 100) { temp.add(i); dfs(i + 1, sum + i, temp, combinations); temp.remove(temp.size() - 1); } else { break; // 当前数字已经大于等于100,跳出循环 } } } } ``` 以上代码通过递归的方式进行深度优先搜索,找到和为100的组合,并统计个数,最后输出结果。运行结果会显示和为100的组合个数以及具体组合列表。 ### 回答3: 题目要求从1到100之间的数中,取出若干个数的组合,这些组合中的数相加求和为100的组合数量。 思路: 1. 首先要生成从1到100的所有数字的列表。 2. 然后通过遍历所有可能的组合,求和并判断是否等于100。 3. 统计满足条件的组合数量。 4. 最后输出结果。 下面是大致的java代码: ```java import java.util.ArrayList; import java.util.List; public class CombinationSum { public static void main(String[] args) { List<List<Integer>> combinations = new ArrayList<>(); List<Integer> currentComb = new ArrayList<>(); int target = 100; generateCombinations(1, target, currentComb, combinations); System.out.println("组合总数为:" + combinations.size()); for (List<Integer> combination : combinations) { System.out.println(combination); } } public static void generateCombinations(int start, int target, List<Integer> currentComb, List<List<Integer>> combinations) { if (target == 0) { combinations.add(new ArrayList<>(currentComb)); return; } for (int i = start; i <= 100 && i <= target; i++) { currentComb.add(i); generateCombinations(i, target - i, currentComb, combinations); currentComb.remove(currentComb.size() - 1); } } } ``` 该代码通过递归生成从1到target的所有可能的组合,并判断组合中的数相加是否等于target。如果等于,将该组合加入到结果的列表中。最后输出结果列表以及组合总数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值