孔乙己行为之最大子序和的三种解法

137 阅读1分钟
//分治法
 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

贪心