环形数组的最大子数组之和

  上次课老师留了求一个数组的最大子数组之和,这次题目要求变化了一下,数组变成了环形的数组。主要的设计思想利用动态规划,非环形数组的任意一个元素只要判断前面的元素之和是否大于0就可以了,环形数组则还要判断数组元素后面的元素之和与0的关系。既然是环形数组,每个元素都可能是开头,也可能是结尾。

package Arraysum_circle;
import java.math.*;
public class FindClass_circle 
{
    public static void main(String[] args)
    {
        int[] arr = {-1,3,5,-2,7};
        for(int i = 0;i < arr.length;i++)
        {
            System.out.print(arr[i]+" ");
        }
        System.out.println();
        int result = Find_circle.findCircleArray(arr);
        System.out.println("最大子数组之和为:"+result);
    }
}

class Find_circle
{
    public static int find(int[] array)
    {
        int array1[] = new int[array.length];
//        for(int i = 1;i < array1.length;i++)
//        {
//            array1[i] = 0;
//        }
        array1[0] = array[0];
        int maxVal = array[0];
        for(int i = 0;i < array.length - 1;i++)
        {
            //如果第i+1个元素的前i个元素之和大于0就把这i个元素的和加到第i+1个元素上面        即前i个元素对第i+1个元素有贡献
            if(array1[i] > 0)
            {
                array1[i+1] = array1[i] + array[i+1];
            }
            //如果第i+1个元素的前i个元素之和小于0不加        即前i个元素对第i+1个元素没有贡献
            else
            {
                array1[i+1] = array[i+1];
            }
            //更新最大值 
            maxVal = Math.max(maxVal,array1[i+1]);
        }
        return maxVal;
    }
    
    public static void changeArray(int[] array)
    {
        int index = array[array.length-1];
        for(int j = array.length-1;j > 0;j--)
        {
            array[j] = array[j-1];
        }
        array[0] = index;
    }
    
    
    public static int findCircleArray(int[] array1)
    {
        //记录最大子数组的和
        int maxNum = -1111;
        for(int j = 0;j < array1.length;j++)
        {
            maxNum = Math.max(find(array1),maxNum);
            changeArray(array1);
        }
        return maxNum;
    }
}

 

posted @ 2016-04-12 18:19  学计算机的人绝不认输  阅读(533)  评论(0编辑  收藏  举报