最大子数组并求和

·设计思想

  (1)首先做出来的是不首尾相接的数组,求其最大数组和它的和,其主要思路是:先找到其数组和的最大值,然后再记录其取最大值的数组元素的下标。求最大值,首先,初始化变量最大值,初值设为零遍历整个数组,数组元素每加一次记录其和的结果,将其和最大值比较,大于最大值,就将和的值赋给最大值,其中,如果和值为负数,在加下一个数组元素时,记录和值的变量先要重新赋值为零,这样最后遍历完之后。最大值就求出来了。其次,记录其下标,用字符串记录下标,读取时用charAt读取第一个下标,至于最后的一个下标,则是记录当最大值发生被替换时,此时的下标,就是最后一个!最后,结尾的完善工作就好做了,把读取的start下标转化成int型,for循环将其对应下标的数组元素输出,将最大值输出

  (2)首尾相接的数组,基本思路是用两个for循环,把首尾相接的数组拆分成一个个数组,每次拆分都是一个长度为原先数组长度的数组,在每个里面找最大的子数组,将这个问题再次变成求首尾不相接的数组

·代码

public class Tes {
    public static void main(String[] args)
    {
        int a[]={-3,-1,2,-3,-4,-2};
        System.out.println("最大子数组的值为:"+fun(a));
    }
    public static int fun(int[] arr) 
    {
        int he = 0;
        int max = 0;
        int len = arr.length;
        int start = 0;
        int end = 0;
        int[] begin = new int[len*2-1]; 
        int[] arrcir = new int[len*2-1];
        for(int i=0;i<len;i++)
        {
            arrcir[i] = arr[i];
        }
        
        for(int i=0;i<len-1;i++)
        {
            arrcir[len+i] = arr[i];
        }
        
        if (arr == null || len == 0) 
        {
            System.out.println("数组为空!!!");
        }

        for(int i=0;i<len;i++)
        {
            he = arr[i];
            if(arr[i]>=0)
            {
                start = i;
                for (int j = i+1; j <len+i; j++)
                {
                    he += arrcir[j];
                    if (he < 0)
                    {
                        he = 0;
                        start = j;
                    }
                    if (he >= max) 
                    {
                        max = he;
                        end = j;
                        begin[j] = start;
                    }
                }
            }
        }
        
        String out = "";
        System.out.println(start+" "+end);
        for(;begin[end] <= end;begin[end]++)
        {
            out = out + " "+arrcir[begin[end]];
        }
        
        if (max == 0)
        {
            for (int i = 0; i < len; i++) 
            {
                if (i == 0)
                {
                    max = arr[i];
                }
                if (arr[i] > max)
                {
                    max = arr[i];
                    start = end = i;
                }
            }
            out = arr[end] + "";
        }
        System.out.println("最大子数组为: "+out);
        return max;
    }
}

·结果截图

 

 

 

 

 

posted @ 2017-03-29 22:20  发酸的丶米饭  阅读(211)  评论(0)    收藏  举报