給出乙個候選數字的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 我們手動設定小型資料集,使大家可以通過測試的兩種方...