Given a set of candidate numbers (C) (without duplicates) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
The same repeated number may be chosen from C unlimited number of times.
Note:
- All numbers (including target) will be positive integers.
- The solution set must not contain duplicate combinations.
For example, given candidate set [2, 3, 6, 7]
and target 7
,
A solution set is:
[ [7], [2, 2, 3]
]
回溯法参考:
https://leetcode.com/problems/combination-sum/discuss/16502/A-general-approach-to-backtracking-questions-in-Java-(Subsets-Permutations-Combination-Sum-Palindrome-Partitioning)
import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Created by lxw, liwei4939@126.com on 2018/3/7. */ public class L039_Combination_Sum { //回溯法求解 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> tmpList, int[] nums, int remain, int start){ if (remain < 0){ return; } else if (remain == 0){ List.add(new ArrayList<>(tmpList)); } else { for (int i = start; i < nums.length && remain >= nums[i]; i++){ tmpList.add(nums[i]); backTrack(List, tmpList, nums, remain - nums[i], i); tmpList.remove(tmpList.size() - 1); } } } public static void main(String[] args){ L039_Combination_Sum tmp = new L039_Combination_Sum(); int[] arr = new int[]{2, 3, 6, 7}; List<List<Integer>> res = tmp.combinationSum(arr, 7); System.out.println(res); } }