返回一个整数组中的最大子数组的和

题目:返回一个整数数组中最大子数组的和

要求: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);

    }

}

 

posted on 2019-03-08 22:59  哈弗h6  阅读(136)  评论(0编辑  收藏  举报

导航