个人作业1-数组
题目要求:输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n).
设计思想:明确子数组的概念,即原数组中一些连续元素组成的较小数组,再求最大的和。我的思路呢,是从数组的第一个数开始让其连续相加,当其和为负数时,则停止相加,把该元素的值赋 成和的初值,重新相加,依次类推。例:由n个元素组成的数组,计算子数组的最大和,从首元素开始相加,若前m(m<n)个元素和为负数,则重新从第m个元素开始相加。最后输 出“和”即为子数组的和的最大值。
遇到的问题:该程序写好后,运行时发现只适用于正负数交错的数组,对于全部为负数的数组不适用。若数组元素全为负数时,则输出的是数组的最后一个元素,这显然是不行的。于是我又加了一个 for循环,用来判断数组元素是否全为负数,若是,则通过循环比较输出该负数组的最大值;若不是,则调用函数求子数组的和的最大值。
总结:这个实验做出来后感觉并不是特别的难,但编写时还是遇到了很多困难,这说明我对于一些基础知识及拿到题目后思路的构建上还是有很大缺陷的。在课上,同学们纷纷向大家分享自己的思 路及代码,我感觉这样非常有助于大家的学习,集思广益,学习别人的优点和认识到自己的不足。
源程序:
import java.util.*; public class shuzu { public static int max(int a[],int n) { int sum=0; for(int i=0;i<n;i++)//由n个数组成的数组,若前m(m<n)个数的和为非正数,则从第m个数重新开始相加 { sum+=a[i]; if(sum<0) sum=a[i]; } return sum; } public static void main(String[] args) { int[] a=new int[10]; int j=0; Scanner input=new Scanner(System.in); System.out.println("请输入一个由10个数组成的数组:"); for(int i=0;i<10;i++) {//输入数组 a[i]=input.nextInt(); } System.out.print("最大子数组和为:"); int t=a[0]; for(int i=0;i<10;i++) { if(a[i]<0) {j++;} } if(j==10)//判断数组中的数字是否全为负数 { for(int i=0;i<10;i++) { if(a[i]>t) { t=a[i]; } } System.out.println(t); } else System.out.println(max(a,10)); } }
结果截图: