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