求子数组的最大和

来源:互联网 发布:江苏昆山华道数据 编辑:程序博客网 时间:2024/05/29 13:01
题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。

Java代码  /****/package com.lhp;/**3.求子数组的最大和题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。*/class GIntArrDispose {/*** 获得数组最大子数组的和* @param 整形 数组* @return 最大子数组的和*/public static int getMaxChild(int[] intArr) {if (null == intArr || 0 == intArr.length) {throw new NullPointerException("GIntArrDispose.getMaxChild(int[]):传入没有内容的数组!");}int result = 0; // 最大和int tempSum = 0; // 累加和int maxNegative = intArr[0]; // 数组最大值for (int i = 0; i < intArr.length; i++) {if (tempSum <= 0) {tempSum = intArr[i]; // 始终保持为正,可以理解为排除最大子数组左边所有数的和} else {tempSum += intArr[i];}if (tempSum > result) {result = tempSum; // 始终保持最大,可以理解为排除最大子数组右边所有数的和}if (intArr[i] > maxNegative) {maxNegative = intArr[i];}}if (maxNegative < 0) {return maxNegative; // 所有数都为负数,只返回最大的一个数}return result;}public static synchronized void print(int[] intArr) {if (null == intArr || 0 == intArr.length) {throw new NullPointerException("GIntArrDispose.print(int[]):传入没有内容的数组!");}System.out.print("数组: ");for (int v : intArr) {System.out.print(v + " ");}System.out.println();}}public class Three {public static void main(String[] args) {int[] intArr = {1, -2, 3, 10, -4, 7, 2, -5, 4};try {GIntArrDispose.print(intArr);System.out.print("最大子数组和: " + GIntArrDispose.getMaxChild(intArr));} catch (Exception e) {e.printStackTrace();}}}