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)
View Code

参考别人改进后的代码,想要使用字典的默认返回值时,要学会字典的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)
View Code

法二:二分法  

 

posted on 2020-02-11 19:51  吃我一枪  阅读(258)  评论(0编辑  收藏  举报

导航