题目链接: https://leetcode.com/problems/combination-sum/?tab=Description
Problem: 给定数组并且给定一个target,求出所有满足求和等于target的数字组合
遍历所有的数组中元素,然后对target进行更新,将该元素添加到tempList中,直到remain等于0时达到条件,可以将该tempList添加到list中
注意:每个元素可以使用多次,因此每次的遍历都要从上次的那个下标开始。
当target更新到小于0的时候,返回,
当target更新到大于0的时候,进行从start下标开始遍历,并且将该数字添加到tempList中,递归调用。递归调用结束最后需要将tempList进行移除最顶的元素。
参考代码:
package leetcode_50; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /*** * * @author pengfei_zheng * 求解满足加和等于target的所有数字组合 */ public class Solution39 { public List<List<Integer>> combinationSum(int[] nums, int target) { List<List<Integer>> list = new ArrayList<>(); Arrays.sort(nums); backtrack(list, new ArrayList<>(), nums, target, 0); return list; } private void backtrack(List<List<Integer>> list, List<Integer> tempList, int [] nums, int remain, int start){ if(remain < 0) return; else if(remain == 0) list.add(new ArrayList<>(tempList)); else{ for(int i = start; i < nums.length; i++){ tempList.add(nums[i]); backtrack(list, tempList, nums, remain - nums[i], i); // not i + 1 because we can reuse same elements tempList.remove(tempList.size() - 1); } } } }
时间: 2024-09-30 11:31:29