《剑指offer》——连续子数组的最大和

60 篇文章 3 订阅

更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~

T:

题目描述
HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?

  • 最笨的枚举法

这是我能想到的方法了,刚开始拿到看到题目,总试图用dp的方法解决,但思考了半天,仍然不知道怎么下手,只能用枚举方式了。。。

上图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4sfXI5cS-1570418362921)(https://img-blog.csdn.net/20151109214025071)]

code:

	/**
	 * T: 连续子数组的最大值
	 * 
	 * 题目描述
	 * HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。
	 * 今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,
	 * 当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?
	 * 例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。
	 * 你会不会被他忽悠住?
	 * 
	 * date: 2015.11.9  20:41
	 * @author SSS
	 *
	 */
	public class Solution {
	    /**
		 * 使用了比较笨的方法,枚举法,从前往后,依次算出每一轮累加的结果,
		 * 找到一个最大的,和下一轮的最大的作比较,最后找到一个最大的。
		 * @param array
		 * @return
		 */
	    public int FindGreatestSumOfSubArray(int[] array) {
	        if (array.length == 0) {
				return 0;
			}
	        
	        int greatestNum = array[0]; // 先给定一个初始值
			// 外层循环
			for (int i = 0; i < array.length - 1; i++) {
				//定义一个累加数组temp,其中temp[i] = temp[i - 1] + array[i];
				// 为节省空间,用多少,就设定多大的数组空间
				int []temp = new int[array.length - i];
				temp[0] = array[i];
	            // 下面的for循环没有比较temp[0],这里先作比较
				if (greatestNum < temp[0]) {
					greatestNum = temp[0];
				}
	            
				for (int j = i + 1; j < array.length; j++) {
					temp[j - i] = array[j] + temp[j - i - 1]; 	//由于前面空间设置的问题,这地方的下标定位就较为复杂
					if (greatestNum < temp[j - i]) {  // 判断新累加出来的结果是否为最大值
						greatestNum = temp[j - i];
					}
				}
			}
			
			return greatestNum;
	    }
	}
  • dp方式

看到别人写的代码,才恍然大悟,这么简单,自己竟然都没有想到。。。

还是上图:

这里写图片描述

code:

	public class Solution {
	    public int FindGreatestSumOfSubArray(int[] array) {
	        if (array == null || array.length == 0) {
				return 0;
			}
			
			int maxNum = array[0];
			int tempNum = array[0];
			for (int i = 1; i < array.length; i++) {
				tempNum = tempNum >= 0 ? tempNum + array[i] : array[i];
				maxNum = maxNum < tempNum ? tempNum : maxNum;
			}
			
			return maxNum;
	    }
	}

更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值