【剑指offer】面试题42. 连续子数组的最大和

2020.7.17更新

动态规划
时间复杂度O(n)
空间复杂度O(1)

代码1

//1.定义数组元素的含义
// 以第i个数字结尾的子数组的最大和
//2.找出关系数组间的关系式
// if(dp[i-1]>0) dp[i]=dp[i-1]+nums[i]
// else dp[i]=nums[i];
//3. 找出初始值
// dp[0]=nums[0];
class Solution {
public:
    int maxSubArray(std::vector<int>& nums) {
        if (nums.size() <= 0) return 0;
        int nCurSum = 0;
        int nGreatestSum = nums[0];
        for (int i = 0; i < nums.size(); i++) {
            if (nCurSum <= 0) {
                nCurSum = nums[i];
            }
            else {
                nCurSum += nums[i];
            }
            if (nCurSum > nGreatestSum) nGreatestSum = nCurSum;
        }
        return nGreatestSum;
    }
};

代码2

class Solution {
public:
    int maxSubArray(std::vector<int>& nums) {
        if (nums.size() <= 0) return 0;
        std::vector<int> dp(nums.size() + 1);
        dp[0] = nums[0];//定义初始值
        int ans = dp[0];
        for (int i = 1; i < nums.size(); i++) {
            dp[i] = std::max(dp[i - 1] + nums[i], nums[i]);
            if (dp[i] > ans) ans = dp[i];
        }
        return ans;
    }
};

代码

class Solution {
public:
	int maxSubArray(vector<int>& nums) {
		vector<int> dp(nums.size());//dp数组大小
		//边界
		dp[0] = nums[0];
		//状态转移
		for (int i=1;i<nums.size();i++)
		{
			dp[i] = max(nums[i], nums[i] + dp[i - 1]);
		}
		//求出最大值
		vector<int>::iterator myMax = max_element(dp.begin(), dp.end());
		return *myMax;
	}
};

你可能感兴趣的:(【魂】算法)