1137 - 1218
1137. 第 N 个泰波那契数
// 21.40
// 21.45
class Solution {
public:
int tribonacci(int n) {
int tmp[3] = {0, 1, 1};
if(n < 3) return tmp[n];
int t = 2;
while(t != n) {
t++;
tmp[t % 3] = tmp[(t - 3) % 3] + tmp[(t - 2) % 3] + tmp[(t - 1) % 3];
}
return tmp[t % 3];
}
};
1218. 最长定差子序列**
这题直接开一个数组dp,记录以arr[i]为结尾的子序列的长度即可,但由于arr[i] 以及 difference 太大了且还有负数,所以我用两个向量,dp[0]表示处于正数,dp[1]表示处于负数。(评论区中几乎都用map,确实用map可以大幅减少空间的开销)
**以后当需要用到两个for的dp问题,可以用这种存储键值的方式(map/vector)来将时间复杂度缩短为O(n)
// 21.50
// 22.20
class Solution {
public:
int longestSubsequence(vector<int>& arr, int difference) {
if(arr.empty()) return 0;
if(arr.size() == 1) return 1;
int ans = 0;
vector<vector<int>> dp(2, vector<int>(20001, 0));
for(int i = 0; i < arr.size(); i++) {
int a = 1, b = 1;
if(arr[i] >= 0) a = 0;
if(arr[i] - difference >= 0) b = 0;
dp[a][abs(arr[i])] = dp[b][abs(arr[i] - difference)] + 1;
ans = max(ans, dp[a][abs(arr[i])]);
}
return ans;
}
};