package test;
import java.util.Arrays;
/**
* 给定一个数组,当中有正负数,求当中的一段“子数组”(即任意长度,连续的数字),
* 使得这个“子数组”的和是所有“子数组”和中最大的;
* 如给定的数组为{12,-8, 5, 66, -21, 0 ,35, -44,7},
* 则最大的和的子数组为{12, -8, 5, 66, -21, 0,35};
*
*/
public class MaxTest {
public static void main(String[] args) {
int[] data = { 12, -8, 5, 66, -21, 0, 35, -44, 7 };
data = maxData(data);
System.out.println(Arrays.toString(data));
}
// 未考虑两种情况:1.全是负数; 2.数组如{8, -8, 5, 6}
public static int[] maxData(int[] data) {
// 记录 开始与结束 的下标值
int first = 0, end = 0;
int maxSum = 0, thisSum = 0;
for (int i = 0, j = 0; i < data.length; i++) {
thisSum += data[i];
if (thisSum > maxSum) {
maxSum = thisSum;
first = j; // first为上次和小于0的值
end = i;
}
if (thisSum < 0) {
thisSum = 0;
j = i + 1;
}
}
System.out.println("最大值:" + maxSum + " 下标值: " + first + " -- " + end);
// 可以使用Arrays的方法来获取数组
return Arrays.copyOfRange(data, first, end + 1);
}
}
转载于:https://www.cnblogs.com/xiaozhang2014/p/5297281.html