目錄
1 問題
2 輸入輸出
3 解法
1)貪心方法
2)動態規劃
3)動態規劃空間優化
4 **
給定乙個整數陣列 nums ,找到乙個具有最大和的連續子陣列(子陣列最少包含乙個元素),返回其最大和
示例:輸入: [-2,1,-3,4,-1,2,1,-5,4],
輸出: 6
解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6。
步驟:
使用貪心策略,
如果之前的和
sum為
<=0
,那麼丟棄之前的項
,更新sum
為當前項;如果之前的
sum >0,
更新sum
為當前與原來
sum之和。
而結果(最大子和)
result
為max。
-2 1
-3 4
-1 2
1 -5
4 當前值 -2
1 -3
4 -1
2 1
-5 4
之前和
null -2
1 -2
4 35 6
1當前和 -2
1 -2
4 35 6
1 5最大值 -2
1 14 4
5 66 6
時間複雜度:o(n)
空間複雜度:o(1)
子問題:「連續子陣列的最大和」
,如圖
轉移方程:如圖
時間複雜度:
o(n)
,其中n
為nums
陣列的長度。我們只需要遍歷一遍陣列即可求得答案。
空間複雜度:
o(n)
。我們只需要常數空間存放若干變數。
時間複雜度:
o(n)
,其中n
為nums
陣列的長度。我們只需要遍歷一遍陣列即可求得答案。
空間複雜度:
o(1)
。我們只需要常數空間存放若干變數。
/**
* @param arr
* @return
* 功能:陣列最大子串行和
* 貪心方法:如果當前元素之前和為負,則拋棄之前元素
*/var maxsubarray = function(arr)
let sum = arr[0];//當前元素之前和,初始值為第一項
let result = arr[0];//結果,初始值為第一項
for(let i = 1; i < arr.length; i++) else
result = math.max(result, sum);//result取得兩者最大值
}return result;
};/**
* @param arr
* @return
* 功能:陣列最大子串行和
* 動態規劃:dp連續子陣列最大和
*/var maxsubarray_1 = function(arr)
let dp = ;//連續子陣列最大和
dp[0] = arr[0];//
let result = arr[0];//結果,初始值為第一項
for(let i = 1; i < arr.length; i++)
return result;
};/**
* @param arr
* @return
* 功能:陣列最大子串行和
* 動態規劃:dp連續子陣列最大和,優化空間,因為只需要記住前面乙個,所以陣列改為單個變數
*/var maxsubarray_2 = function(arr)
let dp = arr[0];//連續子陣列最大和
let result = arr[0];//結果,初始值為第一項
for(let i = 1; i < arr.length; i++)
return result;
};
參考:力扣
百里於2023年5月23日
力扣 53 最大子序和
題目描述 簡單 給定乙個整數陣列nums,找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。題目鏈結 示例 1 輸入 2,1,3,4,1,2,1,5,4 輸出 6解釋 連續子陣列 4,1,2,1 的和最大,為 6。演算法分析 設dp i 表示以第i個數結尾的子陣列的最大和,那麼只...
力扣53 最大子序和
給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。法一 利用二級指標申請乙個二維陣列 a int malloc sizeof int m fo...
力扣題解 最大子序和
題目 給定乙個整數陣列 nums 找到乙個具有最大和的連續子陣列 子陣列最少包含乙個元素 返回其最大和。int n nums.length int msa newint n msa 0 nums 0 int max msa 0 for int j 1 j return max 解析 求最大子序和,最...