方法一(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函数求解三个数的最大值,多利用了一个临时变量浪费空间