// 组合II, 从数组中(数组中有重复元素)找到组成目标值的组合,不重复取 func CombinationFromArrayII(candidates []int, target int) [][]int { if len(candidates) == 0 { return [][]int {} } candidates = sortWithMerge(candidates) fmt.Printf("candidates is %v\n", candidates) var res [][]int var path []int var used map[int]bool used = make(map[int]bool) var in func(startIndex int, used map[int]bool) in = func(startIndex int, used map[int]bool) { if sum(path) == target { tmp := make([]int, len(path)) copy(tmp, path) res = append(res, tmp) return } if sum(path) > target { return } for i := startIndex; i < len(candidates); i++ { // 同一树层不存在重复元素 if i > 0 && candidates[i] == candidates[i-1] && used[i-1] == false { continue } path = append(path, candidates[i]) used[i] = true in(i+1, used) path = path[:len(path)-1] used[i] = false } } in(0, used) return res }