Skip to content

Latest commit

 

History

History
81 lines (63 loc) · 1.82 KB

40.Combination-Sum-II.md

File metadata and controls

81 lines (63 loc) · 1.82 KB

40. Combination Sum II


题目地址

https://leetcode.com/problems/combination-sum-ii/

题目描述

Given a collection of candidate numbers (candidates) and a target number (target), find all unique combinations in candidates where the candidate numbers sums to target.

Each number in candidates 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.

Example 1:
Input: candidates = [10,1,2,7,6,1,5], target = 8,
A solution set is:
[
  [1, 7],
  [1, 2, 5],
  [2, 6],
  [1, 1, 6]
]
Example 2:

Input: candidates = [2,5,2,1,2], target = 5,
A solution set is:
[
  [1,2,2],
  [5]
]

代码

Approach #1 Sort + Backtrace

i != startIndex && candidates[i] == candidates[i - 1] 去重

class Solution {
		public List<List<Integer>> combinationSum2(int[] candidates, int target) {
		List<List<Integer>> results = new ArrayList<>();
		if (candidates == null || candidates.length == 0) {
			return results;
		}

		Arrays.sort(candidates);
		List<Integer> combination = new ArrayList<Integer>();
		dfs(candidates, 0, combination, target, results);

		return results;
	}

	private void dfs(int[] candidates, int startIndex, List<Integer> combination, int target, List<List<Integer>> results) {
		if (target == 0) {
			results.add(new ArrayList<Integer>(combination));
			return;
		}

		for (int i = startIndex; i < candidates.length; i++) {
			// IMPORTANT 去重
			if (i != startIndex && candidates[i] == candidates[i - 1]) {
				continue;
			}
			if (target < candidates[i]) {
				break;
			}
			combination.add(candidates[i]);
			dfs(candidates, i + 1, combination, target - candidates[i], results);
			combination.remove(combination.size() - 1);
		}
	} 

}