坚持做题差不多有半年的时间了,但是这个学习的过程中,DP
是我算法学习中的一道大坎,最近可能会多多练习DP
题目,相应的blog
也会更很多关于DP
题目的解析。
最长等差数列,虽然做的人较少,但是确实是一道非常经典的DP
题。
1027. 最长等差数列
给定一个整数数组 A,返回 A 中最长等差子序列的长度。
回想一下,A 的子序列是列表 A[i_1], A[i_2], …, A[i_k] 其中 0 <= i_1 < i_2 < … < i_k <= A.length - 1。并且如果 B[i+1] - B[i]( 0 <= i < B.length - 1) 的值都相同,那么序列 B 是等差的。
示例 1:
1
2
3
4
5 > 输入:[3,6,9,12]
> 输出:4
> 解释:
> 整个数组是公差为 3 的等差数列。
>
示例 2:
1
2
3
4
5 > 输入:[9,4,7,2,10]
> 输出:3
> 解释:
> 最长的等差子序列是 [4,7,10]。
>
示例 3:
1
2
3
4
5 > 输入:[20,1,15,3,10,5,8]
> 输出:4
> 解释:
> 最长的等差子序列是 [20,15,10,5]。
>
提示:
2 <= A.length <= 2000
0 <= A[i] <= 10000
思路:等差数列中任取连续的三个数A[i], A[j], A[k] 其中 i < j < k,有A[k] - A[j] = A[j] - A[i]
==> 2 * A[j] = A[k] - A[i] 可以通过较大的两个数找最小的A[i],这样就转化成了一个子问题。
关于这题特殊的地方也就是0 <= A[i] <= 10000
,数据规模够小可以开array
去做hashtable
。
1 | class Solution { |