zoukankan      html  css  js  c++  java
  • 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

    法二:二分法  

  • 相关阅读:
    [ARC117F]Gateau
    [ARC117D]Miracle Tree
    [loj3504]支配
    [gym102511K]Traffic Blights
    [loj3501]图函数
    [loj3503]滚榜
    [loj3500]矩阵游戏
    [loj2135]幻想乡战略游戏
    [cf720D]Slalom
    [cf1349E]Slime and Hats
  • 原文地址:https://www.cnblogs.com/xxswkl/p/12296440.html
Copyright © 2011-2022 走看看