思路
用List存放等差数列,用HashMap来存放最长的等差数列,其中任意相邻两个数字的差值存入key,key=a[j] – a[i] 其中j > i,value来记录List(i , j),将相同的差值放入List中,不同差值则重新创建List,进行比较,长的List放入HashMap,最后返回HashMap就可以求出最长的等差数列。
如下:{89,2,73,4,5,6,7,8,10,12,15,4,5,6,8,9,10,23,54}key=1 ==> value = { (4,5,6,7,8) 或 (4,5,6,8,9,10)}其中 (4,5,6,8,9,10) 长则放入HashMap中,返回HashMap。
Java实现代码
private static List<Integer> findMaxLenSequence(List<Integer> list) {
//识别第几个等差序列
int number = 0;
//计算长度
int length = 2;
//将等差序列放入list_value中
List<Integer> list_value = new ArrayList<Integer>();
//将相邻的数字差值当做key,相邻数字当做value
Map<Integer, List<Integer>> map = new HashMap<>();
//存入空值,后续进行比较
map.put(0, list_value);
int lastNum = list.get(1);
int value = list.get(1) - list.get(0);
list_value.add(list.get(0));
list_value.add(lastNum);
for (int i = 2; i < list.size(); i++) {
//将现在的数字和前一个比较,得出差值
int d_value = list.get(i) - lastNum;
//如果差值相等放入list_value中
if (d_value == value) {
list_value.add(list.get(i));
length++;
} else {
//不等的则重新创建list_value
list_value = new ArrayList<Integer>();
list_value.add(list.get(i - 1));
list_value.add(list.get(i));
length = 2;
}
value = d_value;
if (length >= 3) {
//如果长度大于map中的长度,则将该序列替换原序列
if(list_value.size() > map.get(0).size()){
map.put(0, list_value);
}
} else {
number++;
}
lastNum = list.get(i);
}
return map.get(0);
}
参考资料
<a href=”http://blog.csdn.net/dafeng_blog/article/details/11497359” target=”_blank”>在一个无序的数组中找出最长的等差数列>
<a href=”https://zhidao.baidu.com/question/304480400238373324.html” target=”_blank”>java实现 求随机数构成的数组中找到长度大于=3的最长的等差数列