216. Combination Sum III
大意是说在1-9中选k个不同的数,使他们的和是n,返回是所有的选择。
Example 1:
输入: k = 3, n = 7
输出:[[1,2,4]]Example 2:
输入: k = 3, n = 9
输出:[[1,2,6], [1,3,5], [2,3,4]]
思路:
1. 输入的k 肯定在必须在 1-9之间
2. 假定输出的最后一个数是m,从m=9不断进行尝试,输入的n 必须在 k*(k+1)/2 k(2*m-k)/2 之间
3. 采用递归的方式
4. 如果只剩下一个数,把它放在首位就行了
5. 注意:python的浅复制与深复制
class Solution(object):
def combinationSum3(self, k, n):
"""
:type k: int
:type n: int
:rtype: List[List[int]]
"""
if k<0 or k>9:return []
ans=[]
tem=[0]*k
self.com(ans,tem,k,n,9)
return ans
def com(self,ans,tem,k,n,m):
if k<0 or k>m :return
if n<k*(k+1)/2 or n>k*(2*m+1-k)/2: return#初次尝试
tep=tem[:]#浅复制
if k==1:#只有(只剩下)一个数,这个时候把n放在首位就好了
tep[0]=n
ans.append(tep[:])#再次浅复制!
for i in range(m,k-1,-1):
#又一次尝试,i是要放入数组中最大的数,取值【k,m】
tep[k-1]=i
self.com(ans,tep,k-1,n-i,i-1)#下一次的最大尝试是i-1