更多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),也可扫下方二维码关注获取最新文章哦~