题目:返回一个整数数组中最大子数组的和
要求: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); } }
第二种就是首先将数组中的值给最大值,并当累加值小于0时就不在累加,而是将数组的值赋值给累加值,并将累加值与最大值进行比较。这样当数组为纯负数的时候就相当于对数组中的值进行比较。
package test; import java.util.Scanner; /* * 求子数组的最大值 */ public class shuzu { static Scanner in = new Scanner(System.in); public static void main(String[] args) { // TODO 自动生成的方法存根 int num[] = new int[100]; int n; int sum = 0; int value = 0; System.out.println("输入数组的个数"); n = in.nextInt(); System.out.println("输入数组中的值"); for(int i = 0;i < n;i++) { num[i] = in.nextInt(); } sum = num[0]; for(int i = 0;i < n;i++) { if (value <= 0) { value = num[i]; //当用于记录的值小于等于0时就无需对其进行相加了,此时就等于下一个值 }else { value += num[i]; //当value的值仍大于0时就继续相加 } if (sum < value) { //用sum等于子数组的最大值,若value的值大于sum的值,则将value赋值给sum sum = value; } } System.out.println("最大值为:" + sum); } }