Related: DP - Longest Arithmetic Progression
https://lina.bitcron.com/post/code/2018-summer-fb-intern-mian-jing
求最大等差数列长度,不要求连续,要保持原来的顺序。例子,1、3、9、5、7。 输出四。因为1、3、5、7DP 可解。opt(i) 用map存(0,i-1)和nums[i]能构成的等差数列的等差,以及不同等差对应的最长length。 map 默认的等差数列最短长度是2
https://lina.bitcron.com/post/code/2018-summer-fb-intern-mian-jing
求最大等差数列长度,不要求连续,要保持原来的顺序。例子,1、3、9、5、7。 输出四。因为1、3、5、7DP 可解。opt(i) 用map存(0,i-1)和nums[i]能构成的等差数列的等差,以及不同等差对应的最长length。 map
public static int longestSubSequence(int[] nums){
if(nums.length<3) return nums.length;
int max = 2;
Map<Integer,Integer> map[] = new Map[nums.length];
for(int i = 0; i<nums.length;i++){
map[i] = new HashMap<Integer,Integer>();
}
map[1].put(nums[1]-nums[0],2);
for(int i = 2; i < nums.length;i++){
map[i].put(nums[i]-nums[0],2);
for(int j = 1; j<i;j++){
if(map[j].containsKey(nums[i]-nums[j])){
if(map[i].containsKey(nums[i]-nums[j])&&map[i].get(nums[i]-nums[j])>map[j].get(nums[i]-nums[j])+1)continue;
map[i].put(nums[i]-nums[j],map[j].get(nums[i]-nums[j])+1);
}
else{
if(map[i].containsKey(nums[i]-nums[j])&&map[i].get(nums[i]-nums[j])>2)continue;
map[i].put(nums[i]-nums[j],2);
}
max = Math.max(max,map[i].get(nums[i]-nums[j]));
}
}
return max;
}