题目:给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组是数组中的一个连续部分。
心路历程:
-
最初想着求最大子数组的和,那如果第一个数为负数,肯定得舍掉,然后又进一步想第二个数如果是负数肯定也不行。所以就对最初的负数进行了过滤,但发现这样还是有很多的漏洞,比如说绝对值很大的负数在中间怎么办呢,那这个方法就得pass掉。
-
这个时候就得转变一下思想,理清一下得出最大和过程中需要看哪些量,首先要一个变量cur_sum作为当前连续的子数组和,这个连续不一定是从第一个元素开始,可以从中间开始,但一定要连续。这时候还是在对数组的循环当中,遍历到 nums[i] 的时候,cur_sum是 nums[i] 之前的连续子数组和,那如果说cur_sum+nums[i]的值比起_nums[i]_还要小的话,那相当于说之前的cur_sum对nums[i]起到了一个负增长的的作用,所以这个时候就把nums[i]直接赋值给cur_sum。
-
试着想这么一种情况 3 5 -9 2,在运行完_2_的时候,cur_sum的值将变为2,但最大连续和应该是8,所以在运行中还要加上一个变量max_sum。
上代码(借鉴了leetcode的官方解)
动态规划算法
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int cur_sum;
int max_sum;
cur_sum=max_sum=nums[0];
for(int i=1;i<nums.size();i++)
{
cur_sum=max(nums[i],cur_sum+nums[i]);
max_sum=max(cur_sum,max_sum);
}
return max_sum;
}
};