个人作业1-——数组

1.问题

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

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

2.问题分析和设计思想

      拿到这个问题首先是要有一个整形的数组,这个数组中有正数也有负数,并且概率完全相同。这就要用到生成随机数的Math.random()方法产生一个随机数,这个随机数有正有负,就用到一个if语句来决定这个随机数是正是负。最核心的是一个三层循环,最外层循环控制数组的头,中间层控制循环数组的尾,最内层控制数组从头加到尾。这样就实现了求全部子数组的和。然后通过不断比较就得到了最大子数组的和。

3.源代码

   

package shuzhu;

import java.util.*;

public class shuzhu {
     public static void main(String[] args)
     {
     Scanner input=new Scanner(System.in);
     System.out.print("请输入数组中数的个数:");
     int num=input.nextInt();
     int max=0;
     
     int a[]=new int[num]; 
     for(int i=0;i<num;i++)//循环生成num个随机数
     {   
         if((int)(Math.random()*2)==0)//先从0或1之间生成一个数,进而决定这个数的正负
        {
            a[i]=(int)(Math.random()*10);
        }
         else
         {
             a[i]=-(int)(Math.random()*10);
         }
     }
     for(int i=0;i<num;i++)//循环输出生成的num个随机数
     {
        System.out.println(a[i]);
    }
     for(int b=0;b<num;b++)//最外层循环控制这个子数组的头
     {
        for(int c=b;c<=num;c++)//中层循环控制这个子数组的尾
        {
            int sum=0;
            for(int d=b;d<c;d++) //内层循环从头加到尾
            {
                 
                 sum=sum+a[d];
                
                if(max<=sum)//通过比较把最大的子数组和赋给max
                {
                    max=sum;
                }
            }
        }
     }
    
    System.out.print("子数组和的最大值为:"+max);
     }
}

4测试截图

5总结

     我的这个是最笨的办法实现的这个程序,就是把全部可能的情况求出比较,要另外学习别人先进的思路方法。多多练习。

原文地址:https://www.cnblogs.com/xuange1/p/10505996.html