算法题-爬楼梯-不同思路解法

主要记录个人思考过程,不同方案实现思路的演变

题目

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:

输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。

  1. 1 阶 + 1 阶
  2. 2 阶
示例 2:

输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。

  1. 1 阶 + 1 阶 + 1 阶
  2. 1 阶 + 2 阶
  3. 2 阶 + 1 阶

思路一

当时大脑出现的第一想法就是先找找规律

  • f(1) = 1
  • f(2) = 2
  • f(3) = 3
  • f(4) = 5
  • f(5) = 8
    发现除了1 和2 剩下的规律就是前面两个相加 于是有了这样的公式
    f(n) = f(n-1) + f(n-2)
    代码实现如下:
class Solution {public int climbStairs(int n) {if(n==1){return 1;}if(n== 2){return 2;}return climbStairs(n-1) + climbStairs(n-2);}
}

在LeetCode 提交
哈哈
可以看到超時了,看来代码么问题但是性能存在问题,问题根源就在于每次都是重新计算。如何不重新计算就是使用空间换区时间思路,把每次记录存储下来,不需要重新计算。

思路二

代码实现

public int climbStairs(int n) {int[] s = new int[n];return getValue(0,n,s);}private int getValue(int i, int n, int[] s) {if (i > n) {return 0;}if (n == i) {return 1;}if (s[i] > 0) {return s[i];}s[i] = getValue(i + 1,n,s) + getValue(i + 2,n,s);return s[i];}

提交后如图,显示通过
在这里插入图片描述
后来又觉得不够优雅 代码质量差,还是用到递归了,在想想是否可以 不使用递归呢?同时又可以使用空间换去时间,不用重复计算。使用循环赋值实现即可

思路三

代码如下

 public int climbStairs(int n) {if(n == 1){return 1;}int[] s = new int[n+1];s[1] = 1;s[2] = 2;for(int i =3;i <= n; i++){s[i] = s[i-1] + s[i-2];}return s[n];}

在这里插入图片描述
可以看到使用的内存相比第二思路有较少了。

思路四

网上参考网友思路看到另一种解法,使用局部变量存储值 实现如下

 public int climbStairs(int n) {if (n == 1) {return 1;}if (n == 2) {return 2;}int a = 1;int b = 2;int sum = 0;for (int i = 3; i <= n; i++) {sum =  a;a = b;sum = sum + a;b = sum;}return sum;}

在这里插入图片描述

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

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

相关文章

C++系列-第1章顺序结构-9-字符类型char

在线练习&#xff1a; http://noi.openjudge.cn/ https://www.luogu.com.cn/ 总结 本文是C系列博客&#xff0c;主要讲述字符类型char 字符类型char 在C编程语言中&#xff0c;char是一种基本的数据类型&#xff0c;它用于存储单个字符。字符可以是字母、数字、标点符号或者…

简单的推箱子游戏实战

目录 项目分析 地图初始化 背景图片 游戏场景图片: 热键控制 按键设置 确定人物位置 实现人物移动(非箱子,目的地) 推箱子控制 游戏结束 最终代码 合法性判断: 项目分析 墙:0,地板:1,箱子目的地:2,小人:3,箱子:4,箱子命中目标:5 地图初始化 背景图片 #include <…

基于SkyEye仿真飞腾处理器:运行U-Boot并加载Phytium-FreeRTOS

仿真平台在帮助提升研发效率、加快产品面市时间上的作用已得到诸多验证&#xff0c;通过对处理器进行仿真来支持嵌入式系统及软件的虚拟化开发、测试和验证成为目前应用较为广泛的方法。天目全数字实时仿真软件SkyEye是一款基于可视化建模的硬件行为级仿真平台&#xff0c;在众…

leetcode:1736. 替换隐藏数字得到的最晚时间(python3解法)

难度&#xff1a;简单 给你一个字符串 time &#xff0c;格式为 hh:mm&#xff08;小时&#xff1a;分钟&#xff09;&#xff0c;其中某几位数字被隐藏&#xff08;用 ? 表示&#xff09;。 有效的时间为 00:00 到 23:59 之间的所有时间&#xff0c;包括 00:00 和 23:59 。 …

selenium处理下拉框

当想要爬取的数据由下拉框来选择时&#xff0c;应该如何处理&#xff1f; 页面如下&#xff1a; 目的获得电影的详细信息&#xff0c;包括票房&#xff0c;上映日期等。 代码如下&#xff1a; from selenium import webdriver from selenium.webdriver.support.select impor…

C语言——大头记单词

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 每一发奋努力的背后&#xff0c;必有加…

Ubuntu18.04在线镜像仓库配置

在线镜像仓库 1、查操作系统版本 rootubuntu:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.5 LTS Release: 18.04 Codename: bionic 2、原文件备份 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 3、查…

【开源】基于JAVA语言的陕西非物质文化遗产网站

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 设计目标2.2 研究内容2.3 研究方法与过程2.3.1 系统设计2.3.2 查阅文献2.3.3 网站分析2.3.4 网站设计2.3.5 网站实现2.3.6 系统测试与效果分析 三、系统展示四、核心代码4.1 查询民间文学4.2 查询传统音乐4.3 增改传统舞…

零售EDI:Babylist EDI 项目案例

Babylist 与各种不同的品牌和零售商合作&#xff0c;包括婴儿用品、玩具、衣物和其他相关产品的制造商。用户可以在 Babylist 上浏览各种不同的产品&#xff0c;并根据自己的需求和喜好选择适合的项目。本文将为大家介绍对接Babylist 的EDI项目案例。 Babylist EDI 需求 传输协…

linux文件比较工具diff-关于参数-pN的设置方法

非纯文本文件比较可用cmp命令 第一&#xff1a;利用diff创建分析文件&#xff0c;处理补丁&#xff08;patch&#xff09;功能的文件 案例&#xff1a;多数用于同一软件的不同版本之间&#xff0c;比如比较配置文件和源文件的区别&#xff0c;生成补丁文件&#xff0c;执行更…

Midjourney网页版

引言 基于国外的api开发开发了一款网页版的midjourney&#xff0c;文末有链接 相关资源 Midjourney官方教学资料Midjourney官网discord官网B站学习资源推荐 账号注册 获取网络访问权限 使用Midjourney的前提是计算机有外网访问权限 此处推荐两款软件,lantern的优势是免费&…

windows vscode jsoncpp cmake c++ 构建项目

jsoncpp的编译和使用推荐文章&#xff1a;jsoncpp的编译和使用 | 爱编程的大丙 (subingwen.cn)https://www.subingwen.cn/cpp/jsoncpp/从这个链接下载jsoncpp-master&#xff1a;https://github.com/open-source-parsers/jsoncpp 可以把这个文件夹名字改成jsoncpp&#xff0c;…

LLM之LangChain(二)| LangChain中的Agent

在本文中&#xff0c;我们将讨论LangChain中的Agent及其各种类型。但在深入研究Agent之前&#xff0c;让我们先了解一下什么是LangChain和Agent。 一、什么是LangChain&#xff1f; LangChain是一种功能强大的自动化工具&#xff0c;可用于各种任务&#xff0c;它提供了可用于…

Cobalt: 我愿称之为IDEA最美配色☕️

先来个预览&#xff1a; Cobalt是为IntelliJ IDEA和Java语言优化的一个配色主题&#xff0c;以现代和科技感的蓝色为主。题主相信哪怕是一个简单的主题配色&#xff0c;都是可以给开发者们带来更有生产力、更舒适的创作心境。希望你会喜欢&#xff01; 另外Cobalt这个名字取自…

【开源】基于JAVA的教学资源共享平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课程资源模块2.4 课程作业模块2.5 课程评价模块 三、系统设计3.1 用例设计3.2 类图设计3.3 数据库设计3.3.1 课程档案表3.3.2 课程资源表3.3.3 课程作业表3.3.4 课程评价表 四、系统展…

04章【面向对象(上)】

文章目录 面向对象基本概念类与对象类和对象的定义格式对象与内存分析封装性构造方法this关键字值传递与引用传递对象的一对一关系static关键字main方法分析代码块单例设计模式对象数组与管理 面向对象基本概念 什么是面向对象&#xff1a; 面向对象是一种编程思想。面向对象…

经典ABR算法介绍:Pensieve (SIGCOMM ‘17) 原理及训练指南

文章目录 前言Pensieve原理*Pensieve重训练参考Oboe [SIGCOMM 18]Comyco [MM 19]Fugu [NSDI 20] A3C熵权重衰减思路实现 前言 Pensieve是DASH点播视频中最经典的ABR算法之一&#xff0c;也是机器学习类&#xff08;Learning-based&#xff09;ABR算法的代表性工作。Pensieve基…

母婴品牌找小红书达人卖货怎么做?

小红书母婴种草推广&#xff0c;就是品牌方找小红书上的达人进行产品体验和内容分享&#xff0c;从而达到卖货的目的&#xff0c;软广形式更容易被大众所接受&#xff0c;而且小红书平台上的宝妈用户群体都是有一定消费水平的一二线城市用户&#xff0c;所以这样就会形成一套完…

十一、常用API——正则表达式

目录 练习1&#xff1a; 正则表达式的作用 正则表达式 字符类&#xff08;只匹配一个字符&#xff09; 预定义字符&#xff08;只匹配一个字符&#xff09; 数量词 类 Pattern 正则表达式的构造摘要 反斜线、转义和引用 字符类 行结束符 组和捕获 Unicode 支持 与…

第3章 无监督学习与预处理

目录 1. 无监督学习的类型2. 无监督学习的挑战3. 预处理与缩放3.1 不同类型的预处理3.2 应用数据变换3.3 对训练数据和测试数据进行相同的缩放快捷方式与高效的替代方法 3.4 预处理对监督学习的作用 4. 降维、特征提取与流形学习4.1 主成分分析&#xff08;PCA&#xff09;4.1.…