题目描述
输入一个整形数组(可能有正数和负数),求数组中连续子数组(最少有一个元素)的最大和。要求时间复杂度为O(n)。
输入描述:
【重要】第一行为数组的长度N(N>=1)
接下来N行,每行一个数,代表数组的N个元素
输出描述:
最大和的结果
示例1
输入
复制
8
1
-2
3
10
-4
7
2
-5
输出
复制
18
说明
最大子数组为 3, 10, -4, 7, 2
思路:
1.创建输入对象,用buffer,读取第一行,创建数组存数据。
2.循环数组并且记录当前值和记录最大值。当当前值小于0则赋予新值,否则累加。
3.比较当前值和最大值。最后返回最大值
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
//1.创建字符输入对象
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
//2.读取一行
int num = Integer.parseInt(bf.readLine());
//3.定义为8
int[] nums = new int[num];
//循环输入录入这些数据
for(int i =0;i<num;i++){
nums[i]=Integer.parseInt(bf.readLine());
}
if (nums==null || nums.length <=0){
return ;
}
int currentSum = 0;//记录当前值
int findMax = Integer.MIN_VALUE;//记录全场最佳值
for (int i = 0; i < nums.length ; i++) {
if (currentSum<=0){
currentSum = nums[i];
}else{
currentSum+=nums[i];
}
if (currentSum>findMax){
findMax = currentSum;
}
}
System.out.println(findMax);
}
}