python lintcode135 數字組合

2021-08-19 16:53:40 字數 2558 閱讀 2047

給出乙個候選數字的set(c)和目標數字(t),找到c中所有的組合,使找出的數字和為t。c中的數字可以無限制重複被選取。

例如,給出候選陣列[2,3,6,7]和目標數字7,所求的解為:

[7],

[2,2,3]

給出候選set[2,3,6,7]和目標數字7

返回[[7],[2,2,3]]

題目意思很明確了,這就是乙個排列組合的問題,請注意,所有排列組合的問題,都用dfs來做!

這一題跟我寫的上一題有類似的地方,詳情請看:

但是因為這一題允許元素重複,所以下標在遞迴的時候不需要加一,具體**如下:

class solution:

"""@param candidates: a list of integers

@param target: an integer

@return: a list of lists of integers

"""def combinationsum(self, candidates, target):

# write your code here

def search(candidates,target,index,list):

if(sum(list)==target):

return

if(index==len(candidates)):

return

if(sum(list)>target):

return

for i in range(index,len(candidates)):

search(candidates,target,i,list+[candidates[i]])

if(len(candidates)==0):

return

self.result=

list=

search(sorted(candidates),target,0,list)

return self.result

s=solution()

print(s.combinationsum([2,3,7],7))

更新於2021.05.10 。我在兩年後再刷這一題的時候發現給定的candidates不是set了,也就是說裡面可能會出現重複的元素。

那麼會出現乙個什麼問題呢?比如c=[1,1,2],t為3的時候,若是用之前的方法,則解集裡會有兩組解[1,2]與[1,2],第乙個解中的1為c中第乙個1,第二個解中的1為c中第二個1.為了避免這樣的問題,其實只需要兩行**:

class solution:

"""@param candidates: a list of integers

@param target: an integer

@return: a list of lists of integers

"""def combinationsum(self, candidates, target):

# write your code here

if (len(candidates)==0):

return

self.results=

self.search(sorted(candidates),,target,0)

return self.results

def search(self,candidates,s,target,index):

# if candidates[index]==target:

# return

if 0==target:

return

if (index==len(candidates)):

return

if candidates[index]>target:

return

for i in range(index,len(candidates)):

# 避免重複解

if (i!=index and candidates[i]==candidates[i-1]):

continue

self.search(candidates,s+[candidates[i]],target-candidates[i],i)

# self.search(candidates,s+[candidates[index]],target-candidates[index],index+1)

# candidates = [2,3,6,7]

# target = 7

candidates = [2,2,3]

target = 5

s = solution()

print(s.combinationsum(candidates,target))

python lintcode 433島嶼的個數

給乙個01矩陣,求不同的島嶼的個數。0代表海,1代表島,如果兩個1相鄰,那麼這兩個1屬於同乙個島。我們只考慮上下左右為相鄰。您在真實的面試中是否遇到過這個題?yes 樣例 在矩陣 1,1,0,0,0 0,1,0,0,1 0,0,0,1,1 0,0,0,0,0 0,0,0,0,1 中有 3 個島.cl...

python lintcode114 不同的路徑

有乙個機械人的位於乙個 m n 個網格左上角。機械人每一時刻只能向下或者向右移動一步。機械人試圖達到網格的右下角。問有多少條不同的路徑?n和m均不超過100 您在真實的面試中是否遇到過這個題?是 給出 m 3和 n 3,返回6.給出 m 4和 n 5,返回35.那麼這一題的思路就是 到某個結點的方案...

python lintcode116 跳躍遊戲

給出乙個非負整數陣列,你最初定位在陣列的第乙個位置。陣列中的每個元素代表你在那個位置可以跳躍的最大長度。判斷你是否能到達陣列的最後乙個位置。這個問題有兩個方法,乙個是貪心和動態規劃。貪心方法時間複雜度為o n 動態規劃方法的時間複雜度為為o n 2 我們手動設定小型資料集,使大家可以通過測試的兩種方...