//分治法
var maxSubArray = function(nums) {
if(nums.length<=1){
return nums[0];
}
let mid = Number.parseInt(nums.length / 2);
let lSum=maxSubArray(nums.slice(0, mid));//[0,mid-1]
let rSum=maxSubArray(nums.slice(mid));//[mid,-1]
let crossMidSum=crossSum(nums,mid);
return Math.max(Math.max(lSum,rSum),crossMidSum);
};
function crossSum(nums,mid){
let leftMaxSum=-Infinity,leftCurSum=0,rightMaxSum=-Infinity,rightCurSum=0;
for(let i=mid-1;i>=0;i--){//[0,mid-1]
leftCurSum+=nums[i];
leftMaxSum=Math.max(leftMaxSum,leftCurSum);
}
for(let i=mid;i<nums.length;i++){//[0,mid-1]
rightCurSum+=nums[i];
rightMaxSum=Math.max(rightMaxSum,rightCurSum);
}
return leftMaxSum+rightMaxSum;
}
//dp
var maxSubArray = function(nums) {
let dp=Array(nums.length).fill(0);
//dp[i] 是 以nums[i]打头的最长子序列和
dp[nums.length-1]=nums[nums.length-1];
let maxSum=dp[nums.length-1];
for(let i=nums.length-2;i>=0;i--){
dp[i]=Math.max(dp[i+1]+nums[i],nums[i]);
maxSum=Math.max(dp[i],maxSum);
}
return maxSum;
};
//贪心
var maxSubArray = function(nums) {
let maxSum=nums[0],sum=nums[0];
for(let i=1;i<nums.length;i++){
if(sum<0){
sum=0;//重新再找寻新的字串和
}
sum+=nums[i];//sum代表旧有结果,只有在旧有结果对当下有益时才使用
maxSum=Math.max(maxSum,sum);
}
return maxSum;
};
分治
dp
贪心