java在一个数组中求等于一个数的组合
时间: 2024-05-03 20:16:31 浏览: 104
java组合的算法
您好,求解一个数组中等于一个数的组合可以使用回溯法(backtracking)来实现。以下是一个Java代码示例:
```java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class CombinationSum {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> res = new ArrayList<>();
Arrays.sort(candidates); // 先对数组进行排序
backtrack(res, new ArrayList<>(), candidates, target, 0);
return res;
}
private void backtrack(List<List<Integer>> res, List<Integer> temp, int[] candidates, int remain, int start) {
if (remain < 0) { // 如果余数小于0,说明这个组合不合法,直接返回
return;
} else if (remain == 0) { // 如果余数等于0,说明这个组合是合法的,加入结果列表
res.add(new ArrayList<>(temp));
} else {
for (int i = start; i < candidates.length; i++) {
temp.add(candidates[i]); // 加入当前数
backtrack(res, temp, candidates, remain - candidates[i], i); // 递归调用
temp.remove(temp.size() - 1); // 移除当前数,回溯到上一个状态
}
}
}
}
```
其中 `candidates` 是给定的数组,`target` 是目标数,`res` 是结果列表,`temp` 是临时列表,`start` 是起始下标,`remain` 是目标数与已选数的差。在每一次递归调用中,我们扫描从 `start` 开始的数组元素,如果当前元素小于等于 `remain`,则将其加入临时列表中,然后继续递归调用,直到余数为0或负数为止。如果余数为0,说明找到了一个符合要求的组合,将其加入结果列表中。如果余数小于0,说明当前组合不合法,直接返回。在递归调用结束后,需要将最后加入的元素从临时列表中移除,回溯到上一个状态,继续扫描下一个元素。
阅读全文