1.题目1:返回一个整数数组中最大子数组的和。
要求:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
2.设计思想:
1.首先从数组array[num]下标 i=0 开始,进行元素循环相加,与此同时,每一次相加之后与最大值max进行比较,最大值起初赋值为array[i]。
2.把每一轮的最大值用数组m[num]存放起来。
3.最后循环遍历输出m[num]数组的最大值。
3.程序源代码:
import java.util.*; public class sonarr { public static void main(String[] args) { Scanner input=new Scanner(System.in); System.out.print("数组中数的个数:"); int num=input.nextInt(); int array[]=new int[num]; for(int i=0;i<num;i++) { array[i]=input.nextInt(); } int max=0; // m数组是存放每一轮子数组最大值 int m[]=new int[num]; for(int j=0;j<num;j++) { max=array[j]; int sum=0; for(int t=j;t<num;t++) { sum=sum+array[t]; if(sum>max) { max=sum; } } m[j]=max; } for(int i=0;i<num;i++) { System.out.print("第"+(i+1)+"次比较的子数组的和的最大值为:"); System.out.println(m[i]); } for(int i=1;i<num;i++) { max=m[0]; if(m[i]>max) { max=m[i]; } } System.out.print("子数组和的最大值为:"+max); } }
4.运行结果截图:
5.题目升级:如果在原来基础上把整型一维数组变成循环数组,那么结果又是怎样的呢?
要求:数组中的数只用一次!!
6.设计思想:
1.既然是循环数组,那么就必须控制数组下标可以回到起始值且小于起始值。
2.所以加一个if语句就可以了。
7.程序源代码:
import java.util.Scanner; public class sonarr1 { public static void main(String[] args) { Scanner input=new Scanner(System.in); System.out.print("数组中数的个数:"); int num=input.nextInt(); int array[]=new int[num]; for(int i=0;i<num;i++) { array[i]=input.nextInt(); } int max=0; int m[]=new int[num]; for(int j=0;j<num;j++) { max=array[j]; int t=0; int sum=0; for(t=j;t<num;t++) { sum=sum+array[t]; if(sum>max) { max=sum; } if(t==num-1) { for(int y=0;y<j;y++) { sum=sum+array[y]; if(sum>max) { max=sum; } }} } m[j]=max; } for(int i=0;i<num;i++) { System.out.print("第"+(i+1)+"次比较的子数组的和的最大值为:"); System.out.println(m[i]); } for(int i=1;i<num;i++) { max=m[0]; if(m[i]>max) { max=m[i]; } } System.out.print("子数组和的最大值为:"+max); } }
8.运行结果截图: