个人作业1-数组

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

要求:

1.输入一个整型数组,数组里有正数也有负数

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

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

 设计思想:

      因为是连续的一个或多个整数组成的子数组,因此如果数组的前端为负数的话可以忽略掉,从正数部分开始累加,如果当累加结果小于等于0时,可以从新进行累加,将新的累加部分和旧的累加部分进行对比,保留值大的。
       代码设计:创建一个数组num[n],设置一个int型变量maxstart并赋值为0,设置一个int型变量maxsum用来储存最大值,在for循环中首先判断maxstart的值是否小于等于0,如果小于等于0,则将num[i]的值赋给maxstart,反之在maxstart的基础上加上num[i]的值,

之后对maxstart和maxsum进行比较,判断大小。

出现的问题:

      当数组全为负数时,最大值会显示为0,发现最定义maxsum时将其值赋值为0,因此当数组全为负数时,最后结果为0。

解决方案:

    在进行for循环之前,将数组的第一个值赋给maxsum。

源代码:

package shuzhi;

import java.util.Scanner;

public class main {
    public static void main(String[] args) {
        int n;
        int maxsum = 0;
        int maxstart = 0;//用于判断子数组是否小于0
        Scanner in = new Scanner(System.in);
        System.out.println("输入数组的长度");
        n = in.nextInt();
        int num[]=new int[n];
        System.out.println("输入数组中的值");
        for(int i = 0;i < n;i++)
        {
            num[i] = in.nextInt();
        }
        maxsum = num[0];
        for(int i = 0;i < n;i++)
        {
            if (maxstart <= 0) {//忽略掉和为负数和0的子数组
                maxstart = num[i];
            }else {
                maxstart += num[i];
            }
            
            if (maxsum < maxstart) {
                maxsum = maxstart;
            }
        }
        System.out.println("最大值为:" + maxsum);
    }
}

结果截图:

       总结:
      这个问题的结果很好求出来,困难的是如何将算法简化到O(n),由于之前写代码只求实现功能,不关心时间复杂度问题,所以如何以简便的方法实现要求的功能让我废了很长时间,最初写出来的代码大部分是O(n*2)甚至是O(n*3),最后是上网查看前辈们的代码才完善了解题思路,通过这次个人作业,我知道在面对一个问题时,要先实现它的基本功能,在研究如何降低时间复杂度问题。

原文地址:https://www.cnblogs.com/liujinxin123/p/10496528.html