使用java语言写一段代码,实现给定一个数组nums=[2,3,5]和一个固定的值target=8。找出数组nums中所有可以使数字和为target的组合(数字可重复)。
时间: 2023-04-06 22:03:13 浏览: 93
好的,我可以回答这个问题。以下是使用Java语言编写的代码,可以找出数组nums中所有可以使数字和为target的组合:
```java
import java.util.ArrayList;
import java.util.List;
public class CombinationSum {
public List<List<Integer>> combinationSum(int[] nums, int target) {
List<List<Integer>> result = new ArrayList<>();
backtrack(result, new ArrayList<>(), nums, target, 0);
return result;
}
private void backtrack(List<List<Integer>> result, List<Integer> tempList, int[] nums, int remain, int start) {
if (remain < 0) {
return;
} else if (remain == 0) {
result.add(new ArrayList<>(tempList));
} else {
for (int i = start; i < nums.length; i++) {
tempList.add(nums[i]);
backtrack(result, tempList, nums, remain - nums[i], i);
tempList.remove(tempList.size() - 1);
}
}
}
}
```
这个代码使用回溯算法来找出所有的组合。我们首先定义一个空的结果列表result,然后调用backtrack方法来找出所有的组合。backtrack方法接受四个参数:result,tempList,nums和remain。tempList是一个临时列表,用于存储当前的组合。nums是给定的数组,remain是当前还需要凑出的数字和。start参数用于避免重复的组合。
在backtrack方法中,我们首先检查remain是否小于0,如果是,说明当前的组合不符合要求,直接返回。如果remain等于0,说明我们已经找到了一个符合要求的组合,将其添加到结果列表中。否则,我们遍历数组nums,并将当前的数字添加到tempList中。然后,我们递归调用backtrack方法,将remain减去当前的数字nums[i],并将i作为start参数传递给下一次递归。递归完成后,我们将tempList中的最后一个数字删除,以便继续遍历数组。
最后,我们可以在主函数中调用combinationSum方法来找出所有的组合:
```java
public static void main(String[] args) {
int[] nums = {2, 3, 5};
int target = 8;
CombinationSum solution = new CombinationSum();
List<List<Integer>> result = solution.combinationSum(nums, target);
System.out.println(result);
}
```
输出结果为:
```
[[2, 2, 2, 2], [2, 3, 3], [3, 5]]
```
这些组合分别是[2,2,2,2],[2,3,3]和[3,5],它们的数字和都为8。
阅读全文