leetcode53 最大子序和

2021-10-05 18:18:40 字數 3206 閱讀 4498

leetcode53.題目描述

給定乙個整數陣列 nums ,找到乙個具有最大和的連續子陣列(子陣列最少包含乙個元素),返回其最大和。

解題思路:

1.動態規劃解法

分析明白了其實很簡單,我們從左到右掃瞄整個陣列,如果加到i位置時候,和小於0了,說明前面0到i,對於後面的數是不是一點沒有了呢,我們應該重新開始加,相當於拋棄了一段無用陣列,但是我們需要把把0到i裡的最大值統計出來,相當於我們在不斷丟棄和小與0的連續片段,在掃瞄這個陣列的過程中,我們不斷更新最大值,最後的最大值就符合條件。

用動態規劃來總結就是,我們需要可以得到以i位置結束的最大子串行,然後儲存所有位置中最大的那個值就可以。位置i的解為f(i),那麼怎麼得到呢,如果已知f(i-1)和nums[i]就好了,如果f(i-1)小於0說明前面的對自己沒有任何幫助,應該拋棄掉,重新開始,就以自己的nums[i]值作為新的值,進行下一步。所以狀態轉移方程為:

f (i

)=ma

x(f(

i−1)

+num

s[i]

,num

s[i]

)f(i)=max(f(i-1)+nums[i],nums[i])

f(i)=m

ax(f

(i−1

)+nu

ms[i

],nu

ms[i

])**如下:

2.滑動視窗解法:

這個解法我看leetcode還沒有看到的,可能不夠優雅,哈哈,也是前幾天做了這個題,了解滑動視窗演算法移步

leetcode3. 無重複字元的最長子串

思路很簡單,就是維護乙個乙個視窗,這個視窗放的值就是當前最大子串行,需要滿足什麼條件呢,還是和前面一樣,如果前面的的數小於0了,我們就把這一段拋棄掉重新維護乙個視窗,不斷更新最大值。

**如下:

class

solution

:def

maxsubarray

(self, nums: list[

int])-

>

int:

l =0 r =

1 lg =

len(nums)

maxsum = nums[0]

while r<=lg:

currentsum =

sum(nums[l:r]

)if currentsum>0:

r +=

1else

: l = r

r = l+

1 maxsum =

max(maxsum, currentsum)

return maxsum

不過時間複雜度有點感人,但是我覺得這個挺好理解的,重要是熟悉下滑動視窗演算法

3.分治法

這個想法也是簡單暴力,假設最大子串行不是在左邊,就是在右邊,或者在中間,我們只用返回左邊,右邊和中的最大值就可以,而左邊和右邊的子串的最大值又是原問題的子問題,所以可以用遞迴來解決,而中間的的最大子串我們可以直接算出來。

**如下:

class

solution

:def

maxsubarray

(self, nums: list[

int])-

>

int:

n =len(nums)

#如果n長度為1時直接返回既可

if n ==1:

return nums[0]

#遞迴左半邊最大子序和

mid =

len(nums)//2

left_maxsum = self.maxsubarray(nums[

0:mid]

)#遞迴右半邊最大子序和

right_maxsum = self.maxsubarray(nums[mid:])

#計算中間的最大子序和,從中間開始,先從右到左,計算出左邊部分的最大和,然後計算出右邊的相加

maxsum_l = nums[mid-1]

maxsum_r = nums[mid]

current =

0for i in

range

(mid -1,

-1,-

1): current += nums[i]

maxsum_l =

max(current, maxsum_l)

current =

0for i in

range

(mid, n)

: current += nums[i]

maxsum_r =

max(current, maxsum_r)

maxsum_mid = maxsum_l+maxsum_r

#返回三個中的最大值

return

max(left_maxsum,right_maxsum,maxsum_mid)

時間複雜度也很高,所以本題的最優解還是第一中解法,後面是為了熟悉別的演算法,僅供學習!

LeetCode53最大子序和

給定乙個序列 至少含有 1 個數 從該序列中尋找乙個連續的子串行,使得子串行的和最大。例如,給定序列 2,1,3,4,1,2,1,5,4 連續子串行 4,1,2,1 的和最大,為6。擴充套件練習 若你已實現複雜度為 o n 的解法,嘗試使用更為精妙的分治法求解。一開始用的最簡單最直接的方法,挨個的把...

LeetCode 53 最大子序和

給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。高階 如果你已經實現複雜度為 o n 的解法,嘗試使用更為精妙的分治法求解。這道題本來是能做出...

LeetCode 53 最大子序和

題目鏈結 題目描述 給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。解決方法 解題思路 動態規劃,複雜度為 o n 令dp i 表示最後一項為...