1、设计思想:在while循环里,用 i 控制数组的首位,用 j 控制数组的长度,这样就可以在一个循环里遍历所有子数组,并在循环里求出最大子数组

2、代码

public class MaxValueOfSubArray {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int array[] = {2,3,-4,5,-3,-8,7,1,-3};            
        int len = array.length;
        int sum = 0;                            
        for(int i = 0; i < len; i++)
        {
            //求出从i到i+len之间的最大子数组值,如果i+len大于数组长度,则对数组长度取余数
            int temp = getMaxSubArray(array, i, i+len);
            //更新最大子数组的值
            if(temp > sum)
                sum = temp;
            System.out.print(array[i]+" ");
        }
        System.out.println("最大子数组之和为:"+sum);
    }
    
    public static int getMaxSubArray(int[] array,int begin,int end)
    //求数组array在下标begin和end之间的最大子数组之和,如果下标越界,则取下标对数组长度的余数
    {
        int len = array.length;                //求出数组的长度
        if(len <= 0)                        //如果数组不是有效的数组,则返回一个无效的值
            return -1111111111;
        int sum = array[begin];                //sum用来存放子数组之和的最大值,首先赋值为第一个数
        int mark = sum;                        //mark用来标识当前子数组之和,初始化为第一个数
        for(int i = begin+1; i < end; i++)
        {
            if(mark > 0)                    //如果当前子数组之和大于0,则mark加上当前的数字
                mark += array[i%len];
            else                             //如果当前子数组之和小于等于0,则mark从当前数字重新计数
                mark = array[i%len];    
            if(sum < mark)                    //更新sum的值
                sum = mark;
        }
        return sum;
    }
    
}

3、程序截图:

4、出现的问题:下表越界,子数组遍历不全