package com.interview.algorithms.array;
import com.interview.basics.sort.QuickSorter;
/**
* Created_By: stefanie
* Date: 14-8-19
* Time: 下午6:20
*/
public class C4_46_ArithmeticProgressionFinder {
static QuickSorter<Integer> SORTER = new QuickSorter<>();
static int MIN_LENGTH = 3;
public static Integer[] find(Integer[] array){
SORTER.sort(array);
int MAX = (int) Math.ceil((array[array.length - 1] - array[0])/(MIN_LENGTH+0.0));
int[][] mark = new int[array.length][MAX + 1];
int last = 0;
int maxLen = 0;
int step = 0;
for(int i = 0; i < array.length; i++){
for(int j = i - 1; j >= 0; j--){
int dis = array[i] - array[j];
if(dis > MAX) continue;
mark[i][dis] = mark[j][dis] == 0? 2: mark[j][dis] + 1;
if(mark[i][dis] > maxLen){
last = array[i];
maxLen = mark[i][dis];
step = dis;
}
}
}
if(maxLen > MIN_LENGTH){
Integer[] progression = new Integer[maxLen];
for(int i = maxLen - 1; i >= 0; i--) {
progression[i] = last - step * (maxLen - 1 - i);
}
return progression;
} else {
return null;
}
}
}