列表

详情


OR176. 连续子数组最大和

描述

输入一个整形数组(可能有正数和负数),求数组中连续子数组(最少有一个元素)的最大和。要求时间复杂度为O(n)。

输入描述

【重要】第一行为数组的长度N(N>=1)

接下来N行,每行一个数,代表数组的N个元素

输出描述

最大和的结果

示例1

输入:

8
1
-2
3
10
-4
7
2
-5

输出:

18

说明:

最大子数组为 3, 10, -4, 7, 2

原站题解

C 解法, 执行用时: 1ms, 内存消耗: 360KB, 提交时间: 2020-07-12

#include <stdio.h>
int main() {
    int n;
    scanf("%d", &n);
    int a[n], i;
    for(i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }
 
    if(n == 0) {
        printf("0\n");
        return 0;
    }
    else if (n == 1) {
        printf("%d\n", *a);
        return 0;
    }
    
    
    int dp[n], max = -1000000;
    dp[0] = a[0];
    for(i = 1; i < n; i++) {
       if(dp[i-1] + a[i] > a[i]) {
           dp[i] = dp[i-1] + a[i];
       } else {
           dp[i] = a[i];
       }
    }
    
    for(i = 0; i < n; i++) {
        if(max < dp[i])
            max = dp[i];
    } 
    
    printf("%d\n", max);
    return 0;
}

C 解法, 执行用时: 1ms, 内存消耗: 372KB, 提交时间: 2021-02-03

#include <stdio.h>
#define MAXLEN 2000

int maxSum(int* arr,int len)
{
    if(!arr || len ==0)
    {
        return 0;
    }
    int maxsum = 0;
    int sum  = 0;
    sum = arr[0];
    maxsum = arr[0];
    for(int i = 1; i< len;i++)
    {
        sum += arr[i];
        if(sum < arr[i])
        {
            sum = arr[i];
        }
        maxsum = maxsum > sum ? maxsum:sum;
    }
    return maxsum;
}

int main()
{
    int arr[MAXLEN] = {0}; 
    int i =0;
    int n = 0;
    int tmp = 0;
    int max_sum = 0;
    
  //  printf("输入数组大小:");
    scanf("%d",&n);
    if(n >= (MAXLEN -1))
    {
        printf("输入数组越界 n:%d max len:%d\n", n,MAXLEN);
        return 0 ;
    }
   // int n = 0
    for(i=0;i<= n;i++)
    {
        scanf("%d",&tmp);
        arr[i] =  tmp;
    }
    
    max_sum = maxSum(arr, n);
    printf("%d",max_sum);
    return 0 ;
    
}

上一题