求无序数列中最长的等差数列(思路及实现)

思路

用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的最长的等差数列

点赞