算法练习第16道-最大子数组和

161 阅读3分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

题目

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/im…

示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。


示例 2:

输入:nums = [1]
输出:1


示例 3:

输入:nums = [5,4,-1,7,8]
输出:23

思路分析

  • 第一步,确定初始值pre和 maxAns初始最大值
  • 第二步,循环遍历数据
  • 遍历数据需要寻找两个值,第一个是pre,第二个就是最大值maxAns
  • pre的值产生的方式,分别是比较prx+x的值与x对比,选大的
  • maxAns的产生是比较 pre的值与maxAns比较,选大的
  • 所以pre的产生是这样的
  • 如上数组
  • 第一次循环
  • pre=0, x=-2 => 因为要找出最大的连续子串,所以比较的事 prx+x 与x
    
  • 那么得到的最大值就是-2
    
  • maxAns初始值是num[0],所以maxAns的最大是-2
    
  • 第二次循环
  • pre = -2, x = 1, pre+x => -1 比较 x=1 => pre = 1
    
  • 比较pre=1 与maxAns=-2 ,得到maxAns = 1
    
  • 第三次循环
  •  pre = 1, x=-3, pre+x = -2 => pre = -2
    
  •  pre = -2, maxAns = 1 => maxAns = 1
    
  • 第四次:
  •  pre = -2, x = 4, pre+x = 2, => pre = 4
    
  •  pre = 4, maxAns = 1 => maxAns = 4
    
  • 第五次
  •  pre = 4, x= -1, pre +x = 3 => pre = 3
    
  •  pre = 3, maxAns = 4 => maxAns = 4
    
  • 第六次
  •  pre = 3, x = 2, pre +x = 5 => pre = 5
    
  •  pre = 5, maxAns = 4 => maxAns = 5
    
  • 第七次
  •  pre = 5, x = 1, pre +x = 6 => pre = 6
    
  •  pre = 6, maxAns = 5 => maxAns = 6
    
  • 第八次
  •  pre = 6, x = -5, pre +x = 1 => pre = 1
    
  •  pre = 1, maxAns = 6 => maxAns = 6
    
  • 第九次
  •   pre = 1, x = 4, pre +x = 5 => pre = 5
    
  •  pre = 5, maxAns = 6 => maxAns = 6
    
  • 最终返回最大值maxAns

代码

let nums = [-2,1,-3,4,-1,2,1,-5,4]
let maxSubArray = function(nums) {
  /**
   * 第一步,确定初始值pre和 maxAns初始最大值
   * 第二步,循环遍历数据
   *    遍历数据需要寻找两个值,第一个是pre,第二个就是最大值maxAns
   *    pre的值产生的方式,分别是比较prx+x的值与x对比,选大的
   *    maxAns的产生是比较 pre的值与maxAns比较,选大的
   * 所以pre的产生是这样的
   * 如上数组
   *    第一次循环
   *     pre=0, x=-2 => 因为要找出最大的连续子串,所以比较的事 prx+x 与x
   *     那么得到的最大值就是-2
   *     maxAns初始值是num[0],所以maxAns的最大是-2
   *    第二次循环
   *     pre = -2, x = 1, pre+x => -1 比较 x=1 => pre = 1
   *     比较pre=1 与maxAns=-2 ,得到maxAns = 1
   *    第三次循环
   *      pre = 1, x=-3, pre+x = -2 => pre = -2
   *      pre = -2, maxAns = 1 => maxAns = 1
   *    第四次:
   *      pre = -2, x = 4, pre+x = 2, => pre = 4
   *      pre = 4, maxAns = 1 => maxAns = 4
   *    第五次
   *      pre = 4, x= -1, pre +x = 3 => pre = 3
   *      pre = 3, maxAns = 4 => maxAns = 4
   *    第六次
   *      pre = 3, x = 2, pre +x = 5 => pre = 5
   *      pre = 5, maxAns = 4 => maxAns = 5
   *    第七次
   *      pre = 5, x = 1, pre +x = 6 => pre = 6
   *      pre = 6, maxAns = 5 => maxAns = 6
   *    第八次
   *      pre = 6, x = -5, pre +x = 1 => pre = 1
   *      pre = 1, maxAns = 6 => maxAns = 6
   *    第九次
   *       pre = 1, x = 4, pre +x = 5 => pre = 5
   *      pre = 5, maxAns = 6 => maxAns = 6
   *    
   *    最终返回最大值maxAns
   *      
   * */ 
  let pre = 0, maxAns = nums[0];
  nums.forEach((x) => {
    console.log(`x=${x}`)
    pre = Math.max(pre + x, x);
    console.log(`pre=${pre}`)
    maxAns = Math.max(maxAns, pre);
    console.log(`maxAns=${maxAns}`)
  });
  return maxAns;
}

maxSubArray(nums)

测试结果

image.png