LeetCode 1218. 最长定差子序列(LIS的变种、哈希表优化)

最长定差子序列

  • 状态:
    d p [ i ] dp[i] dp[i]表示以 i i i结尾的序列的最长定差子序列
  • 转移方程:
    d p [ i ] = m a x a [ i ] − a [ j ] = = d i f f { d p [ j ] + 1 } dp[i] = max_{a[i]-a[j]==diff}\{dp[j]+1\} dp[i]=maxa[i]a[j]==diff{ dp[j]+1}
class Solution {
    
    
public:
    int longestSubsequence(vector<int>& a, int dif) {
    
    
        int ans = 1, n = a.size();
        unordered_map<int,int> mp;    
        vector<int> dp(n,1);
        mp[a[0]] = 0;
        for(int i=1;i<n;i++){
    
    
            // a[j] = a[i]-dif;
            int t = a[i]-dif;   
            if(mp.find(t)!=mp.end()) dp[i] = dp[mp[t]]+1;
            ans = max(ans,dp[i]);
            // 因为是要求最长,所以同一个元素尽可能靠后。
            mp[a[i]] = i;
        }
        return ans;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_44846324/article/details/109007051