递推算法及解题套路

数学归纳法

step 1: 验证k0成立

step 2: 验证如果ki成立,那么ki+1也成立

step 3: 联合step1与step2,证明由k0->kn成立

如何解决递推问题

1.确定递推状态

一个函数符号f(x),外加这个函数符号的含义描述

一般函数所对应的值,就是要求解的值

2.确定递推公式(ki->ki+1)

确定f(x)究竟依赖于哪些f(y)的值

3.分析边界条件(k0)

4.程序实现

递归 || 循环

70. 爬楼梯

cpp 复制代码
class Solution {
public:
    int climbStairs(int n) {
        vector<int> f(n + 1);
        f[0] = 1, f[1] = 1;
        for(int i = 2; i <= n; i++) f[i] = f[i - 1] + f[i - 2]; 
        return f[n];
    }
};

746. 使用最小花费爬楼梯

cpp 复制代码
class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        int n = cost.size();
        vector<int> dp(n + 1);
        cost.push_back(0);
        dp[0] = cost[0];
        dp[1] = cost[1];
        for(int i = 2; i <= n; i++) dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];
        return dp[n];
    }
};

120. 三角形最小路径和

cpp 复制代码
class Solution {
public:
    int minimumTotal(vector<vector<int>>& triangle) {
        int n = triangle.size();
        vector<vector<int>> dp;
        for(int i = 0; i < 2; i++) dp.push_back(vector<int> (n));
        for(int i = 0; i < n; i++) dp[(n - 1) % 2][i] = triangle[n - 1][i];
        for(int i = n - 2; i >= 0; --i){
            int ind = i % 2;
            int next_ind = !ind;
            for(int j = 0; j <= i; j++){
                dp[ind][j] = min(dp[next_ind][j], dp[next_ind][j + 1]) + triangle[i][j];
            }
        }
        return dp[0][0];

    }
};

53. 最大子数组和

cpp 复制代码
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        for(int i = 1; i < nums.size(); i++) nums[i] += nums[i - 1];
        int pre = 0, ans = INT_MIN;
        for(auto x : nums) {
            ans = max(x - pre, ans);
            pre = min(x, pre);
        }
        return ans;
    }
};

122. 买卖股票的最佳时机 II

cpp 复制代码
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int ans = 0;
        for(int i = 1; i < prices.size(); i++){
            if(prices[i] > prices[i - 1]) {
                ans += prices[i] - prices[i - 1];
            }
        }
        return ans;
    }
};

198. 打家劫舍

cpp 复制代码
class Solution {
public:
    int rob(vector<int>& nums) {
        int n = nums.size();
        vector<vector<int>> dp;
        for(int i = 0; i < n; i++) dp.push_back(vector<int>(2));
        dp[0][0] = 0; dp[0][1] = nums[0];
        for(int i = 1; i < n; i++){
            dp[i][0] = max(dp[i - 1][0], dp[i - 1][1]);
            dp[i][1] = dp[i - 1][0] + nums[i];
        }
        return max(dp[n - 1][0], dp[n - 1][1]);
    }
};

322. 零钱兑换

cpp 复制代码
class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        vector<int> dp(amount + 1);
        for(int i = 1; i <= amount; i++) dp[i] = -1;
        for(int i = 1; i <= amount; i++){
            for(auto x : coins){
                if(i < x) continue;
                if(dp[i - x] == -1) continue;
                if(dp[i] == -1 || dp[i] > dp[i - x] + 1) dp[i] = dp[i - x] + 1;
            }
        }
        return dp[amount];
    }
};

300. 最长递增子序列

cpp 复制代码
class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        vector<int> dp(nums.size());
        int ans = 0;
        for(int i = 0; i < nums.size(); i++){
            dp[i] = 1;
            for(int j = 0; j < i; j++){
                if(nums[j] >= nums[i]) continue;
                dp[i] = max(dp[i], dp[j] + 1); 
            }
            ans = max(dp[i], ans);
        }
        return ans;
    }
};
相关推荐
嵌入式老牛1 小时前
液晶段码(米/日字格)识别—倾斜校正
opencv·算法·仿射变换
luj_17681 小时前
残熵算法:风险缓冲与效率优化的融合
c语言·开发语言·网络·经验分享·算法
oddsand12 小时前
pgvector 三大相似度算法
人工智能·算法·机器学习
运筹vivo@2 小时前
LeetCode 2574. 左右元素和的差值
算法·leetcode·职场和发展·每日一题
计算机安禾2 小时前
【数据库系统原理】第4篇:关系数据结构的形式化定义:域、笛卡尔积与关系模式
数据结构·数据库·算法
手写码匠2 小时前
手写 DeepSeek 推理引擎优化:从 FP16 到 INT4 的量化加速实战
人工智能·深度学习·算法·aigc
GuWenyue2 小时前
LeetCode 76 最小覆盖子串|JS 滑动窗口标准解法
前端·算法·面试
一只齐刘海的猫3 小时前
【Leetcode】移动零
算法·leetcode·职场和发展
人道领域3 小时前
【LeetCode刷题日记】131.分割回文串,动态规划优化
java·开发语言·leetcode
指针战神3 小时前
synchronized简易版Redis版跳表实现(注释干货)
数据结构