//说实话没想到竟然通过了但是心里其实是不太明白的
class Solution {
public:
int maxSubArray(vector<int>& nums)
{
int re_max = 0;
int max = 0;
bool flag = true;
int flags = nums[0];
for (int i = 0; i < nums.size(); ++i)
{
if (nums[i] > 0)
flag = false;
if (nums[i] > flags)
flags = nums[i];
}
if (flag)
{
return flags;
}
for (int i = 0; i < nums.size(); ++i)
{
//跳过开头的负数:但是还有可能全部是负数啊!!!!!!!
//所以不能跳过
//但是机智的我,检测了全部是负数的情况,所以还是跳过了
if (max == 0 && nums[i] <= 0)
{
continue;
}
else
{
max += nums[i];
if (re_max < max)
{
re_max = max;
}
//好像精髓在这里,放弃小的
if (max < 0)
max = 0;
}
}
return re_max;
}
};
官方对于动态规划说明的比较精髓:里面我加了一些注释,是我自己的理解。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if (nums.size() == 0) return NULL;
int res = INT_MIN;
//这里设置为负数是个需要注意的,因为第一位如果是负数,那就不能设置正数
int sum = 0;
for (int i = 0; i < nums.size(); ++i)
{
//从新开始的数据大还是累加的数据大
//如果是前面的的就是新的开始,如果是后面一个就是累加的
sum = max(nums[i], sum + nums[i]);
//旧的
res = max(sum, res);
}
return res;
}
};
作者:gpe3DBjDS1
链接:https ://leetcode-cn.com/problems/two-sum/solution/zui-da-zi-xu-he-by-gpe3dbjds1/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
还有一个分治法