package com.app.main.LeetCode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
*
* 39
*
* medium
*
* https://leetcode.com/problems/combination-sum/
*
* Given a set of candidate numbers (candidates) (without duplicates) and a target number (target), find all unique
* combinations in candidates where the candidate numbers sums to target.
*
* The same repeated number may be chosen from candidates unlimited number of times.
*
* Note:
*
* All numbers (including target) will be positive integers.
* The solution set must not contain duplicate combinations.
* Example 1:
*
* Input: candidates = [2,3,6,7], target = 7,
* A solution set is:
* [
* [7],
* [2,2,3]
* ]
* Example 2:
*
* Input: candidates = [2,3,5], target = 8,
* A solution set is:
* [
* [2,2,2,2],
* [2,3,3],
* [3,5]
* ]
* Created with IDEA
* author:Dingsheng Huang
* Date:2019/9/27
* Time:下午6:42
*/
public class CombinationSum {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> result = new ArrayList<>();
Arrays.sort(candidates);
backtrack(result, new ArrayList<>(), candidates, target, 0);
return result;
}
private void backtrack(List<List<Integer>> result, List<Integer> tempTrack, int[] nums, int target, int start) {
if (target == 0) {
result.add(new ArrayList<>(tempTrack));
return;
} else {
for (int i = start; i <= nums.length - 1; i++) {
// 剪枝
if ((target - nums[i]) < 0) {
continue;
}
target = target - nums[i];
tempTrack.add(nums[i]);
backtrack(result, tempTrack, nums, target, i);
// 回溯
target = target + tempTrack.get(tempTrack.size() - 1);
tempTrack.remove(tempTrack.size() - 1);
}
}
}
}