返回一个整型数组中最大子数组的和(1)

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

要求:

输入一个整形数组,数组里有正数也有负数。

数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

求所有子数组的和的最大值。要求时间复杂度为O(n)。

2.设计思想:

1.首先从数组array[num]下标 i=0 开始,进行元素循环相加,与此同时,每一次相加之后与最大值max进行比较,最大值起初赋值为array[i]。

2.把每一轮的最大值用数组m[num]存放起来。

3.最后循环遍历输出m[num]数组的最大值。

3.程序源代码:

import java.util.*;
public class sonarr {
public static void main(String[] args) {
    Scanner input=new Scanner(System.in);
    System.out.print("数组中数的个数:");
    int num=input.nextInt();
    int array[]=new int[num];
    for(int i=0;i<num;i++)
    {
            array[i]=input.nextInt();
    }
    int max=0;
//    m数组是存放每一轮子数组最大值
    int m[]=new int[num];
    for(int j=0;j<num;j++)
    {
        max=array[j];
        int sum=0;
        for(int t=j;t<num;t++)
        {
            sum=sum+array[t];
            if(sum>max)
            {
                max=sum;
            }
        }
        m[j]=max;
    }
    for(int i=0;i<num;i++)
    {
        System.out.print("第"+(i+1)+"次比较的子数组的和的最大值为:");
        System.out.println(m[i]);
    }
    for(int i=1;i<num;i++)
    {
        max=m[0];
        if(m[i]>max)
        {
            max=m[i];
        }
    }
    System.out.print("子数组和的最大值为:"+max);
}
}

4.运行结果截图:

 

 

5.题目升级:如果在原来基础上把整型一维数组变成循环数组,那么结果又是怎样的呢?

要求:数组中的数只用一次!!

6.设计思想:

1.既然是循环数组,那么就必须控制数组下标可以回到起始值且小于起始值。

2.所以加一个if语句就可以了。

7.程序源代码:

import java.util.Scanner;
public class sonarr1 {
public static void main(String[] args) {
    Scanner input=new Scanner(System.in);
    System.out.print("数组中数的个数:");
    int num=input.nextInt();
    int array[]=new int[num];
    for(int i=0;i<num;i++)
    {
            array[i]=input.nextInt();
    }
    int max=0;
    int m[]=new int[num];
    for(int j=0;j<num;j++)
    {
        max=array[j];
        int t=0;
        int sum=0;
        for(t=j;t<num;t++)
        {
            sum=sum+array[t];
            if(sum>max)
            {
                max=sum;
            }
            if(t==num-1) {
                for(int y=0;y<j;y++)
                {
                    sum=sum+array[y];
                    if(sum>max)
                    {
                        max=sum;
                    }
                }}
            
        }
        m[j]=max;
    }
    for(int i=0;i<num;i++)
    {
        System.out.print("第"+(i+1)+"次比较的子数组的和的最大值为:");
        System.out.println(m[i]);
    }
    for(int i=1;i<num;i++)
    {
        max=m[0];
        if(m[i]>max)
        {
            max=m[i];
        }
    }
    System.out.print("子数组和的最大值为:"+max);
}
}

8.运行结果截图:

 

posted @ 2020-02-25 17:58  ziyuliu  阅读(218)  评论(0编辑  收藏  举报