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、出现的问题:下表越界,子数组遍历不全