演算法思路:
狀態定義:
設動態規劃列表 dp ,dp[i] 代表以元素 nums[i] 為結尾的連續子陣列最大和。
轉移方程:
若dp[i−1]≤0 ,說明 dp[i−1] 對dp[i] 產生負貢獻,即 dp[i−1]+nums[i] 還不如 nums[i] 本身大。
當 dp[i−1]>0 時:執行 dp[i]=dp[i−1]+nums[i] ;
當 dp[i−1]≤0 時:執行 dp[i]=nums[i] ;
初始狀態: dp[0]=nums[0],即以nums[0]結尾的連續子陣列最大和為nums[0] 。
返回值:返回dp 列表中的最大值,代表全域性最大值。
空間複雜度降低:
由於dp[i] 只與dp[i−1] 和nums[i] 有關係,因此可以將原陣列nums 用作dp 列表,即直接在nums 上修改即可。
由於省去dp 列表使用的額外空間,因此空間複雜度從 o(n) 降至 o(1) 。
**實現:
#include
#include
#include
#include
//using namespace std;
void main() ;
int size = sizeof(nums) / sizeof(nums[0]);
for (int i = 1; i < size; i++)
if (nums[i - 1] > 0) nums[i] = nums[i] + nums[i - 1];
cout << max(nums.begin(), nums.end()) << endl;
}複雜度分析:
時間複雜度 o(n): 線性遍歷陣列 nums即可獲得結果,使用o(n) 時間。
LeetCode連續子陣列的最大和 動態規劃
輸入乙個整型陣列,陣列裡有正數也有負數。陣列中的乙個或連續多個整數組成乙個子陣列。求所有子陣列的和的最大值。要求時間複雜度為o n 輸入 nums 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。1 arr.length 10 5,100 arr i...
leetcode 連續子陣列的最大和(動態規劃)
題目描述 輸入乙個整型陣列,陣列裡有正數也有負數。陣列中的乙個或連續多個整數組成乙個子陣列。求所有子陣列的和的最大值。要求時間複雜度為o n 示例1 輸入 nums 2,1,3,4,1,2,1,5,4 輸出 6解釋 連續子陣列 4,1,2,1 的和最大,為 6 實現 def maxsubarray ...
動態規劃 連續子陣列的最大和
使用動態規劃 f i 以array i 為末尾元素的子陣列的和的最大值,子陣列的元素的相對位置不變 f i max f i 1 array i array i res 所有子陣列的和的最大值 res max res,f i 如陣列 6,3,2,7,15,1,2,2 初始狀態 f 0 6 res 6 ...