最长等差数列

发布时间 2023-04-22 22:50:15作者: 失控D大白兔

给你一个整数数组 nums,返回nums中最长等差子序列的长度

一. 动态规划

该题类似最长递增子序列
dp[i][j]定义为以i为结尾,公差为j的最长等差数列长度

class Solution {
public:
    int longestArithSeqLength(vector<int>& nums) {
        //dp[i][j]定义为以i为结尾,公差为j的最长等差数列长度
        int n = nums.size();
        vector<map<int,int>> dp(n);
        int mx = 1;
        for(int i=1;i<n;i++){//对每一个数
            for(int j=i-1;j>=0;j--){//遍历比较之前的数
                int val = nums[i] - nums[j];
                if(dp[i].count(val)!=0)  continue;//相同公差不再计算,关键剪枝语句
                if(dp[j].count(val)) dp[i][val] = max(dp[i][val],dp[j][val]+1);
                else dp[i][val] = 2;
                mx = max(mx,dp[i][val]);
            }
        }
        return mx;
    }
};