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

一、实验要求:

输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大。
同时返回最大子数组的位置。
求所有子数组的和的最大值。
结对编程要求:
两人结对完成编程任务。
一人主要负责程序分析,代码编程。
一人负责代码复审和代码测试计划。
发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)

二、实验思路:

  1. 联系思考如果不是循环数组的话,一个普通的数组,求他们的连续的最大子数组的和的最大值,应该怎么实现,例如:1,2,3,4,5 如果是一个循环数组,那么其中的3,可以组成的数组最大就不是3,4,5,而是3,4,5,1,2
  2. 循环数组从那个数开始,那么相当于在那个数的位置切开,他的最大子数组,就是和他相邻的但是断开后不相邻的那个位置,例如从4开始,和4相邻的是3和5,当截断后可以看成是一个普通数组4,5,1,2,3,其中的3就是和他相邻但是截断后不相邻的数
  3. 如果想求这个数组,我们可以把这个数组扩展一下,如1,2,3,4,5我们可以扩展成1,2,3,4,5,1,2,3,4 ,也就是在最后一个数的后面再加上他前面的数,然后我们在取最长的子数组的时候,可以按照第二个新构建的数组,从其中取连续的五个,这个是满足要求的数组

三、团队成员:曾凯   王志伟

四、开发照片:

 

  

五、实验代码:

package demo3;
public class Route {
    public static void main(String[]args)
    {
        int a[]={1,2,3,4,5,6};
        int b1[] = new int[2*a.length-1];
        for(int i=0;i<a.length;i++)
        {
            b1[i]=a[i];
        }
        for(int i=a.length;i<2*a.length-1;i++)
        {
            b1[i] = a[i-a.length];
        }
        int b[]=panduan(a);
        System.out.print("最大子数组是:");
        for(int i=b[1];i<=b[2];i++)
        {
            System.out.print(b1[i]+"  ");
        }
        System.out.println("\n最大值是:"+b[0]);
    } 
    static int[] panduan(int[] a)
    {
        int b[] = new int[2*a.length-1];
        for(int i=0;i<a.length;i++)
        {
            b[i]=a[i];
        }
        for(int i=a.length;i<2*a.length-1;i++)
        {
            b[i] = a[i-a.length];
        }
        int [][]a1= new int[b.length][b.length];
        for(int i=0;i<a.length;i++)
        {
            for(int j=i;j<b.length&j-i<a.length;j++)
            {
                a1[i][j]=0;
            }
        }
        for(int i=0;i<a.length;i++)
        {
            for(int j=i;j<b.length&j-i<a.length;j++)
            {
                if(j==i)
                {
                    a1[i][j]=b[j];
                }
                else
                {
                    
                    a1[i][j]+=b[j]+a1[i][j-1];
                }
            }
        }
        int max=a1[0][0];
        int i1=0;
        int j1=0;
        for(int i=0;i<a.length;i++)
        {
            for(int j=i;j<b.length&j-i<a.length;j++)
            {
                if(max<a1[i][j])
                {
                    max=a1[i][j];
                    i1=i;
                    j1=j;
                }
            }
        }
        int a2[]=new int[3];
        a2[0]=max;
        a2[1]=i1;
        a2[2]=j1;
        return a2;
    }
}

六、结果截图:

 

七、实验总结:

  通过这次两人团队的协助编程,其中我主要负责代码测试部分,代码编程部分由另一名组员完成,经过大概一个多小时的讨论和编码,最终完成。开始的时候,主要是讨论两个人对本题的思路,然后动笔在纸上写了一个数组,然后按照普通的数组,先想普通数组求这个最大子数组的和,应该如何实现,接着通过交流两个人的对算法的理解,最后实现了这个功能。

  通过这次实验,我也增加了团队沟通和协助能力。

 

posted @ 2017-03-31 16:23  Dmego  阅读(257)  评论(0编辑  收藏  举报