力扣:最大子序和

 

//说实话没想到竟然通过了但是心里其实是不太明白的
class Solution {
public:
	int maxSubArray(vector& 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;
	}
};

官方的评论:https://leetcode-cn.com/problems/maximum-subarray/solution/cxiang-xi-chan-shu-dong-tai-gui-hua-fen-zhi-fa-tao/

官方对于动态规划说明的比较精髓:里面我加了一些注释,是我自己的理解。

class Solution {
public:
	int maxSubArray(vector& 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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


还有一个分治法 

 

你可能感兴趣的:(LeetCode)