最大子數(shù)組和
Leecode鏈接: https://leetcode.cn/problems/maximum-subarray/
題目描述:
給你一個(gè)整數(shù)數(shù)組 nums 辞友,請(qǐng)你找出一個(gè)具有最大和的連續(xù)子數(shù)組(子數(shù)組最少包 含一個(gè)元素)亏钩,返回其最大和。
子數(shù)組 是數(shù)組中的一個(gè)連續(xù)部分镜悉。
示例 1:
輸入:nums = [-2,1,-3,4,-1,2,1,-5,4]
輸出:6
解釋:連續(xù)子數(shù)組 [4,-1,2,1] 的和最大,為 6 聘裁。
示例 2:
輸入:nums = [1]
輸出:1
示例 3:
輸入:nums = [5,4,-1,7,8]
輸出:23
提示:
1 <= nums.length <= 105
-104 <= nums[i] <= 104
進(jìn)階:如果你已經(jīng)實(shí)現(xiàn)復(fù)雜度為 O(n) 的解法担锤,嘗試使用更為精妙的 分治法 求解被丧。
來源:力扣(LeetCode)
鏈接:https://leetcode.cn/problems/maximum-subarray
動(dòng)態(tài)規(guī)劃思想
將一個(gè)問題拆成幾個(gè)子問題乱顾,分別求解這些子問題板祝,即可推斷出大問題的解。
f(n)( nums[n] 結(jié)尾的連續(xù)子數(shù)組的最大和)= Max(f(n-1)+ nums[n], f(n-1) )
當(dāng) nums[n]>=0時(shí)走净,加上nums[n]能得到到n的更大的和券时,
當(dāng)nums[n]<0時(shí),不加nums[n]才是到加到第n個(gè)數(shù)的最大和
采用動(dòng)態(tài)規(guī)劃的解法:
var maxSubArray = function(nums) {
const len = nums.length;
if(len === 1) return nums[0]
let maxNum = new Array(len).fill(0);
maxNum[0] = nums[0];
let max = nums[0];
for(let i=1; i<len; i++){
maxNum[i] = Math.max(maxNum[i-1]+nums[i], nums[i]);
max = Math.max(max, maxNum[i]) //找到其中的最大值
}
return max
};