“21 天好习惯”第一期-14

leetcode每日一题:

次元门

题意: 找到最长的 差值为 difference 的等差数列 ( 题目存在bug , -difference没计算在内.

解题: 很明显的动态规划 , 后面的状态量由前面的状态量得到

首先我们二维 dp 直观 (but TLE 了.

class Solution {
public:
    int longestSubsequence(vector<int>& arr, int difference) {
        int n = arr.size();
        vector<int>dp1(n + 5 , 1);
        // vector<int>dp2(n + 5 , 1);

        for(int i = 1;i < n;i ++){
            for(int j = 0;j < i;j ++){
                if(arr[i] - arr[j] == difference) dp1[i] = max(dp1[i] , dp1[j] + 1);
                // if(arr[i] - arr[j] == -difference) dp2[i] = max(dp2[i] , dp2[j] + 1);
            }
        }

        int re = 0;
        for(int i = 0;i < n;i ++) re = max(re , dp1[i]);

        return re; 
    }
};

因为二维 dp 会 TLE , 所以我们应该在 dp 的过程上取巧.

问题是我们应该如何取巧 (开始没想到 , 我怎么这么菜) :当 nums[i] 要存在等差子序列中时 , 那么 nums[i] - difference 就一定要存在 且 一定要在 i 前面 , 所以我们在遍历第一遍数组时 , 不仅把nums[i] 加入到 nuordered_map (利用哈希表存储 , 记录到 i 位置存在nums[i] , 方便判断之后的 nums[i] 能否加入等差子序列) , 还判断 unordered_map 中是否存在 nums[i] - difference. 这样既做到了判断 nums[i] 加入等差子序列 , 又做到了 满足在 i 之前.

附上代码:

class Solution {
public:
    int longestSubsequence(vector<int>& arr, int difference) {
        unordered_map<int , int>un_map;
        int re = 0;
        
        for(auto ao : arr) un_map[ao] = un_map[ao - difference] + 1 , re = max(re , un_map[ao]);

        return re; 
    }
};

Day Fourteen -- 画舫烟中浅.

猜你喜欢

转载自blog.csdn.net/EX_fish/article/details/121172709