求连续子数组的最大和
题目描述
一个非空整数数组,选择其中的两个位置,使得两个位置之间的数和最大。
如果最大的和为正数,则输出这个数;如果最大的和为负数或 0 ,则输出 0
数据范围: 1 ≤ n ≤ 10000 1≤n≤10000 1≤n≤10000 ,数组中的值满足 ∣ v a l ∣ ≤ 10000 ∣val∣≤10000 ∣val∣≤10000
输入描述
3,-5,7,-2,8
输出描述
13
示例一
输入
-6,-9,-10
输出
0
说明
参考解题 C
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
int main()
{
int sum=0,max=-2147483648,i,n;
char num[10000];
bool flag=true;
while(scanf("%s",num)!=EOF)
{
for(i=0;i<strlen(num);i++)
{
if(num[i]==',')
flag=true;
if((('0'<num[i] && num[i]<'9')|| num[i]=='-')&&flag)
{
n=atoi(num+i);
sum+=n;
if(sum>max)
max=sum;
if(sum<0)
sum=0;
flag=false;
}
}
}
if(max<0)
printf("%d",0);
else
printf("%d",max);
return 0;
}
参考解题 C++
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>
using namespace std;
int maxSum(vector<int>& nums) {
if(nums.size() == 0) return 0;
int res = 0, cur = 0;
for(int n: nums)
{
cur = cur > 0? cur + n: n;
if(cur > res) res = cur;
}
return res;
}
int main() {
string s;
while(cin >> s)
{
stringstream ss(s);
vector<int>nums;
int n;
char c;
ss >> n;
nums.push_back(n);
while(ss >> c >> n)
{
nums.push_back(n);
}
cout << maxSum(nums);
}
return 0;
}
参考解题 Java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.lang.String;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str;
while((str = br.readLine()) != null){
String[] strArr = str.split(",");
int[] arr = new int[strArr.length];
for(int i = 0; i < arr.length; i++)
arr[i] = Integer.parseInt(strArr[i]);
System.out.println(maxSum(arr));
}
}
private static int maxSum(int[] array) {
if(array == null || array.length == 0) return 0;
// 记录当前和
int currentSum = 0;
// 记录最后的和
int finalSum = Integer.MIN_VALUE;
for(int i = 0; i < array.length; i++){
if(currentSum < 0) // 当前和为负数时,重新计算当前和
currentSum = array[i];
else
currentSum += array[i];
if(finalSum < currentSum)
finalSum = currentSum;
}
return finalSum >= 0 ? finalSum: 0;
}
}
参考解题 Python
x = input()
arr = [int(val) for val in x.split(',')]
n = len(arr)
pre = arr[0]
ans = pre
for i in range(1, n):
pre = max(pre + arr[i], arr[i])
ans = max(ans, pre)
if ans < 0:
ans = 0
print(ans)