输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
要求时间复杂度为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
解答1:暴力求解:枚举所有的子数组并求出它们的和。(超出时间限制)
#include<iostream>
using namespace std;
#include<vector>
//暴力求解
int maxSubArray(vector<int>& nums) {
int max = INT_MIN;
for (int i = 0; i < nums.size(); i++) {
for (int j = i; j < nums.size(); j++) {
int sum = 0;
for (int k = i; k <= j; k++) {
sum += nums[k];
}
if (sum > max) {
max = sum;
}
}
}
return max;
}
//int maxSubArray(vector<int>& nums) {
// int max = INT_MIN;
// for (int i = 0; i < nums.size(); i++) {
// int sum = 0;
// for (int j = i; j < nums.size(); j++) {
// sum += nums[j];
// if (sum > max) {
// max = sum;
// }
// }
//
// }
// return max;
//}
void test01() {
vector<int>nums;
nums.push_back(1);
nums.push_back(-2);
nums.push_back(3);
nums.push_back(10);
nums.push_back(-4);
nums.push_back(7);
nums.push_back(2);
nums.push_back(-5);
int a = maxSubArray(nums);
cout << a << endl;
}
int main() {
test01();
system("pause");
return 0;
}
解答2:当前i-1个数字的和为负数,与第i个数字相加的和小于第i个数,所以将前i-1个数舍弃。如果前i-1个数的和为正数,则继续求与第i个数的和。如果i个数的和比最大和更大,更新最大和。
#include<iostream>
using namespace std;
#include<vector>
//分析
int maxSubArray(vector<int>& nums) {
int max = INT_MIN;
int sum = 0;
for (int i = 0; i < nums.size(); i++) {
if (sum <= 0) {
sum = nums[i];
}
else sum += nums[i];
if (sum > max) {
max = sum;
}
}
return max;
}
void test01() {
vector<int>nums;
nums.push_back(1);
nums.push_back(-2);
nums.push_back(3);
nums.push_back(10);
nums.push_back(-4);
nums.push_back(7);
nums.push_back(2);
nums.push_back(-5);
int a = maxSubArray(nums);
cout << a << endl;
}
int main() {
test01();
system("pause");
return 0;
}
解答3:动态规划
#include<iostream>
using namespace std;
#include<vector>
int maxSubArray(vector<int>& nums) {
int sum = 0;
int max = INT_MIN;
for (int i = 0; i < nums.size(); i++) {
if (sum + nums[i] > nums[i]) {
sum = sum + nums[i];
}
else
{
sum = nums[i];
}
if (sum > max) {
max = sum;
}
}
return max;
}
void test01() {
vector<int>nums;
nums.push_back(1);
nums.push_back(-2);
nums.push_back(3);
nums.push_back(10);
nums.push_back(-4);
nums.push_back(7);
nums.push_back(2);
nums.push_back(-5);
int a = maxSubArray(nums);
cout << a << endl;
}
int main() {
test01();
system("pause");
return 0;
}