JZ71 变态跳台阶

img

😀前言
本文探讨了一个有关青蛙跳台阶的变体问题,与传统的台阶跳跃不同,这只青蛙每次可以跳上任意多的台阶。我们需要解决的问题是:对于给定的台阶数,计算青蛙跳上该台阶的所有可能方法。本文将通过动态规划和数学推导两种方法来解决这个问题,并进一步优化算法以满足空间和时间复杂度的进阶要求。

🏠个人主页:尘觉主页

文章目录

  • 变态跳台阶
    • 题目链接
      • 描述
      • 示例1
      • 示例2
    • 题目描述
    • 解题思路
        • 动态规划
      • 数学推导
      • 进阶
    • 😄总结

变态跳台阶

题目链接

牛客网

描述

这个问题描述了一只青蛙跳上台阶的情景,不同之处在于这只青蛙每次可以跳上任意多的台阶。具体来说,它一次可以跳上1级台阶,也可以跳上2级,或者跳上n级。我们需要计算出跳上一个n级的台阶总共有多少种跳法。

数据范围:1≤𝑛≤201≤n≤20

进阶:空间复杂度 𝑂(1)O(1) , 时间复杂度 𝑂(1)O(1)

示例1

输入:3

输出:4

示例2

输入:1

输出:1

题目描述

一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级… 它也可以跳上 n 级。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。

cd411a94-3786-4c94-9e08-f28320e010d5

解题思路

动态规划

动态规划是一种常用的解题思路,适用于解决具有重叠子问题和最优子结构性质的问题。对于这个问题,我们可以使用动态规划来求解。

我们定义一个数组dp,其中dp[i]表示跳上第i级台阶的跳法总数。初始时,我们将dp数组全部初始化为1,因为青蛙跳上第0级台阶只有一种方式,即不跳。然后,我们从第1级台阶开始,依次计算跳上每级台阶的跳法总数。具体来说,对于第i级台阶,它可以从第0级、第1级、…、第i-1级台阶跳上来,所以跳上第i级台阶的跳法总数等于跳上第0级到第i-1级台阶的跳法总数之和。最后,返回dp[target - 1]即可。

public int jumpFloorII(int target) {int[] dp = new int[target];Arrays.fill(dp, 1);for (int i = 1; i < target; i++)for (int j = 0; j < i; j++)dp[i] += dp[j];return dp[target - 1];
}

数学推导

除了动态规划外,我们还可以通过数学推导来解决这个问题。假设青蛙跳上第n级台阶的跳法总数为f(n),我们可以观察到以下规律:

  • 跳上n-1级台阶,可以从n-2级台阶跳1级上去,也可以从n-3级台阶跳2级上去,以此类推,直到从第0级台阶跳n-1级上去。
  • 同样,跳上n级台阶,可以从n-1级台阶跳1级上去,也可以从n-2级台阶跳2级上去,以此类推,直到从第0级台阶跳n级上去。

基于上述观察,我们可以得到以下等式:

跳上 n-1 级台阶,可以从 n-2 级跳 1 级上去,也可以从 n-3 级跳 2 级上去…,那么

f(n-1) = f(n-2) + f(n-3) + ... + f(0)

同样,跳上 n 级台阶,可以从 n-1 级跳 1 级上去,也可以从 n-2 级跳 2 级上去… ,那么

f(n) = f(n-1) + f(n-2) + ... + f(0)

综上可得

f(n) - f(n-1) = f(n-1)

f(n) = 2*f(n-1)

所以 f(n) 是一个等比数列

public int JumpFloorII(int target) {return (int) Math.pow(2, target - 1);
}

进阶

本题还要求实现进阶要求,即空间复杂度为𝑂(1),时间复杂度为𝑂(1)。对于这个要求,我们可以利用数学推导得到的结果,直接使用指数函数计算跳法总数,从而实现较低的空间复杂度和时间复杂度。

😄总结

在本文中,我们通过动态规划和数学推导两种方法解决了青蛙跳台阶的变体问题。首先,我们使用动态规划构建了一个数组来记录跳上每级台阶的跳法总数,然后通过迭代计算得到结果。接着,我们利用数学推导得到的等比数列关系,直接使用指数函数计算跳法总数,以实现更低的空间和时间复杂度。最终,我们成功实现了对于给定台阶数的青蛙跳跃方法的高效计算,满足了进阶要求。

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/674776.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Java编写的简单彩票中奖概率计算器

前言 在当今社会&#xff0c;彩票已经成为许多人追逐梦想和改变生活的一种方式。然而&#xff0c;中奖的概率却是一个让人犹豫和兴奋的话题。在这篇文章中&#xff0c;我们将探讨如何使用Java编程语言实现一个简单的彩票中奖概率计算器。通过这个计算器&#xff0c;我们可以根…

【智能算法】人类进化优化算法(HEOA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;J Lian受到人类进化启发&#xff0c;提出了人类进化优化算法&#xff08;Human Evolutionary Optimization Algorithm, HEOA&#xff09;。 2.算法原理 2.1算法思想 …

欧式聚类提取-------PCL

欧式聚类 std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> PclTool::euclideanClustering(const pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud) {std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> clustered_clouds;// 下采样pcl::Vox…

Linux各目录及每个目录的详细介绍

目录 /bin 存放二进制可执行文件(ls,cat,mkdir等)&#xff0c;常用命令一般都在这里。 /etc 存放系统管理和配置文件 /home 存放所有用户文件的根目录&#xff0c;是用户主目录的基点&#xff0c;比如用户user的主目录就是/home/user&#xff0c;可以用~user表示 /us…

学习和分析各种数据结构所要掌握的一个重要知识——CPU的缓存利用率(命中率)

什么是CPU缓存利用率&#xff08;命中率&#xff09;&#xff0c;我们首先要把内存搞清楚。 硬盘是什么&#xff0c;内存是什么&#xff0c;高速缓存是什么&#xff0c;寄存器又是什么&#xff1f; 我们要储存数据就要运用到上面的东西。首先里面的硬盘是可以无电存储的&#…

【工作记录】openjdk-22基础镜像的构建

背景 近期使用到的框架底层都用的是springboot3.0&#xff0c;要求jdk版本在17甚至更高。 于是决定制作一个基于openjdk22的基础镜像&#xff0c;本文对这一过程进行记录。 作为记录的同时也希望能够帮助到需要的朋友。 期望效果 容器内可以正常使用java相关命令且版本是2…

《十九》Qt Http协议及实战

前言 本篇文章来给大家讲解QT中的Http协议&#xff0c;Http协议主要用于网络中数据的请求和响应&#xff0c;那么这篇文章将给大家讲解一下这个协议。 一、HTTP概述 HTTP&#xff08;超文本传输协议&#xff09;是互联网上应用最为广泛的协议之一&#xff0c;它定义了客户端…

书生·浦语大模型实战营之 OpenCompass大模型评测

书生浦语大模型实战营之 OpenCompass &#xff1a;是骡子是马&#xff0c;拉出来溜溜 为什么要研究大模型的评测&#xff1f; 百家争鸣&#xff0c;百花齐放。 首先&#xff0c;研究评测对于我们全面了解大型语言模型的优势和限制至关重要。尽管许多研究表明大型语言模型在多…

庐山西海服务区:从高速服务区到旅游热点的华丽转身

五一假期期间&#xff0c;庐山西海服务区以其独特的魅力吸引了众多游客的目光。曾经只是一个供汽车加油和休息的普通服务区&#xff0c;如今却焕发出了绚丽的光彩&#xff0c;成为了周边地区备受瞩目的旅游热点。庐山西海服务区的转型&#xff0c;不仅为游客带来了丰富多样的娱…

20230507,LIST容器

学了又忘学了又忘&#xff0c;明知道会忘又不想复习又还得学 LIST容器 1.1 基本概念 链表是一种物理存储单元上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接实现的&#xff1b;链表由一系列结点组成 结点&#xff1a;一个是存储数据元素的数据域&a…

算法提高之树的最长路径

算法提高之树的最长路径 核心思想&#xff1a;树形dp 枚举路径的中间节点用f1[i] 表示i的子树到i的最长距离,f2[i]表示次长距离最终答案就是max(f1[i]f2[i]) #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N …

JavaScript异步编程——02-Ajax入门和发送http请求

同步和异步回顾 同步和异步的简单理解 同步&#xff1a;必须等待前面的任务完成&#xff0c;才能继续后面的任务。 异步&#xff1a;不受当前任务的影响。 拿排队举例&#xff1a; 同步&#xff1a;在银行排队时&#xff0c;只有等到你了&#xff0c;才能够去处理业务。 异…