Java实现 01-复杂度1 最大子列和问题 (20分)

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

 * */
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值