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); } }