前言
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
尝试了一下,只解决了部分示例,没完全解决,后面看了官方的题解,官方给了动态规划和分治,分治看的有点迷糊,但是大概意思是明白了,后面再研究研究,本文主要介绍动态规划解法。
一、方法一:暴力法
找出数组中所有可能的子序列,然后找出子序列中和最大的,这个工程太庞大了,但是确实最容易想到了,这里就不贴代码了,遍历求和就行。
二、动态分配
思路和暴力法差不多,但是每次在两个子序列中求出最大的,遍历数组后,剩下的就是最大子序列之和了。
代码如下(示例):
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if(nums.size()<2)return nums[0];
//maxArray = nums[0],如果maxArray =0,将使存在负数的数组出现最大值为零的情况。
int pre=0,maxArray = nums[0];
for(auto x:nums){
//1、max(pre+x,x)=x,则pre存储为新开子序列第一个值
//2、max(pre+x,x)=pre+x,则pre存储为前一个子序列sum
pre = max(pre+x,x);
//3、max(maxArray,pre)=pre,则maxArray被新的子序列之和替代
//4、max(maxArray,pre)=maxArray,则maxArray仍为前一个子序列之和
maxArray = max(maxArray,pre);
}
return maxArray;
}
};
更多题解请前往leetCode官网最大子序列题解