zoukankan      html  css  js  c++  java
  • 【leetcode】1027. Longest Arithmetic Sequence

    题目如下:

    Given an array A of integers, return the length of the longest arithmetic subsequence in A.

    Recall that a subsequence of A is a list A[i_1], A[i_2], ..., A[i_k] with 0 <= i_1 < i_2 < ... < i_k <= A.length - 1, and that a sequence B is arithmetic if B[i+1] - B[i] are all the same value (for 0 <= 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:

    1. 2 <= A.length <= 2000
    2. 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
  • 相关阅读:
    我从Linux走来,选择了Windows
    静态路由(三路由)
    设置跨交换机VLAN
    服务器只能被动接受
    理解 atime,ctime,mtime (下)
    理解 atime,ctime,mtime (上)
    visualvm连接服务器jvm进行监控
    mysql 日期函数格式
    关于springmvc跨域
    Javassist初体验
  • 原文地址:https://www.cnblogs.com/seyjs/p/10765630.html
Copyright © 2011-2022 走看看