1.题目介绍
给定一个整数数组 nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组是数组中的一个连续部分。
1 <= nums.length <= 105
-104 <= nums[i] <= 104
2.解决思路
要求出一个数组中和最大的子数组的和,这通常有很多种解法,比如暴力遍历、分治、动态规划等,我这里采用动态规划去解决,具体思路如下:既然要求出和最大的值,那么肯定要有一个变量f1用来记录最大的值,至于如何求出最大的值是多少,我们可以采用循环比较的方法不断取 i 和i-1 之间的最大值,并用临时值记录f2下来,如果数组从前向后不断增大,那么显而易见这个临时值f2表示的就是当前位置 i 的前缀和,也就是当前的最大和的数组,并不断将这个最大值赋值给f1。若遍历过程中出现了一个负数,中间值会变小。最大值f1通过比较仍取相对大的原值,也就是f1记录的永远是最大和子数组。然后中间值继续向后遍历,同样的逻辑,比f1更大则赋值给f1,比f1小则继续向后遍历,最终f1记录的就是和最大的子数组的和。
3..步骤讲解
1.定义maxSum记录最大数组和,currentSum记录遍历过程中的临时值
2.遍历数组
3.不断比较当前遍历到的值与临时值+当前遍历值的大小,取最大值
4.临时值与最大值进行比较,保持maxSum永远记录最大值
5.返回结果
4.代码展示
public int maxSubArray(int[] nums) {//记录最大值int maxSum = nums[0];//记录中间值int currentSum = nums[0];for (int i = 1; i < nums.length; i++) {//比较临时值增大还是减小currentSum = Math.max(nums[i], currentSum + nums[i]);//永远保持记录最大值maxSum = Math.max(maxSum, currentSum);}return maxSum;
}
5.执行结果
在leetcode测试用例中平均耗时1ms
内存分布56.11MB