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 是等差的。
链接:https://leetcode-cn.com/problems/longest-arithmetic-sequence
法一:自己的代码
思路:利用两层循环遍历,同446等差数列划分II-子序列 方法,用字典实现的备忘录。
# 执行用时 :1832 ms, 在所有 Python3 提交中击败了24.84% 的用户 # 内存消耗 :145.9 MB, 在所有 Python3 提交中击败了38.30%的用户 from typing import List from collections import defaultdict class Solution: def longestArithSeqLength(self, A: List[int]) -> int: res = 0 dp = [] size = len(A) for i in range(size): dp.append(defaultdict(lambda : 1)) for i in range(1, size): for j in range(i): d = A[i] - A[j] # dp[j]是一个字典,key是方差,value是以A[j]结尾的最大的等差数列的长度 if d in dp[j].keys(): # 当前dp[i]的值和dp[j]+1的最大值,即dp[i][d]的最大值 dp[i][d] = max(dp[i][d], dp[j][d] + 1) else: dp[i][d] = 2 res = max(res, dp[i][d]) return res if __name__ == '__main__': solution = Solution() result = solution.longestArithSeqLength([9,4,7,2,10]) print(result)
参考别人改进后的代码,想要使用字典的默认返回值时,要学会字典的get方法。
from typing import List class Solution: def longestArithSeqLength(self, A: List[int]) -> int: n = len(A) # 注意这里无需用defaultdict,用普通的dict即可,因为dict有get方法,可以设置默认的返回值, dp = [{} for _ in range(n)] res = 1 for i, e in enumerate(A): for j, v in enumerate(A[:i]): dp[i][e - v] = dp[j].get(e - v, 1) + 1 # res = max(res, dp[i][e-v]) # 这样更快 for d in dp[1:]: res = max(res, max(list(d.values()))) return res if __name__ == '__main__': solution = Solution() result = solution.longestArithSeqLength([9,4,7,2,10]) print(result)
法二:二分法