原文是这个. 讲的一个很简单的题目.
http://www.iteye.com/topic/787888
我想到一个更简单一点的方法.
启发就是比较连续2组数的时候只需要比较有差别的那2个. 比如:
数据下标 0 1 2 和 1 2 3 比较的时候只需要比较 下标0 和下标3 的大小即可. 这样比较的次数是原来的1/3.
通过对其它的情况都考虑以后发现可以取一个基准点, 和一个差额, 当然必不可少的一个最大组合的下标.
实现的代码如下.
benchmark 了一下. 速度比原来的实现要快一点. 100 000次 1515ms 比2406ms
http://www.iteye.com/topic/787888
我想到一个更简单一点的方法.
启发就是比较连续2组数的时候只需要比较有差别的那2个. 比如:
数据下标 0 1 2 和 1 2 3 比较的时候只需要比较 下标0 和下标3 的大小即可. 这样比较的次数是原来的1/3.
通过对其它的情况都考虑以后发现可以取一个基准点, 和一个差额, 当然必不可少的一个最大组合的下标.
实现的代码如下.
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
int[] arr = { 2, 5, -6, 12, 7, 15, 6, -10, 38 };
Test.find(arr);
}
public static void find(int[] data) {
/**
* make sure the length of data more than or equal 5;
*/
if (data.length <= 5)
return;
/**
* difference between current comparing data subscript
* and max subscript of data
*/
int diff = 0;
/**
* index of max subscript of data, can also be
* a array to record max combinations.
*/
int maxIdx = 0;
for (int i = 1; i < data.length - 2; i++) {
int bigger = data[i - 1] - data[i + 2];
if (diff + bigger > 0) {
diff += bigger;
} else {
maxIdx = i;
diff = data[i - 1] - data[i + 2];
}
}
System.out.println("maxIndex : " + maxIdx + ", data : " + data[maxIdx]
+ ", " + data[maxIdx + 1] + ", " + data[maxIdx + 2] + ". ");
}
}
benchmark 了一下. 速度比原来的实现要快一点. 100 000次 1515ms 比2406ms