题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。
// 定义数组 int[] arr = {1, -2, 3, 10, -4, 7, 2, -5}; // 用来存储临时的数组的变量 int start = 0, end = 0, sum = 0; // 存放最大数组的索引 int maxStart = 0, maxEnd = 0, maxSum = 0; // 标识符 boolean flag = true; // 便利数组中的书 for (int i = 0; i < arr.length; i++) { if (flag) { start = i; end = i; sum = arr[i]; flag = false; } else { end = i; sum += arr[i]; } // 如果maxSum数组中的值小于临时数组的和值 if (maxSum < sum) { maxStart = start; maxEnd = end; maxSum = sum; } // 计算的和小于0 if (sum < 0) flag = true; } // 便利出和最大的数组元素 for (int i = maxStart; i < maxEnd; i++) { System.out.println(arr[i]); } System.out.println(maxSum);