LeetCode笔记(dp:最长定差子序列**)

本文深入解析了两个算法问题:求解第N个泰波那契数的高效算法,以及寻找最长定差子序列的动态规划解决方案。通过代码示例,展示了如何使用循环和动态规划技巧解决复杂数学序列问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值