关于返回一个整数数组中最大子数组的和的问题
题目:返回一个整数数组中最大子数组的和
要求:1、输入一个整形数组,数组里有正数也有负数。
2、数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
3、求所有子数组的和的最大值。要求时间复杂度为O(n)
方法一:刚拿到这个题目时,先没有考虑时间复杂度的问题,就是想把所有的子数组的和算出来,然后在比较,思路简单,但循环次数多
package about_bank_account; import java.util.Scanner; public class Test { public static void main(String[] args) { Scanner in = new Scanner(System.in); int[] A = new int[5];//大数组 int[] B = new int[15]; int temp = 0; int i; int k;//k为行 int t1 = 0;//小数组内循环 int t2 = 0;//记录小数组内数字个数 int sum = 0;//和 int j = 0; int max = 0; System.out.println("输入5个数:"); for(i = 0;i < 5;i++) { temp = in.nextInt(); A[i] = temp; } for(k = 0;k < 15;k++) { for(t1 = j;t1 <= t2;t1++) { sum = sum + A[t1]; } t2++; B[k] = sum; sum = 0; if(t2 == 5) { j = j + 1; t2 = j; } } max = B[0]; for(k = 0;k < 15;k++) { if(max < B[k]) { max = B[k]; } } System.out.print("-------------"+max); } }
方法二:先将数组转化成一正一负(正负相间)的数组,
若原数组为:
5 | -1 | -2 | 1 | 2 |
转化后数组为:
5 | -3 | 3 |
然后在转化后的数组的基础上,从第一个数开始,依次加两个数然后比较,加到最后一位数后,再从第二个数开始加,这样循环,找出其中最大数
(本方法我没有具体实现,转化后数组第一个数字正负不同,加的方式不同)
方法三:把数组的第一个值付给rmax和max,随后进行循环比较,从正值开始计数,如果一个一个累加起来小于等于零,就将max重新赋值,每次把最大值付给rmax,最后得出子数组的和的最大值。
package about_bank_account; import java.util.Scanner; public class Test { public static void main (String[] args){ @SuppressWarnings("resource") Scanner in=new Scanner(System.in); int num[]=new int[5]; int max=0; int rmax=0; System.out.println("请输入五个数:"); for(int i=0;i<5;i++) { num[i]=in.nextInt(); } rmax=num[0]; for(int i=0;i<5;i++) { if(max<=0) { max=num[i]; }else { max+=num[i]; } if(rmax<max) { rmax=max; } } System.out.println(rmax); } }