个人作业1-数组
题目:返回一个整数数组中最大子数组的和
要求:
1.输入一个整型数组,数组里有正数也有负数
2.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
3.求所有子数组的和的最大值。要求时间复杂度为O(n).
设计思想:
因为是连续的一个或多个整数组成的子数组,因此如果数组的前端为负数的话可以忽略掉,从正数部分开始累加,如果当累加结果小于等于0时,可以从新进行累加,将新的累加部分和旧的累加部分进行对比,保留值大的。
代码设计:创建一个数组num[n],设置一个int型变量maxstart并赋值为0,设置一个int型变量maxsum用来储存最大值,在for循环中首先判断maxstart的值是否小于等于0,如果小于等于0,则将num[i]的值赋给maxstart,反之在maxstart的基础上加上num[i]的值,
之后对maxstart和maxsum进行比较,判断大小。
出现的问题:
当数组全为负数时,最大值会显示为0,发现最定义maxsum时将其值赋值为0,因此当数组全为负数时,最后结果为0。
解决方案:
在进行for循环之前,将数组的第一个值赋给maxsum。
源代码:
package shuzhi; import java.util.Scanner; public class main { public static void main(String[] args) { int n; int maxsum = 0; int maxstart = 0;//用于判断子数组是否小于0 Scanner in = new Scanner(System.in); System.out.println("输入数组的长度"); n = in.nextInt(); int num[]=new int[n]; System.out.println("输入数组中的值"); for(int i = 0;i < n;i++) { num[i] = in.nextInt(); } maxsum = num[0]; for(int i = 0;i < n;i++) { if (maxstart <= 0) {//忽略掉和为负数和0的子数组 maxstart = num[i]; }else { maxstart += num[i]; } if (maxsum < maxstart) { maxsum = maxstart; } } System.out.println("最大值为:" + maxsum); } }
结果截图:
总结:
这个问题的结果很好求出来,困难的是如何将算法简化到O(n),由于之前写代码只求实现功能,不关心时间复杂度问题,所以如何以简便的方法实现要求的功能让我废了很长时间,最初写出来的代码大部分是O(n*2)甚至是O(n*3),最后是上网查看前辈们的代码才完善了解题思路,通过这次个人作业,我知道在面对一个问题时,要先实现它的基本功能,在研究如何降低时间复杂度问题。