首位相连数组求最大子数组的和
1.设计思路:首先需要定义一个数组,用来存储数值,接着定义一个是上一个数组长度2倍的数组,通过赋值保证原数组能够首尾相连,接着套用求子数组的最大和的方法,不过在求子数组最大和时,必须保证子数组的长度不超过原数组的长度。
2源程序:
package shuzu; import java.util.Scanner;//循环数组首位相连 public class MAX { public static void main(String[] args) { int number; System.out.println("请输入数组的长度"); Scanner sc=new Scanner(System.in); number=sc.nextInt(); int array[]=new int[number]; int array1[]=new int[2*number]; System.out.println("请输入数组的值"); for(int i=0;i<number;i++) { array[i]=sc.nextInt(); }//输入数组的值 int maxsum,maxstart; System.out.println("请输入数组"); for(int i=0;i<2*number;i++) { if(i<number) { array1[i]=array[i]; }else if(i>=number) { array1[i]=array[i%number]; } //保证数组首位相连 System.out.println("array1[i]"+i+"="+array1[i]); } maxsum=array1[0]; maxstart=array1[0]; // int y=0; int start=0; for(int i=1;i<2*number-1;i++) { if(maxstart<0) { maxstart=0; start=i; } maxstart+=array1[i]; if(maxstart>maxsum) { maxsum=maxstart; } if((i-start+2)>number) { break; }//判断子数组长度是否大于原数组长度 } System.out.println("最大子数组的和为"+maxsum); } }
3.测试结果:
4自我感想:这道题目是在求子数组的和最大值的改编,其内容基本一致,只是添加了如何让数组首尾相连,一道题目在不同的条件下就可能出现不同的问题,这也需要我们 不断地去思考,去学习。