python lintcode41 最大子陣列

2021-08-22 16:18:38 字數 1571 閱讀 8846

給定乙個整數陣列,找到乙個具有最大和的子陣列,返回其最大和。

子陣列最少包含乙個數

您在真實的面試中是否遇到過這個題?  是

給出陣列[−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.那麼這一題的思路就是 到某個結點的方案...