leetcode:216. Combination Sum III

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章