給定乙個整數陣列 nums ,找到乙個具有最大和的連續子陣列(子陣列最少包含乙個元素),返回其最大和。
輸入:nums = [-2,1,-3,4,-1,2,1,-5,4]
輸出:6
解釋:連續子陣列 [4,-1,2,1] 的和最大,為 6 。
輸入:nums = [-100000]
輸出:-100000
一、暴力法:
i:
子串行的首元素下標j:
子串行的尾元素下標
;二、分治法:
將所給序列a[0,n]
分成兩段a[0,n/2]
和a[n/2 + 1, n]
,分別求出這兩段的最大子段和
1)最大子序和在a[0,n/2]
【遞迴求解】
2)最大子序和在a[n/2 + 1,n]
【遞迴求解】
3)最大子序和在a[i, j]
0<=i<=n/2
;n/2 + 1<=j<=n
【兩段分別求解】
class
solution
intdivideconquer
(vector<
int>
& nums,
int left,
int right)
intfindmaxcrossingsubsum
(vector<
int>
& nums,
int left,
int middle,
int right)
sum =0;
int rightsum = int8_min;
for(
int j = middle+
1;j <= right;j++
)return
(leftsum + rightsum);}
intmax
(int a,
int b)
};
三、動態規劃
定義乙個陣列dp
,dp[i]
表示以第i
個元素為結尾一段最大子序和.求dp[i]
時,前面dp[0]~dp[i-1]
都已經求出,dp[i-1]
表示的是以i-1
為結尾的最大子序和,若dp[i-1]
小於0
,則dp[i]
加上前面的任意長度的序列和都會小於不加前面的序列(自己本身乙個元素是以自己為結尾的最大自序和)
如-2,1,-3,4
陣列,dp[0]=-2;dp[1]=1
(因為前乙個dp[0]=-2<0
,即(-2,1)
子序和為-1
,乙個元素1
子序和為1
;dp[2]=dp[1]+nums[2]=1+(-3)=-2
;dp[3]=4
,因為dp[2]<0.
class
solution
return result;
}int
max(
int a,
int b)
};
參考:
最大子序和(leetcode) 動態規劃、貪心解法、分治解法
最大子序和(動態規劃,分治)
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 表示最後一項為...