給定乙個整數陣列,找到乙個具有最大和的子陣列,返回其最大和。
子陣列最少包含乙個數
您在真實的面試中是否遇到過這個題? 是
給出陣列[−2,2,−3,4,−1,2,1,−5,3]
,符合要求的子陣列為[4,−1,2,1]
,其最大和為6
要求時間複雜度為o(n)
這一題用動態規劃做時間複雜度才能是o(n)。首先分析一下我們在尋找最大子段和時,子段和的特點:如果前面的子段和大於零,那我們繼續加上下乙個元素,如果子段和小於零,那我們直接放棄之前所有的元素,然後重新找子段。當然之前碰到的子段和會記錄下最大的值。這個過程就是動態規劃的過程。
**如下:
class solution:
"""@param nums: a list of integers
@return: a integer indicate the sum of max subarray
"""def maxsubarray(self, nums):
# write your code here
if(len(nums)==1):return nums[0]
if(max(nums)<0):return max(nums)
sum=0
maxp=0
for i in range(len(nums)):
if(sum>0):sum+=nums[i]
else:sum=nums[i]
if(sum>maxp):maxp=sum
return maxp
s=solution()
print(s.maxsubarray([-2,2,-3,4,-1,2,1,-5,3]))
當然在上面的**裡動態規劃體現的不是很明顯,所以我重新寫了乙份**,對於dp的認識更加清晰:
class solution:
"""@param nums: a list of integers
@return: a integer indicate the sum of max subarray
"""def maxsubarray(self, nums):
# write your code here
if(len(nums)==1):return nums[0]
if(max(nums)<0):return max(nums)
# dp陣列記錄每個位置結尾的子陣列最大和
dp=[0 for i in range(len(nums))]
maxp=-99999
sum=0
for i in range(0,len(nums)):
if(sum<0):sum=nums[i]
else:sum+=nums[i]
maxp=max(maxp,sum)
dp[i]=maxp
return dp[-1]
s=solution()
print(s.maxsubarray([1,2,3,4,5,6,7,100,200,1000]))
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 lintcode135 數字組合
給出乙個候選數字的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 題目意思很明確了,這就是乙個排列組合...
python lintcode114 不同的路徑
有乙個機械人的位於乙個 m n 個網格左上角。機械人每一時刻只能向下或者向右移動一步。機械人試圖達到網格的右下角。問有多少條不同的路徑?n和m均不超過100 您在真實的面試中是否遇到過這個題?是 給出 m 3和 n 3,返回6.給出 m 4和 n 5,返回35.那麼這一題的思路就是 到某個結點的方案...