经典算法 最大子段和
题目描述
给你一个整数数组 nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组是数组中的一个连续部分。当所有整数均为负整数时定义其最大子段和为0.
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [-1]
输出:0
示例 3:
输入:nums = [5,4,-1,7,8]
输出:23
c++代码
贪心法
#include<bits/stdc++.h>
using namespace std;
int maxSubArray(vector<int>& nums) {
int ans = 0, mid = 0;
for (int x : nums) {
mid += x;
if (mid < 0) mid = 0;
else ans = max (ans, mid);
}
return ans;
}
int main() {
int n;
cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
cout << maxSubArray(nums);
return 0;
}//by wqs
单调队列法
#include<bits/stdc++.h>
using namespace std;
int maxSubArray(vector<int>& nums) {
int n = nums.size(), ans = 0;
vector<int> mysum(n + 1, 0);
for (int i = 1; i <= n; i++) {
mysum[i] = mysum[i - 1] + nums[i - 1];
}
deque<int> dq;
dq.push_back(0);
for (int i = 1; i <= n; i++) {
ans = max(ans, mysum[i] - mysum[dq.front()]);
while(!dq.empty() && mysum[dq.back()] > mysum[i]) dq.pop_back();
dq.push_back(i);
}
return ans;
}
int main() {
int n;
cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
cout << maxSubArray(nums);
return 0;
}//by wqs