题目链接
leetcode在线oj题——最大子数组和
题目描述
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
题目示例
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
输入:nums = [1]
输出:1
输入:nums = [5,4,-1,7,8]
输出:23
题目提示
- 1 <= nums.length <= 105
- -104 <= nums[i] <= 104
解题思路
我们可以采用动态规划的思想来解决这道问题
如果数组中只有一个元素:
显然最大子数组和就是这个元素的大小
如果数组有两个元素:
如果两个元素都是正数,最大子数组和是二者之和,否则就是这两个元素的较大值
如果数组有三个元素:
我们可以把前两个元素的最大子数组和看做一个元素,数组中第三个元素为另一个元素,这样的话就相当于两个元素,我们就可以按照上一种情况得出三个元素的最大子数组和
如果数组有n个元素:
我们可以把前n - 1个元素的最大子数组和看做一个元素,数组中第n个元素为另一个元素,这样的话就相当于两个元素,我们就可以按照数组有两种元素得出三个元素的最大子数组和
因此,我们只需要从头到尾遍历数组,如果前一个元素是正数,就把它加到后一个元素身上,最后再找出数组中的最大值即可
代码
class Solution {
public int maxSubArray(int[] nums) {
for (int i = 1; i < nums.length; i++) {
if(nums[i - 1] > 0){
nums[i] += nums[i - 1];
}
}
int max = nums[0];
for (int i = 0; i < nums.length; i++) {
if(nums[i] > max){
max = nums[i];
}
}
return max;
}
}