题目描述:
53. 最大子序和
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:输入:nums = [1]
输出:1
示例 3:输入:nums = [0]
输出:0
示例 4:输入:nums = [-1]
输出:-1
示例 5:输入:nums = [-100000]
输出:-100000
提示:
1 <= nums.length <= 105
-104 <= nums[i] <= 104
进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。
原文链接:
思想:
- 动态规划思想;
- 每遍历一个元素都对应一个新的子序和;
- 如果这个新的子序和是负数,直接丢掉;
- 如果这个新的子序和是正数,则对这个新的子序和和老的子序和进行比较,比较之后进行处理;
动态规划思想,解决该问题; 1)遍历数组: 1.1)从第一个元素起,计算出每个元素的子序和 1.2)如果该子序和是负数,则将第一个元素移动到下一个元素; 1.3)如果该子序和是正数,则将该子序和存入一个变量中,后边每次新生成的子序和与原先的比较,大的替换小的。 2)遍历结束,当前的变量就是最大子序和,就是结果。
代码:
package zyh.springcloud.chapter2.service.impl.algorithm;
/**
* @ClassName MaximumSubarray
* @Author zhangyonghui
* @Description
* @Date 2021/11/4 15:59
* @Version 1.0
**/
public class MaximumSubarray {
public static void main(String[] args) {
int[] nums = new int[]{-2, 1, -3, 4, -1, 2, 1, -5, 4};
int outSubSum = maxSubArray(nums);
System.out.println("最大子序和 = " + outSubSum);
}
/**
* 最大子序和
* 动态规划思想,解决该问题;
* 遍历数组:
* 从第一个元素起,计算出每个元素的子序和
* 如果该子序和是负数,则将第一个元素移动到下一个元素;
* 如果该子序和是正数,则将该子序和存入一个变量中,后边每次新生成的子序和与原先的比较,大的替换小的。
* 遍历结束,当前的变量就是最大子序和,就是结果。
* @param nums
* @return
*/
public static int maxSubArray(int[] nums) {
//遍历数组:
int outSubSum = nums[0];
int subSum = 0;
for (int i = 0; i < nums.length; i++) {
// 如果之前的子序和是负数,则将第一个元素移动到下一个元素;
if (subSum < 0) {
subSum = nums[i];
}
//如果之前的子序和是正数,则将当前元素加上去:
else {
subSum = nums[i] + subSum;
}
//每次新生成的子序和与原先的比较,大的替换小的。
outSubSum = subSum > outSubSum ? subSum : outSubSum;
}
return outSubSum;
}
}