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 表示最後一項為...