#!/usr/bin/python
# -*- coding: utf-8 -*-
'''
Combination Sum II
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.
For example, 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]
]
不能重复使用一个元素,结果不能重复
'''
class Solution(object):
def combinationSum2(self, candidates, target):
"""
:type candidates: List[int]
:type target: int
:rtype: List[List[int]]
"""
length = len(candidates)
if length == 0:
return []
candidates.sort() #先排序
ret = []
tmp = range(length)#因为元素不能重复使用,最长为candidates的长度
self.__combinationSum2(candidates,0,length,0,target,ret,tmp,0)
return ret
def __combinationSum2(self,candidates,start,length,sum,target,ret,tmp,tmp_cur):
if sum == target:
ret.append(tmp[:tmp_cur])
return
if start == length:
return
while start < length:
if sum + candidates[start] > target:
break
tmp[tmp_cur] = candidates[start]
self.__combinationSum2(candidates,start + 1,length,sum + candidates[start],target,ret,tmp,tmp_cur + 1)
while start + 1 < length and candidates[start + 1] == candidates[start]:#结果去重,因为前面已经将重复的元素都组合过了,再组合只会导致重复结果,所以重复的元素不再组合
start += 1
start += 1
if __name__ == "__main__":
s = Solution()
print s.combinationSum2([10,1,2,7,6,1,5],8)
print s.combinationSum2([1],1)
39 leetcode - Combination Sum II
最新推荐文章于 2024-09-16 06:54:08 发布