个人作业一

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

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

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

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

  设计思想:手动输入若干个整数(n个),然后从第一个数开始,用第一个数每次多加后面的一个数得到和sum,将sum与之前的sum比较,若后得到的大,则sum的值为后得到的sum。当sum为第一个数至最后一个数之和时,将得到的数赋予数组max【0】用来存放以第一个数开头的最大值。之后再从第二个数开始,执行上述步骤。直到进行到第n-1个数进行完毕,我们也就得到了数组max【】;而所有的子数组的和的最大值必然存在于数组max中。所以再对max数组的每个元素进行比较,选出最大值就OK了。

  在这期间出现了数组没有初始化的问题,之后对其进行了循环赋值为0;还有各个数组之间赋值出错的问题,理清思路后得以解决。  

  代码如下:

package com.two;
import java.util.*;
/*
 * 寻找各个数开头的最大值,进行比较
 * 
 * */
public class two {
    /*public static int sum() {
        
        return max1;
    }*/
    
    public static void main(String[] args)
    {
        Scanner input=new Scanner(System.in);
        int n=0;
        System.out.print("请输入数的个数:");
        n=input.nextInt();
        System.out.print("请输入"+n+"个数:");
        int a[]=new int[5];
        for(int i=0;i<5;i++) {               //输入
            a[i]=input.nextInt();
        }                     
        int max[]=new int[a.length];
        for(int i=0;i<max.length;i++) {
            max[i]=0;
        }
        int sum=0;
        for(int i=0;i<a.length;i++) {           //以各个数开头的最大值
            max[i]=a[i];
            sum=max[i];
            if(i<a.length) {
                for(int j=i+1;j<a.length;j++) {
                    sum=sum+a[j];
                    if(max[i]<sum)max[i]=sum;
                }
            }
        }
        int max1=max[0];
        for(int i=1;i<max.length;i++) {
            if(max1<=max[i]) {
                max1=max[i];
            }
        }
        System.out.println(max1);
    }
}

  截图: 

  

  

  总结:一定要理清思路,之后就很容易了。

原文地址:https://www.cnblogs.com/liyuchao/p/10505904.html