先声明一下,结对开发人员是张永&吴盈盈。

  又是一次战斗的课堂,先前的自己没有经过这么限时的训练,以至于我这只小菜鸟受到了致命的摧残,写个程序一头汗都出来了,悲催的,建民老师,开恩啊。不过这样的课堂多多益善吧。

方案一:

  这个题目对所有的人来说都很简单了,看到这个题目很快就能够想到一种解决方案,把所有子数组的和都求出来,然后再求出和最大的那个值输出来,我和盈姐讨论的还是很激烈的,赶时间,把思想转换成代码,选择了java(我这搭档好像把java的语法忘得差不多了。。。),紧张的写了20多分钟,这种场合简直限制我的思维啊,幼小的心灵受到了暴风雨似的摧残。在建民老师一声口令下,交给了盈姐(建民老师搞的一套)。紧张的盈姐敲键盘都有点哆嗦了哈。没事,反正大家都是鸟,我们还是好鸟呢。过了一会,哎,实现了。想让老师看一下我们的结果。这个建民老师啊,竟然让我们给他看讨论的稿子,我去,想法都在脑子里呢。结果看都不看了。拉倒,先把代码贴在这:

/**  
    * @Name: sum
    * @Description: 将一个整数数组的所有子数组的和存放到sumList集合中
    * @Author: 张永&吴盈盈(作者)
    * @Version: V1.00 (版本号)
    * @Create Date: 2014-3-10 (创建日期)
    * @Parameters:int number[]
    * @Return: 无
    */
    public void sum(int number[])
    {    
        int sum=0;
        String indexs="";
        for(int i=0;i<number.length;i++)
        {
            for(int j=0;j<number.length;j++)
            {
                for(int n=i;n<=j;n++)
                {
                    sum=sum+number[n];
                    indexs=indexs+n;//记录子数组的索引
                }
                SumObject sumObject=new SumObject(sum,indexs);
                sum=0;
                indexs="";
                sumList.add(sumObject);
            }
        }
    }
    
    
    /**  
    * @Name: MaxOfSum
    * @Description: 在集合类sumList中选出最大的那个对象
    * @Author: 吴盈盈(作者)
    * @Version: V1.00 (版本号)
    * @Create Date: 2014-3-10 (创建日期)
    * @Parameters:无
    * @Return: MaxOfSum对象
    */
    public SumObject MaxOfSum()
    {
        int max=0;
        String indexs="";
        for(int i=0;i<sumList.size();i++)
        {
            if(max<sumList.get(i).getSum())
            {
                max=sumList.get(i).getSum();
                indexs=sumList.get(i).getIndexs();
            }
        }
        SumObject sumObject=new SumObject(max,indexs);
        return sumObject;
    }

测试数据:1.num[]={-1,-2,3};   结果:3      2.num[]={1,2,3};  结果:6

方案二:

  虽然第一种方法实现了,但是这道出自《编程珠玑》的题目,在这本书上给出了四个算法,老师让我们找出一个线性算法。好家伙,这可是真真的用到了数学功底啊,我都想找数学老师来探讨一下了。。。还是和队友想想吧,在网上参考了一下别人的思想,这个算法果然很好,用一个变量max记录子数组和的最大值,然后遍历数组(索引从0开始变化),再用一个可能的最大值变量max1,数组的下标每增加1: 当前的和max1和0比较,如果小于零,证明当前索引的数组是个负数而且很大,下次子数组直接从当前元素的下一项开始;如果max1的值大于max,则让max=max1;直到遍历结束,则max中存放的就是最大值。写了这么多文字,不知道有没有描述清楚,给出代码实现吧:

/**  
    * @Name: bestSearchMaxSum
    * @Description: 在求子数组的最大和
    * @Author: 张永&吴盈盈(作者)
    * @Version: V1.00 (版本号)
    * @Create Date: 2014-3-10 (创建日期)
    * @Parameters:整型数组number[],SumObject对象maxSumObject
    * @Return: SumObject对象
    */
    
    public SumObject bestSearchMaxSum(int number[], SumObject maxSumObject)   
    {  
        int i;  
        int max=0; 
        String indexStart=""; 
        String indexEnd="";
        for ( i = 0; i < number.length; i++ )  
        {  
            if ( (max= number[i] + max) > 0 )  
            {  
                indexEnd = i+"";  
            }  
            else  
            {  
                indexStart = ""+(i + 1);   
                max = 0;  
            }  
            if ( max > maxSumObject.getSum() )   
            {  
                maxSumObject.setSum(max);  
            }  
        }  
        maxSumObject.setIndexs(indexStart+indexEnd);
        return maxSumObject;
    }
还是方案一的测试数据,结果完全正确,这次的算法,就符合老师所谓的线性算法了吧,建民老师,这次看看吧!

 

Copyright © 2024 我编程我快乐
Powered by .NET 8.0 on Kubernetes