算法学习day38动态规划part01-509、70、746
package LeetCode.DPpart01; /** * 509. 斐波那契数 * 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。 * 该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: * F(0) = 0,F(1) = 1 * F(n) = F(n - 1) + F(n - 2),其中 n > 1 * 给定 n ,请计算 F(n) 。 * 示例: * 输入:n = 2 * 输出:1 * 解释:F(2) = F(1) + F(0) = 1 + 0 = 1 * */ public class FibonacciNumber_509 { public static void main(String[] args) { int num = 2; int result = fib(num); System.out.println(result); } public static int fib(int n) { if (n <= 1) return n; int[] dp = new int[n + 1]; dp[0] = 0; dp[1] = 1; for (int index = 2; index <= n; index++){ dp[index] = dp[index - 1] + dp[index - 2]; } return dp[n]; } }
package LeetCode.DPpart01; /** * 70. 爬楼梯 * 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 * 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? * 示例: * 输入:n = 2 * 输出:2 * 解释:有两种方法可以爬到楼顶。 * 1. 1 阶 + 1 阶 * 2. 2 阶 * */ public class ClimbingStairs_70 { public static void main(String[] args) { int num = 2; int result = climbStairs(num); System.out.println(result); } //常规版本 public static int climbStairs(int n) { int[] dp = new int[n + 1]; dp[0] = 1; dp[1] = 1; for (int i = 2; i <= n; i++) { dp[i] = dp[i - 1] + dp[i - 2]; } return dp[n]; } // 用变量记录代替数组 // 空间优化 public static int climbStairs2(int n) { if(n <= 2) return n; int a = 1, b = 2, sum = 0; for(int i = 3; i <= n; i++){ sum = a + b; // f(i - 1) + f(i - 2) a = b; // 记录f(i - 1),即下一轮的f(i - 2) b = sum; // 记录f(i),即下一轮的f(i - 1) } return b; } }
package LeetCode.DPpart01; /** * 746. 使用最小花费爬楼梯 * 给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。 * 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 * 请你计算并返回达到楼梯顶部的最低花费。 * 示例: * 输入:cost = [10,15,20] * 输出:15 * 解释:你将从下标为 1 的台阶开始。 * - 支付 15 ,向上爬两个台阶,到达楼梯顶部。 * 总花费为 15 。 * */ public class MinCostClimbingStairs_746 { public static void main(String[] args) { int [] cost = {10,15,20}; int result = minCostClimbingStairs(cost); System.out.println(result); } public static int minCostClimbingStairs(int[] cost) { int len = cost.length; int[] dp = new int[len + 1]; // 从下标为 0 或下标为 1 的台阶开始,因此支付费用为0 dp[0] = 0; dp[1] = 0; // 计算到达每一层台阶的最小费用 for (int i = 2; i <= len; i++) { dp[i] = Math.min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]); } return dp[len]; } }
分类:
算法学习
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署