【Leetcode】1027. Longest Arithmetic Subsequence

题目地址:

https://leetcode.com/problems/longest-arithmetic-subsequence/description/

给定一个长 n n n数组 A A A,求其最长等差子序列的长度。

f [ i ] [ j ] f[i][j] f[i][j]是以 A [ i ] , A [ j ] A[i],A[j] A[i],A[j]为最后两项的情况下的最长等差子序列的长度,那么 f [ i ] [ j ] f[i][j] f[i][j]至少等于 2 2 2。如果 A [ 0 : i − 1 ] A[0:i-1] A[0:i1] x = 2 A [ i ] − A [ j ] x=2A[i]-A[j] x=2A[i]A[j],则找到 x x x出现的最后的位置,比如说在 k k k,则 f [ i ] [ j ] = 1 + f [ k ] [ i ] f[i][j]=1+f[k][i] f[i][j]=1+f[k][i]。为了快速找到 x x x出现的最后位置,可以开一个哈希表。代码如下:

class Solution {
 public:
  int longestArithSeqLength(vector<int>& a) {
    int n = a.size(), f[n][n];
    memset(f, 0, sizeof f);
    unordered_map<int, int> mp;
    int res = 0;
    for (int i = 0; i < n - 1; i++) {
      for (int j = i + 1; j < n; j++) {
        f[i][j] = 2;
        int t = 2 * a[i] - a[j];
        if (mp.count(t)) f[i][j] = f[mp[t]][i] + 1;
        res = max(res, f[i][j]);
      }
      mp[a[i]] = i;
    }

    return res;
  }
};

时间复杂度 O ( n 2 ) O(n^2) O(n2),空间 O ( n ) O(n) O(n)

你可能感兴趣的:(LC,贪心,动态规划与记忆化搜索,leetcode,算法,c++)