OR176. 连续子数组最大和
描述
输入一个整形数组(可能有正数和负数),求数组中连续子数组(最少有一个元素)的最大和。要求时间复杂度为O(n)。
输入描述
【重要】第一行为数组的长度N(N>=1)输出描述
最大和的结果示例1
输入:
8 1 -2 3 10 -4 7 2 -5
输出:
18
说明:
最大子数组为 3, 10, -4, 7, 2C 解法, 执行用时: 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 ; }