题目:
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1]
输出:1
示例 3:
输入:nums = [0]
输出:0
这道题确实没想明白。后来看的解析才知道的,先说说自己的思路,想到的是用for循环做,从第一个数字加到数组的最后一个数字,并用临时变量记录最长的那个和对应的末位数所在位置。然后从最后一个数字加到第一个数字。用临时变量记录最大和对应的开头数字所在位置。
代码测试了两次增加了很多判定但是最后还是错掉了,思路上有点偏差,代码如下:
int maxSubArray(vector<int>& nums) {
int a=0,b;
int i,j,k;
int length = nums.size();
b=length-1;
//int len=length-1;
int temp1=0,temp2=0;
int sum=0,sum1,sum2;
sum1=nums[0];
sum2=nums[length-1];
//sum2=0;
//cout<<sum1<<sum2<<endl;
if(length==1)
{
sum=nums[0];
return sum;
}
else if(length>1)
for(i=0;i<length;i++)
{
temp1=temp1+nums[i];
if(temp1>sum1)
{
sum1=temp1;
a=i;
}
}
for(j=length-1;j>=0;j--)
{
temp2 += nums[j];
if(temp2>sum2)
{
sum2=temp2;
b=j;
}
}
if(a<b)
sum=max(sum1,sum2);
for(k=b;k<=a;k++)
{
sum+=nums[k];
}
cout<<a<<b<<endl;
return sum;
}
正确解答方式:
#include <iostream>
#include <vector>
#include<algorithm>
using namespace std;
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int pre = 0, maxAns = nums[0];
for (const auto& x : nums) {
pre = max(pre + x, x);
maxAns = max(maxAns, pre);
}
return maxAns;
}
};
int main() {
Solution S;
vector<int> num= { -2, 1, -3, 4, -1, 2, 1, -5, 4 } ;
int temp = S.maxSubArray(num);
cout <<"最长子序和为:"<< temp << endl;
return 0;
}
动态规划
方法二:分治
两个方法,第一次接触动态规划不是很理解。似懂非懂,待后期补充。
参考:
https://leetcode-cn.com/problems/maximum-subarray/