Java实现 01-复杂度1 最大子列和问题 (20分)
最近在中国大学学习陈越老师的数据结构,把完成的作业发上来记录一下。
第一个作业是计算一个最大子列和问题,在作业提交平台上有系统的提供的测试用例,但自己练习的时候还是写了一个方法去获取一个从-100到100的随机数数组。使用了util包下的random方法,返回一个数组。
老师讲了四种不同时间复杂度的算法,O(N^3)的算法太傻就不写了.
直接从O(N^2)的算法开始,封装成methodOne,后面注释中有运行结果。
第二个方法是在线处理,从头开始计算,遇到更大的总数就更新总数,当某一段总数为负时就抛弃掉这一段总数。
最后可以明显看出两种算法的区别。
package dataStructure;
import java.awt.image.renderable.RenderableImage;
import java.util.Random;
public class MaxiumSubcolumns {
public static int[] getRandom(int n){
// 生成一个-100到100的随机数
Random rand = new Random();
int[] a = new int[n];
for(int i=0;i<n;i++){
a[i] = rand.nextInt()%101;
}
return a;
}
public static void methodOne(int[] a){
// 时间复杂度O(n^2)
long startTime = System.currentTimeMillis();
int maxNum=0;
for(int i=0;i<a.length;i++){
int num = a[i];
for(int j=i+1;j<a.length;j++){
num+=a[j];
if(num>maxNum)
maxNum = num;
}
}
long endTime = System.currentTimeMillis();
long TotalTime = endTime-startTime;
System.out.println("暴力法结果为:"+maxNum);
System.out.println("暴力法用时:"+TotalTime);
}
public static void methodTwo(int[] a){
long startTime = System.currentTimeMillis();
int ThisSum=0,maxSum=0;
for(int i=0;i<a.length;i++){
ThisSum+=a[i];
if(ThisSum>maxSum)
maxSum = ThisSum;
else if(ThisSum<0)
ThisSum = 0;
}
long endTime = System.currentTimeMillis();
long TotalTime = endTime-startTime;
System.out.println("在线处理结果为:"+maxSum);
System.out.println("在线处理用时:"+TotalTime);
}
public static void main(String[] args) {
int[] a = getRandom(1000000);
// int[] a = {-2,11,-4,13,-5,-2};
// methodOne(a);
methodTwo(a);
}
/*
* ------1000-------
* 暴力法结果为:3988
暴力法用时:4
在线处理结果为:3988
在线处理用时:1
------------10000-------
暴力法结果为:3438
暴力法用时:50
在线处理结果为:3438
在线处理用时:2
---------100000-------------
暴力法结果为:17093
暴力法用时:2998
在线处理结果为:17093
在线处理用时:2
--------1000000---------
暴力法运行时间过长
在线处理结果为:85499
在线处理用时:11
* */
}