#include<iostream>
using namespace std;
int MaxSum(int n, int a[], int &l, int &r)
{
int sum=0, b=0, i=0, bestI=0, bestJ=0;
for(int j = 1; j <= n; j++)
{
if(b > 0)
{
b += a[j];
}
else
{
b = a[j]; i = j;
}
if(b > sum)
{
sum = b; bestI = i; bestJ = j;
}
}
l = bestI;
r = bestJ;
return sum;
}
int main()
{
int flag[10] = {-2, 11, -4, 13, -5, 2};
//int flag[10] = {-7, 11, -4, -13, -5, -2};
int besti, bestj, sum;
sum = MaxSum(6, flag, besti, bestj);
cout<<"最大子段和: "<<sum<<endl;
cout<<"初始下标: "<<besti<<endl;
cout<<"最终下标: "<<bestj<<endl;
}
输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
class Solution {
public int maxSubArray(int[] nums) {
int n=nums.length;
int[] dp=new int[n];
dp[0]=nums[0];
int ans=dp[0];
for(int i=1;i<n;i++){
//因为要求连续数组,那么一定dp[i]与nums[i]相关
dp[i]=Math.max(dp[i-1]+nums[i],nums[i]);
ans=Math.max(ans,dp[i]);
}
return ans;
}
}