美文网首页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