力扣labuladong一刷day59天动态规划

力扣labuladong一刷day59天动态规划

文章目录

一、509. 斐波那契数

题目链接:https://leetcode.cn/problems/fibonacci-number/description/

思路:这是非常典型的一道题,下面是优化过的代码,a,b就是dp数组,因为每计算一个值,需要前两个值,这个a,b就是用来记录前两个值,避免重复计算,递推公式便是f(n) = f(n-1)+f(n-2)。

java 复制代码
class Solution {
    public int fib(int n) {
        if (n < 2) return n;
        int a = 0, b = 1, c = 0;
        for (int i = 2; i <= n; i++) {
            c = a + b;
            a = b;
            b = c;
        }
        return b;
    }
}

二、322. 零钱兑换

题目链接:https://leetcode.cn/problems/coin-change/description/

思路:本题是一个典型完全背包问题,物品数量无限,故物品在外,背包在内,均正序,背包正序用来满足物品无限。

定义dp数组,dp[j]表示要填满容量为j的背包所需要的最少物品数量。

递推公式为dp[j] = min(dp[j-coins[i]] + 1, dp[j]),求最少物品数量,有两种选择,要么是放入当前物品,要么是不放入当前物品。放入的话,自然就是刚好少于当前物品值的容积所对应的物品数量加1,不放入的话,直接使用dp[jj]的值,该dp[j]可能由之前的物品所填满,也有可能还没填。

java 复制代码
class Solution {
   public int coinChange(int[] coins, int amount) {
        int[] dp = new int[amount+1];
        Arrays.fill(dp, Integer.MAX_VALUE);
        dp[0] = 0;
        for (int i = 0; i < coins.length; i++) {
            for (int j = coins[i]; j < dp.length; j++) {
                if (dp[j - coins[i]] != Integer.MAX_VALUE) {
                    dp[j] = Math.min(dp[j-coins[i]] + 1, dp[j]);
                }
            }
        }
        return dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount];
    }
}
相关推荐
董董灿是个攻城狮9 小时前
AI视觉连载8:传统 CV 之边缘检测
算法
AI软著研究员16 小时前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish16 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱17 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者1 天前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮1 天前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者1 天前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考1 天前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx2 天前
CART决策树基本原理
算法·机器学习
Wect2 天前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript