首页 > 试题广场 >

子数组的最大累加和问题

[编程题]子数组的最大累加和问题
  • 热度指数:85502 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个长度为 n 的数组 arr ,返回其中任意连续子数组的最大累加和

题目保证没有全为负数的数据

数据范围:,数组中元素值
要求:时间复杂度为,空间复杂度为

示例1

输入

[1, -2, 3, 5, -2, 6, -1]

输出

12

说明

[3,6]范围内的子数组之和最大,3+5-2+6=12   
示例2

输入

[1]

输出

1

备注:

int maxsumofSubarray(int* arr, int arrLen ) {
// write code here

int dp[arrLen+1];
memset(dp,0,arrLen+1);
dp[0] = arr[0];
int max = dp[0];

for(int i=1;i<arrLen;i++)
{
    dp[i] = dp[i-1]+arr[i] > arr[i] ? dp[i-1]+arr[i]:arr[i];
    max = dp[i]>dp[i-1] ? dp[i]:dp[i-1];
}

return max;

}

发表于 2021-09-05 13:10:23 回复(0)
#if 0
int maxsumofSubarray(int* arr, int arrLen ) 
{
    int arrOut[arrLen];
    int max;
    arrOut[0] = arr[0];
    max = arrOut[0];
    for (int i=1;i<arrLen;i++)
    {
        if (arrOut[i-1]<0)
        {
            arrOut[i] = arr[i];
        }
        else
        {
            arrOut[i] = arrOut[i-1] + arr[i];
        }
        if (arrOut[i]>max)
        {
            max = arrOut[i];
        }
    }
    return max;
}
#endif

/* 优化 */
int maxsumofSubarray(int* arr, int arrLen ) 
{
    int arrSum;
    int max;
    arrSum= arr[0];
    max = arr[0];
    for (int i=1;i<arrLen;i++)
    {
        arrSum += arr[i];
        if (arrSum <0)        arrSum = 0;
        if (arrSum>max)    max = arrSum;
    }
    return max;
}
发表于 2021-07-20 22:17:57 回复(0)
int maxsumofSubarray(int* nums, int numsSize) {
  int i, sum = *nums, ans = *nums;
  for (i = 1; i < numsSize; ++i) {
    if (sum >= 0) sum += *(nums + i);
    else sum = *(nums + i);
    ans = fmax(ans, sum);
  }

  return ans;
}

发表于 2021-07-17 12:31:03 回复(0)