
package com.yimu.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class D {
// 给定一个长度为 n 的数组,数组中的数为整数。
// 请你选择一个非空连续子数组,使该子数组所有数之和尽可能大。求这个最大值。
public static void main(String[] args) throws IOException {
//从控制台取出数据
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(bufferedReader.readLine());
String[] sp = bufferedReader.readLine().split(" ");
long[] nums = new long[n];
for (int i = 0; i < n; i++) {
nums[i] = Integer.parseInt(sp[i]);
}
//首先分为两种情况: 1.数组中数字全为负数,即子数组之和最大值为数组最大值
// 2.数组中数字不全为负数,即可以判断从数组中第一个正数开始,与其之后数字相加,
// 如果相加和大于0,则将其值存储在另一个数组中对应位置,小于0,则从下一个正数
// 重新开始。即子数组之和最大值即为“另一个数组”中最大值
long[] maxs = new long[n+1];
long max ;
max = Arrays.stream(nums).max().getAsLong();
if (max <= 0) {
System.out.println(max);
return;
}
int j = 0;
maxs[j] = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] > 0) {
maxs[j] += nums[i];
}else{
if (maxs[j] > (-nums[i])) {
maxs[j] += nums[i];
}else{
j++;
maxs[j] = 0;
}
}
maxs[i] = maxs[j];
}
max = Arrays.stream(maxs).max().getAsLong();
System.out.println(max);
}
}
package com.yimu.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class D {
// 给定一个长度为 n 的数组,数组中的数为整数。
// 请你选择一个非空连续子数组,使该子数组所有数之和尽可能大。求这个最大值。
public static void main(String[] args) throws IOException {
//从控制台取出数据
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(bufferedReader.readLine());
String[] sp = bufferedReader.readLine().split(" ");
long[] nums = new long[n];
for (int i = 0; i < n; i++) {
nums[i] = Integer.parseInt(sp[i]);
}
//首先分为两种情况: 1.数组中数字全为负数,即子数组之和最大值为数组最大值
// 2.数组中数字不全为负数,即可以判断从数组中第一个正数开始,与其之后数字相加,
// 如果相加和大于0,则将其值存储在另一个数组中对应位置,小于0,则从下一个正数
// 重新开始。即子数组之和最大值即为“另一个数组”中最大值
//不新建数组也可以
long max ;
max = Arrays.stream(nums).max().getAsLong();
if (max <= 0) {
System.out.println(max);
return;
}
if (nums[0] < 0) nums[0] = 0;
for (int i = 1; i < nums.length; i++) {
long l = nums[i - 1] + nums[i];
if (nums[i] > 0) nums[i] = l;
else{
if (nums[i-1] > (-nums[i])) nums[i] = l;
else{
nums[i] = 0;
}
}
}
max = Arrays.stream(nums).max().getAsLong();
System.out.println(max);
}
}
版权声明:本文为Xiaojia_guniang原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。