js實現最大子序和 力扣

2021-10-06 10:03:16 字數 2267 閱讀 7140

目錄

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 解析 求最大子序和,最...