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 -- 画舫烟中浅.