题目要求:

1、输入一个整形数组,数组里有正数也有负数。
2、数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
3、求所有子数组的和的最大值。要求时间复杂度为O(n)
     发表一篇博客文章讲述设计思想,出现的问题,可能的解决方案(多选)、源代码、结果截图、总结。

设计思路:

1、建立一个2维数组a(初定为100行2列),第一列用于存放输入数字,第二列用于表示本字符以前的最大子数组和的值。

2、输入任意多个数,每输入一个数number++(number为int型用于表示数组长度),当输入1024时停止输入,把输入的数存放在数组的第一列中。

3、把数组a[0][1]=a[0][0];

4、从第二个数开始进入循环,如果a[i-1][1]小于0时a[i][1]=a[i][0];如果a[i-1][1]大于0时a[i][1]=a[i][0]+a[i-1][1]

5、在比较第二列中的数,选出最大数即是子数组中和最大的

程序源码:

package 数组问题;

import java.util.Scanner;

public class Shuzu {
    public static void main(String args[])
    {
        int[][] array=new int[100][2];
        int number = 0;//记录有几个数字
        Scanner sca=new Scanner(System.in);
        System.out.println("请输入100以内个整数");
        for(int i=0;i<100;i++)
        {
            array[i][0]=sca.nextInt();
            if(array[i][0]==1024) //以1024结束
            {
                number=i;
                break;
            }
        }
        array[0][1]=array[0][0];
        for(int i=1;i<number;i++)
        {
            if(array[i-1][1]<0)
            {
                array[i][1]=array[i][0];
            }
            if(array[i-1][1]>=0)
            {
                array[i][1]=array[i-1][1]+array[i][0];
            }
        }
        int max=array[0][1];
        for(int i=1;i<number;i++)
        {
            if(array[i][1]>=max) 
            {
                max=array[i][1];
            }
        }
        
        System.out.println("最大和为"+max);
        
    }

}


程序截图:

总结:相对功能还不完善,应该再找出最大子数组和的同时,也输出最大子数组。而且以1024为输入结束的标志也不是很好。