欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

《剑指offer》练习-面试题42-连续子数组的最大和

程序员文章站 2022-07-10 17:36:10
...

题目:输入一个整型数组,数组里有整数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。

思路:对于一个数A,若是A的左边累计数非负,那么加上A能使得值不小于A,认为累计值对于整体和是有贡献的。如果前几项累计值为负数,则认为有害于总和。用total来记录当前累计值,maxSum记录最大和。

package offer;

import java.util.Scanner;

public class Solution41 {

	/*
	 * 算法时间复杂度O(n) 用total记录累计值,maxSum记录和最大
	 * 基于思想:对于一个数A,若是A的左边累计数非负,那么加上A能使得值不小于A,认为累计值对
	 *           整体和是有贡献的。如果前几项累计值负数,则认为有害于总和,total记录当前值。 此时 若和大于maxSum 则用maxSum记录下来
	 */
	public int FindeGreatestSumOfSubArray(int[] array) {
		if (array.length == 0)
			return 0;
		else {
			int total = array[0], maxSum = array[0];
			for (int i = 1; i < array.length; i++) {
				if (total >= 0)
					total += array[i];
				else
					total = array[i];
				if (total > maxSum)
					maxSum = total;
			}
			return maxSum;
		}
	}

	public static void main(String[] args) {
		Solution41 sl = new Solution41();
		Scanner scanner = new Scanner(System.in);
		System.out.print("请输入数组长度length=");
		int length = scanner.nextInt();
		int[] array = new int[length];
		System.out.print("请输入一个数组:");
		for (int i = 0; i < length; i++) {
			array[i] = scanner.nextInt();
		}
		scanner.close();
		System.out.println("最大和为:" + sl.FindeGreatestSumOfSubArray(array));

	}
}



链接:https://www.nowcoder.com/questionTerminal/459bd355da1549fa8a49e350bf3df484
来源:牛客网