求最大子数组值(有环版)

合作过程:

    由于上次作业设计思想不同,经过讨论采用了统一的设计思想。对于这次的作业我们一起进行讨论,我们统一利用二维数组完成一维数组的循环求子数组。我负责进行编码,丽萍负责进行代码的审查和代码的测试。

设计思想:

基于上次不循环一维数组求子数组的最大值。

1.将一维数组转化为二维数组,变相将其转化为循环。即二维数组每一行使一维数组依次向前移动一个数。

2.利用上次思想一次求出每行子数组的最大值。

2.1.定义两个数s,max用来更新子数组的最大值,从数组data[]的data[n-1]开始进行求和比较。

2.2利用for循环,依次判断前几项之和是否小于0,若小于0则从该项继续寻找最大值,并与前几项的最大值进行比较。选出最大值。

 

3.比较二维数组每行子数组的最大值的大小,并作比较,将最大值输出。

遇到的问题:

  一维数组转化为二维数组出现数组越界。

源代码:

复制代码
import java.util.Scanner;
public class Test{
      static int[][] transform(int data[],int n)
      {//将以为数组转化为二维数组,用来将一维数组变为循环数组
          int d[][]=new int[n][n];
          int j;
          for(j=0;j<n;j++)//第一行保存一维数组
          {
              d[0][j]=data[j];
          }
          for(int i=1;i<n;i++)//一次前进一个数储存在二维数组下一行
          { 
              for(j=0;j<n-1;j++)
              {
                  int t=d[i-1][0];
                  d[i][j]=d[i-1][j+1];
                  d[i][n-1]=t;
              }    
          }
          return d;
      }
      static int sum(int data[], int n)//定义数组和数组长度
      {
          int s = data[n-1];//s用来更新子数组最大值
          int max = data[n-1];//a表示最大值
          for(int i=n-2;i>=0;i--)//逆序进行
          {
              if(s<0)//前几项的和为负数,重新计算
              {
                  s=0;
              }
              s=s+data[i];
              if(s>max)
              {
                  max=s;//将最大值赋值给a
              }
          } 
          return max;
      } 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in=new Scanner(System.in);
        System.out.println("请输入数组长度:");
        int n=in.nextInt();
        int array[]=new int[n];
        int twoArray[][]=new int[n][n];
        System.out.println("请输入"+n+"个整数:");
        for(int i=0;i<n;i++)
        {
            array[i]=in.nextInt();
        }
        //转化为二位数组
        twoArray=transform(array,n);
    
        int result[]=new int[n];
        int chucun[]=new int[n];
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                //将二维数组每一行储存在一维数组中
                chucun[j]=twoArray[i][j];                
            }
            //计算每行的子数组最大值
            result[i]=sum(chucun,n);
        }
        //找到result中的最大值
        int max=result[0];
        for(int i=0;i<n-1;i++)
        {
            if(result[i+1]>result[i])
            {
                max=result[i+1];
            }    
        }
        System.out.print("子数组的最大值为:"+max);
    }

    

}
复制代码

实验结果截图:

 

总结:

在第一次程序的基础上,只要实现一位数组循环即可。可用二维数组实现一维数组循环。

posted @ 2016-04-11 19:51  Huangliping  阅读(200)  评论(0编辑  收藏  举报