求数组的子数组之和的最大值

题目:

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

思路:

  首先肯定是建立数组,考虑数组元素来源,可随机生成,亦可自己输入。

  对于算法,在课上的时候没有想出O(n)的,只想到了O(n^2)的,就是先两次循环求出各个子数组的和,将求解存到新的数组中,最后对储存各个子数组的和的数组进行比较求取最大值。

源代码:

package demo;

import java.util.Scanner;

public class shuzu {
    
    public static void main(String[] args) {
        @SuppressWarnings("resource")
        Scanner cin = new Scanner(System.in);
        int [] mylist = new int[1000];                 //建立一个长度为1000的整型数组,用来储存输入的数组
        int [] jieguo = new int[1000];
        int n ;
        int max = 0;
        int mlist,slist=0;                            //slist为子数组和
        System.out.println("输入整数数组的长度:");
        n = cin.nextInt();
        for(int i = 0;i < n ;i++)                    //进行数组输入
            mylist[i]=cin.nextInt();
        for(int i=0;i<n;i++)                        //O(n^2)求子数组之和
        {
            mlist = 0;
            for(int j=i;j<n;j++)
            {
                mlist +=mylist[j];
                jieguo[slist++] = mlist;            //将子数组之和存在数组jieguo[]内
                System.out.println("第"+ slist +"个子数组的和为:" + mlist);
            }
        }
        max = jieguo[0];                            //将子数组和数组第一个值给max,然后循环进行比较,求出最大值
        for(int i = 0;i<slist;i++)
        {
            if(max < jieguo[i])
                max = jieguo[i];
        }
        System.out.println("最大子数组和为:" + max);
    }

}

 

posted @ 2019-03-10 20:31  枫黎  阅读(643)  评论(0编辑  收藏  举报