顿搜
飞过闲红千叶,夕岸在哪
类目归类
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
Each number in C may only be used once in the combination.
Note:
All numbers (including target) will be positive integers.
The solution set must not contain duplicate combinations.
given candidate set [10, 1, 2, 7, 6, 1, 5] and target 8,
A solution set is:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> results = new ArrayList<List<Integer>>();
if (candidates == null || candidates.length == 0 || target <= 0) {
return results;
}
Arrays.sort(candidates);
LinkedList<Integer> records = new LinkedList<Integer>();
dfs(candidates, -1, records, results, target);
return results;
}
private void dfs(int[] candidates, int start, LinkedList<Integer> records, List<List<Integer>> results,
int target) {
if (target == 0) {
results.add(new LinkedList<Integer>(records));
}
if (target <= 0) {
return;
}
int pre = -1;
for (int i = start + 1; i < candidates.length; i++) {
if (candidates[i] == pre) {
continue;
}
records.offer(candidates[i]);
dfs(candidates, i, records, results, target - candidates[i]);
records.pollLast();
pre = candidates[i];
}
}import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
public class LeetCode0039 {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> results = new ArrayList<List<Integer>>();
if (candidates == null || candidates.length == 0 || target <= 0) {
return results;
}
Arrays.sort(candidates);
LinkedList<Integer> records = new LinkedList<Integer>();
dfs(candidates, -1, records, results, target);
return results;
}
private void dfs(int[] candidates, int start, LinkedList<Integer> records, List<List<Integer>> results,
int target) {
if (target == 0) {
results.add(new LinkedList<Integer>(records));
}
if (target <= 0) {
return;
}
int pre = -1;
for (int i = start + 1; i < candidates.length; i++) {
if (candidates[i] == pre) {
continue;
}
records.offer(candidates[i]);
dfs(candidates, i, records, results, target - candidates[i]);
records.pollLast();
pre = candidates[i];
}
}
public static void main(String[] args) {
LeetCode0039 leetcode = new LeetCode0039();
int[] candidates = { 10, 1, 2, 7, 6, 1, 5 };
List<List<Integer>> results = leetcode.combinationSum(candidates, 8);
for (int i = 0; i < results.size(); i++) {
for (int j = 0; j < results.get(i).size(); j++) {
System.out.print(results.get(i).get(j) + " ");
}
System.out.println();
}
}
}