力扣刷题笔记18——连续子数组的最大和/动态规划

连续子数组的最大和

  • 问题
  • 我的代码
  • 示例代码

问题

来自力扣:

输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为O(n)。
示例1:
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
 
提示:
1 <= arr.length <= 10^5
-100 <= arr[i] <= 100

我的代码


#include 
using namespace std;
#include 
#include 
#include
#include 

 class Solution {
 public:
	 int maxSubArray(vector<int>& nums) {
		 if (nums.size() == 1) return nums[0];
		 int tmp1 = 0, tmp2 = 0, nsize = nums.size(), n_max = INT_MIN;
		 for (int i = 0; i < nsize; ++i) {
			 if (n_max < nums[i]) { n_max = nums[i]; }
			 if (tmp1 + nums[i] < 0) {
				 tmp1 = 0;

				 continue;
			 }
			 if (nums[i] >= 0) {
				 tmp1 += nums[i];

				 continue;
			 }
			 if (nums[i] < 0 ) {
				 if (tmp1 > tmp2)
					tmp2 = tmp1;
				 tmp1 += nums[i];
				 continue;
			 }

		 }
		 if (max(tmp1, tmp2) > 0)
			 return max(tmp1, tmp2);
		 return n_max;
	 }
 };
int main() {
	vector<int> prices = { -2,1,-3,4,-1,2,1,-5,4 };
	vector<int> prices2 = { 1,1,-3,-3 };
	Solution mysolution;
	int s = mysolution.maxSubArray(prices);
	int s2 = mysolution.maxSubArray(prices2);
	cout << s<<"\t"<<s2;
	return 0;
}

思路:
1定义一个tmp1记录当前子数组的和。定义tmp2记录tmp1出现过的最大的值。定义n_max记录整个数组中的最大值。
2当tmp1+nums[i]小于0时,证明当前这段子数组的和是负的,我们不要了,将tmp1归零,重新找。
3当nums[i]大于零时,tmp1+=nums[i]。
4当nums[i]小于零,但tmp1+nums[i]大于0,不一定要抛弃掉,因为可能后面会遇到很大的正数,所以tmp1+=nums[i]。
5回到步骤2,直到遍历完所有数。

返回值:如果tmp1和tmp2中的最大值大于0,则返回它。否则说明数组中没有大于0的数,直接返回最大值n_max。

示例代码

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        if(nums.size() == 0) return 0;
        int max_sum = nums[0];
        int sum = 0;
        for(int i = 0; i < nums.size(); i++)
        {
            if(sum >= 0)
                sum += nums[i];
            else
                sum = nums[i];
            
            max_sum = sum > max_sum? sum : max_sum;
        }
        return max_sum;
    }
};

感觉思路上和我大体差不多,但是有一个关键不同。我是先判断,再考虑要不要往tmp1上加。而示例代码是先加上去,再判断是不是变小了还是变大了。
总结就是,我的代码之所以需要很多个if,是因为我的代码结果只能导致得到的tmp1只能是非负的,不能是负的,所以需要为全负的数组做一些额外的处理。

你可能感兴趣的:(算法题,leetcode,动态规划,算法)