求一个整数数组中最大子数组的和
Posted noor9
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求一个整数数组中最大子数组的和相关的知识,希望对你有一定的参考价值。
要求: 输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)
思路比较简单,主要就是怎么去找这个最大
设置两个常量:最大值max和累加值tmp都初始化为数组第一个元素的值
判断tmp,如果tmp<0,tmp赋值为0,tmp+=a[i], 直至循环结束
其实就是通过首元素值(tmp)是否小于0,小于的话赋值0累加上其后继元素,判断max与tmp大小,并将大的值重新赋值给max。
循环上一步骤
例子:-1 2 -3 4 5 很容易得到这个数组的最大子数组和为9,通过我的思路,初始化tmp=a[0]=-1;
tmp<0,tmp=0,加上其后继元素tmp+2=2,tmp>0,加上其后继元素tmp+(-3)=-1<0,赋值为0,循环这个过程,不难得到结果9...
1 package test1; 2 3 import java.util.Scanner; 4 5 public class test1 { 6 public static int maxSum(int[] array){//得到最大子数组和 7 if(null == array || array.length == 0){ 8 return 0; 9 } 10 int tmp = array[0]; 11 int max = array[0]; 12 for(int i = 1; i < array.length; i++){ 13 if(tmp < 0){ 14 tmp = 0; 15 } 16 tmp += array[i]; 17 max = Math.max(max, tmp); 18 } 19 return max; 20 } 21 static int[] generateRandomArr(int n,int min, int max) {//产生随机数组,参数n是大小,后面的是范围min-max 22 int [] a = new int [n]; 23 for (int i = 0; i < n; i++) { 24 int random = (int) Math.floor(Math.random() * (max - min + 1) + min); 25 a[i]=random; 26 } 27 return a; 28 } 29 public static void main(String[] args) { 30 31 int [] a = generateRandomArr(5,-5,5); 32 System.out.println("数组的大小:"+a.length+" "); 33 Scanner in=new Scanner(System.in); 34 /*int []a = new int[4]; 35 for(int i=0;i<4;i++) 36 { 37 a[i]=in.nextInt(); 38 }*///测试所用 39 System.out.print("数组元素:"); 40 for(int i = 0;i < a.length; i++) 41 { 42 System.out.print(a[i]+" "); 43 if(i==a.length-1) 44 { 45 System.out.println(); 46 } 47 } 48 System.out.println("数组子数组的最大和:"+maxSum(a)); 49 50 } 51 }
第二种类型:数组不是平时的一维数组,而是环形数组
以上是关于求一个整数数组中最大子数组的和的主要内容,如果未能解决你的问题,请参考以下文章