【leetcode】1027. Longest Arithmetic Sequence
题目如下:
Given an array
A
of integers, return the length of the longest arithmetic subsequence inA
.Recall that a subsequence of
A
is a listA[i_1], A[i_2], ..., A[i_k]
with0 <= i_1 < i_2 < ... < i_k <= A.length - 1
, and that a sequenceB
is arithmetic ifB[i+1] - B[i]
are all the same value (for0 <= i < B.length - 1
).
Example 1:
Input: [3,6,9,12] Output: 4 Explanation: The whole array is an arithmetic sequence with steps of length = 3.
Example 2:
Input: [9,4,7,2,10] Output: 3 Explanation: The longest arithmetic subsequence is [4,7,10].
Example 3:
Input: [20,1,15,3,10,5,8] Output: 4 Explanation: The longest arithmetic subsequence is [20,15,10,5].
Note:
2 <= A.length <= 2000
0 <= A[i] <= 10000
解题思路:首先用字典记录A中每个元素出现的下标,接下来求出任意A[i]与A[j]的差值d,依次判断A[j] += d是否存在于A中,并且要求A[j] + d的下标的最小值要大于j,最终即可求出最长的等差数列。
代码如下:
class Solution(object): def longestArithSeqLength(self, A): """ :type A: List[int] :rtype: int """ import bisect res = 0 dic = {} for i,v in enumerate(A): dic[v] = dic.setdefault(v,[]) + [i] for i in range(len(A)): for j in range(i+1,len(A)): count = 2 diff = A[j] - A[i] next = A[j] + diff smallestInx = j while True: if next not in dic: break inx = bisect.bisect_right(dic[next],smallestInx) if inx == len(dic[next]): break smallestInx = dic[next][inx] next = next + diff count += 1 res = max(res,count) return res