标签:
设计思路:
(1)将循环数组拆为我们熟悉的以为数组
(2)通过每个数组元素在数组中位置前移一位来实现环的拆分(array[i1]=array[i1+1])
(3)在每次拆分后的数组中求出最大子数组和并记录到一个新的数组result【】中
(4)求出result【】中的最大值r作为循环数组的最大值
拆分后数组最大子数组喝的解决:
(1)定义整数数组arr[i]
(2)定义maxsum为最大子数组和并赋初值为arr[0]
(3)定义一个中间变量temp由arr[0]计算子数组(连续的)的和当temp为负数时更新temp为
当前arr[i]值当temp再次被赋值为正数(即temp为负值后遇到的第一个大于0的array[i])时如果该数值大于原来的maxsum则更新maxsum
(4)如果temp>0且temp>maxsum更新maxsum
(5)返回maxsum
源代码:
import java.util.Scanner; public class GetMaxArraySum { public static int getMax(int arr[]){//定义一个函数求数组中最大子数组和 int maxSum=arr[0]; int temp=0;//用来存储连续子数组的和 for(int i=0;i<arr.length;i++) { if(temp<0) { temp=arr[i];//当子数组的和为负数时直接抛弃并把当前数字赋给它 if(temp>0&&maxSum<temp )//当temp小于0后出现第一个大于0的temp时且大于原来的maxsum赋值 {maxSum=temp;}//一开始没写该语句当输入1,-2,4的时候输出1出现逻辑错误 } else { temp+=arr[i];//如果连续数字和为正则继续加下去 if(maxSum<temp) { maxSum=temp;//当现有连续数字和大于之前最大连续数字和时更新最大值 } } } return maxSum; } public static int max(int arr[]){ int max=arr[0]; for(int i=0;i<arr.length;i++) { if(max<arr[i]) { max=arr[i]; } } return max; } public static void main(String[] args){ int []array=new int[100]; System.out.println("请输入要求解的数组个数:"); @SuppressWarnings("resource") Scanner reader=new Scanner(System.in); int n=reader.nextInt(); System.out.println("请输入要求解的数组:"); int[] result=new int[array.length]; for(int i=0;i<n;i++) { array[i]=reader.nextInt(); } for(int i=0;i<array.length;i++) { int temp=array[0]; for(int i1=0;i1<array.length-1;i1++) { array[i1]=array[i1+1]; } array[array.length-1]=temp; result[i]=getMax(array); } int r=max(result); System.out.println("最大子数组和为:"+r); } }
结果截图:
结对照片:
标签:
原文地址:http://www.cnblogs.com/liying123/p/5383528.html