上次课老师留了求一个数组的最大子数组之和,这次题目要求变化了一下,数组变成了环形的数组。主要的设计思想利用动态规划,非环形数组的任意一个元素只要判断前面的元素之和是否大于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; } }