【LeetCode53】-最大子序和

方法一(DP)

实现思路

在这里插入图片描述关键在于找到状态转移方程

实现代码

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
class Solution {
    
    
public:
	int maxSubArray(vector<int>& nums) {
    
    
		if (nums.size() == 0) return 0;
		vector<int> dp(nums.size(), 0);
		int max = nums[0];
		dp[0] = nums[0];
		for (int i = 1;i < nums.size();i++) {
    
    
			dp[i] = nums[i] > nums[i] + dp[i - 1] ? nums[i] : nums[i] + dp[i - 1];
			if (dp[i] > max)max = dp[i];
		}
		return max;
	}
};

int main() {
    
    
	return 0;
}

提交结果及分析

在这里插入图片描述
时间复杂度和空间复杂度都为O(n)

思考

要理解DP算法和分治法,虽然都是根据子问题进行求解,但是DP算法的子问题对后续求解会依次有影响,分治法是独立进行求解的

方法二(分治法)

实现思路

在这里插入图片描述在这里插入图片描述

实现代码

在这里插入图片描述

时间复杂度分析

在这里插入图片描述在这里插入图片描述在这里插入图片描述

参考视频链接

小总结

之前利用分治的方法进行求解,但是在求解的过程中,跨越中间解没有写,其实存在漏洞,再就是利用max函数求解三个数的最大值,多利用了一个临时变量浪费空间

猜你喜欢

转载自blog.csdn.net/weixin_44944046/article/details/112908134
今日推荐