上次课老师留了求一个数组的最大子数组之和,这次题目要求变化了一下,数组变成了环形的数组。主要的设计思想利用动态规划,非环形数组的任意一个元素只要判断前面的元素之和是否大于0就可以了,环形数组则还要判断数组元素后面的元素之和与0的关系。把数组复制一遍,用另外一个数组记录,从每个数组元素开头的子数组元素的个数不能超过数组的元素个数,否则就会多加某些元素。
package Arraysum_circle; import java.math.*; public class FindClass_circle { public static void main(String[] args) { int[] arr = {9,2,-39,34,5,26,-8}; 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 findCircleArray(int[] array1) { //记录最大子数组的和 int maxNum; //记录数组的长度 int size = array1.length; int[] array2 = new int[2*array1.length]; int[] array3 = new int[2*array1.length]; //array2是两个相同的array1连接起来的 for(int i = 0;i < array1.length;i++) { array2[i] = array1[i]; } int len = array1.length; for(int i = len;i < 2*len;i++) { array2[i] = array1[i-len]; } maxNum = array2[0]; array3[0] = array2[0]; //记录最大子数组的长度不能超过数组的长度 初始化为1 int sonArrayLen = 1; for(int i = 0;(i < array2.length-1) && (sonArrayLen < size);i++) { if(array3[i] > 0) { array3[i+1] = array3[i] + array2[i+1]; //连加一次最大子数组的长度就增加1 sonArrayLen++; } else { array3[i+1] = array2[i+1]; //从头加的话最大子数组的长度恢复为1 sonArrayLen = 1; } maxNum = Math.max(maxNum,array3[i+1]); } return maxNum; } }
时间: 2024-10-07 07:28:26