美文网首页leetcode --- js版本
leetcode-Easy-第10期-数组-Maximum Su

leetcode-Easy-第10期-数组-Maximum Su

作者: 石头说钱 | 来源:发表于2019-03-05 22:39 被阅读0次

求数组中元素相加所能取得的最大值,这些元素必须相临,复杂度为O(n)

  • Example
Input: [-2,1,-3,4,-1,2,1,-5,4],
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.
  • 解法
var maxSubArray = function(nums) {
  let max = nums[0];
  let sum = 0;
  const len = nums.length;
  for(let i=0; i < len; i++){
   //遍历累加
    sum += nums[i] 
  //累加一次就和以前的最大值比较,并将最大值赋予给max,这样max永远都是最大值
    if(sum > max){
      max = sum
    }
    // 最关键的一步,当sum累加的值为负数,与下一个数累相加和只会变小
   // 所以这个时候,让sum=0,从下一个数开始从新累加,然后新累加的值,继续和原来最大的max比较
    if( sum < 0){
      sum = 0;
    }
  }
  return max
};

思考如果返回的是最大和的元素组成

var arr = [0,-3,-1,-23,9,99,-5,-5]
var res = maxSubArray(arr)
console.log(res) // [9,99]

解法:
var maxSubArray = function(nums) {
  let max = nums[0];
  let sum = 0;
  const len = nums.length;
  let start = 0;
  let end = 0;
  let e = 0;
  let s = 0;
  for(let i=0; i < len; i++){
    sum += nums[i] 
    if(sum >= max){
      // 只要出现sum大于max,那么最后一个值肯定就是sum[i]
      end = i + 1
      start = s
      max = sum
    }
    if( sum < 0){
      sum = 0;
      // 当sum为负数,有可能接下来的累加值会大于之前的最大max
      // 所以这里的起点先保存一个,后面如果累加大于前面的,起点从这里算
      // [1,2,-4,5,6]为例子: 当i为2的时候,sum = 1+2-4 =-1小于0
      // 而接下来5+6会是最大值,起点是5所在的位置为i=3
      s =  i + 1 
    }
  }
  const arr = nums.slice(start,end )
  return arr
};



相关文章

网友评论

    本文标题:leetcode-Easy-第10期-数组-Maximum Su

    本文链接:https://www.haomeiwen.com/subject/sgwauqtx.html