JAVA笔试题:算出一个数组中"和"最大的子数组,不可调用Jav
2020-06-01 本文已影响0人
牙齿不帅
package com;
public class Test {
/**
* 获取数组中【和】最大的子数组
* 思路:
* 从左往右开始,不断的累加数据,一旦累加的【和】达到一个新的【最大峰值】的时候记录一下此时的【结束位置】。
* 如果累加的和小于【1】,那么就寻找【下一个】最大的子数组,所以开始的时候负数直接【跳过】。
* 可能有【多个】子数组,每完成一个子数组都要与之前的比较,得出和【最大】的那一个。
* @param args
*/
public static void main(String[] args) {
int arr[] = { 1, 2, 3, -1, -2, -6, -7, 8, -1, -2, -3, 10, 12, 1, -1, -2, -3, 4, 5, 6, 23, 234 };
int max = 0;
int total = 0;
int lastMax = 0;
int lastStart = -1;
int start = -1;
int end = -1;
for (int i = 0; i < arr.length; i++) {
int a = arr[i];
// 如果从左面开始都是负数,那么就都跳过
if (total == 0) {
if (a < 0) {
continue;
}
}
// 如果没有开始位置,那就从不是负数的开始吧
if (start < 0) {
start = i + 1;
}
// 累加
total += a;
// 如果累加大于累加的最大值,那么就有了新的最大值
if (total > max) {
max = total;
// 如果最大值大于上一次记录的最大值,说明又有新的峰值了
if (max > lastMax) {
end = i + 1;
// 更新最大值
lastMax = max;
lastStart = start;
}
}
// 如果由于负数的累加,导致回到了小于1的状态,那么就要寻找下一个峰值了
if (total < 1) {
total = 0;
max = 0;
lastStart = start;
// 开始新的
start = -1;
}
}
/**
* 打印最大子数组的和,子数组【开始】和【结束】的位置和数值,
*/
System.out.println(lastMax);
System.out.println(lastStart + ":" + arr[lastStart - 1]);
System.out.println(end + ":" + arr[end - 1]);
}
}