最长连续子序列偏移_leetcode No.1027 最长等差数列

最长连续子序列偏移_leetcode No.1027 最长等差数列_第1张图片

世界上根本没有秋天好么,至少北京没有。。。

题目链接:

1027. 最长等差数列 - 力扣(LeetCode)​leetcode-cn.com
5d29ed61b4342dbb2b50a9f00d7d9b96.png

题目描述:

给定一个整数数组 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 是等差的。

示例 1:

输入:[3,6,9,12]
输出:4
解释: 
整个数组是公差为 3 的等差数列。

示例 2:

输入:[9,4,7,2,10]
输出:3
解释:
最长的等差子序列是 [4,7,10]。

示例 3:

输入:[20,1,15,3,10,5,8]
输出:4
解释:
最长的等差子序列是 [20,15,10,5]。

提示:

  1. 2 <= A.length <= 2000
  2. 0 <= A[i] <= 10000

解题思路:

本题又是具备无后效性,可以用动态规划求解,dp[i][diff] 表示以第 i 个数开始,diff 为偏移值的等差数列的长度,其中 diff=A[i]-A[j],n>i>j>=0。则状态转移方程有两种情况:

  1. dp[j][diff] 存在,又因为 diff=A[i]-A[j],则在原始以 A[j] 为结尾的等差数列的后面可以添上 A[i],有 dp[i][diff] = dp[j][diff] + 1。
  2. 否则,则 A[i] 和 A[j] 两个数可以构成一个只有两个元素且偏移值为 diff 的等差数列,有 dp[i][diff] = 2。

具体实现的时候可以用哈希表。

代码如下:

class Solution {
public:
    int longestArithSeqngth(vector& A) {
        int n = A.size();
        if(n <= 1) return n;
        unordered_map> dp;
        int res = 0, diff;
        for (int i = 1; i < n; i++) {
            for (int j = 0; j < i; j++) {
                diff = A[i] - A[j];
                if (dp[j][diff]) dp[i][diff] = dp[j][diff] + 1;
                else dp[i][diff] = 2;
                res = max(res, dp[i][diff]);
            }
        }
        return res;
    }
};

如果有任何疑问,欢迎提出。如果有更好的解法,也欢迎告知。

你可能感兴趣的:(最长连续子序列偏移)