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

news2024/12/23 4:27:43

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

题目

假设你正在爬楼梯。需要 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.coloradmin.cn/o/1395165.html

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

相关文章

IT大侦“碳”:Concept Luna向循环设计持续演进

IT大侦“碳”&#xff1a;Concept Luna向循环设计持续演进

【Docker】Docker镜像结构及自定义镜像,镜像上传仓库使用

一、引言 Docker镜像是一个只读的Docker容器模板&#xff0c;含有启动Docker容器所需的文件系统结构及其内容&#xff0c;因此是启动一个Docker容器的基础。镜像的结构原理图大致分为四层&#xff1a;共享的内核层、基础镜像层、定制镜像层、可写容器层。 共享的内核层&#xf…

【漏洞攻击之文件上传条件竞争】

漏洞攻击之文件上传条件竞争 wzsc_文件上传漏洞现象与分析思路编写攻击脚本和重放措施中国蚁剑拿flag wzsc_文件上传 漏洞现象与分析 只有一个upload前端标签元素&#xff0c;并且上传任意文件都会跳转到upload.php页面&#xff0c;判定是一个apache容器&#xff0c;开始扫描…

龙年-微信定制红包封面,送一波

龙年新年马上就要来临了&#xff0c;我定制两款红包封面&#xff0c;送给大家。这次是借助AI的能力&#xff0c;自己独立完成&#xff0c;这大概就是这波AI浪潮的魅力&#xff0c;人人皆可参与。 另外&#xff0c;微信平台也给我推送了自己的公众号创作回顾&#xff0c;没想到居…

Failed at the node sass@4.14.1 postinstall script.

首先&#xff0c;查看node和 npm版本 #用于列出已安装的 Node.js 版本。 nvm ls #切换node版本 nvm use 12.17.0 #换国内镜像源&#xff1a;&#xff08;单独设置sass的安装源。&#xff09; npm config set sass_binary_sitehttps://npm.taobao.org/mirrors/node-sass …

小白数学建模 Mathtype 7.7傻瓜式下载安装嵌入Word/WPS以及深度使用教程

数学建模Mathtype的下载安装嵌入Word/WPS以及深度使用教程 一 Mathtype 的下载安装1.1 安装前须知1.2 下载压缩包1.3 安装注册 二 嵌入Word/WPS2.1 嵌入Word2.1.1 加载项嵌入 Word2.1.2 宏录制嵌入 Word 2.2 嵌入 WPS2.2.1 加载项嵌入 WPS2.2.2 宏录制嵌入 WPS 2.3 嵌入时报错解…

AWS 专题学习 P5 (Classic SA、S3)

文章目录 Classic Solutions Architecture无状态 Web 应用程序&#xff1a;WhatIsTheTime.com背景 & 目标架构演进Well-Architected 5 pillars 有状态的 Web 应用程序&#xff1a;MyClothes.com背景 & 目标架构演进总结 有状态的 Web 应用程序&#xff1a;MyWordPress.…

经典数据库练习题及答案

数据表介绍 --1.学生表 Student(SId,Sname,Sage,Ssex) --SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 --2.课程表 Course(CId,Cname,TId) --CId 课程编号,Cname 课程名称,TId 教师编号 --3.教师表 Teacher(TId,Tname) --TId 教师编号,Tname 教师姓名 --4.成绩…

【EI会议征稿通知】第七届先进电子材料、计算机与软件工程国际学术会议(AEMCSE 2024)

第七届先进电子材料、计算机与软件工程国际学术会议(AEMCSE 2024&#xff09; 2024 7th International Conference on Advanced Electronic Materials, Computers and Software Engineering 第七届先进电子材料、计算机与软件工程国际学术会议(AEMCSE 2024)将于2024年5月10-1…

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、查…

汽车连接器接线端子和多芯线束连接界面

冷压接的开式压接和闭式压接以及热压接的超声波焊接对汽车连接器接线端子和多芯线束连接界面 连接器接线端子和多芯线束的连接是电子线束行业&#xff0c;特别是汽车行业常用的导线连接方式。汽车整车线束又由许多分支线束组成&#xff0c;而分支线束必须通过连接器实现连接&am…

医学图像的图像处理、分割、分类和定位-1

一、说明 本报告全面探讨了应用于医学图像的图像处理和分类技术。开展了四项不同的任务来展示这些方法的多功能性和有效性。任务 1 涉及读取、写入和显示 PNG、JPG 和 DICOM 图像。任务 2 涉及基于定向变化的多类图像分类。此外&#xff0c;我们在任务 3 中包括了胸部 X 光图像…

web前端项目-中国象棋【附源码】

中国象棋 【中国象棋】是一款历史悠久、深受人们喜爱的策略类游戏。在Web前端技术中&#xff0c;我们可以使用HTML、CSS和JavaScript等语言来制作一款中国象棋游戏。玩家使用棋子&#xff08;帅/相/士/炮/马/车/炮/卒&#xff09;在棋盘上相互对弈&#xff0c;将对手的“帅”棋…

GIS复试Tips(特别是南师大)

注&#xff1a;本文仅个人观点&#xff0c;仅供参考 在这提前㊗️24年考南师大GISer成功上岸&#xff01; 当然&#xff0c;考研是个考试&#xff0c;总有人顺利上岸&#xff0c;稳上岸或逆袭上岸&#xff0c;但可能也有人被刷&#xff0c;这是常态。 所以&#xff0c;㊗️你…

Linux网络编程(二-套接字)

目录 一、背景知识 1.1 端口号 1.2 网络字节序 1.3 地址转换函数 二、Socket简介 三、套接字相关的函数 3.1 socket() 3.2 bind() 3.3 connect() 3.4 listen() 3.5 accept() 3.6 read()/recv()/recvfrom() 3.7 send()/sendto() 3.8 close() 四、UPD客服/服务端实…

我用 ChatGPT 做了一次探索性数据分析,真的太太太实用了!

ChatGPT 经过短短1年时间的发展&#xff0c;其功能越来越强&#xff0c;现在已经是大多数企业和个人不可或缺的助手。特别是最新的 GPT-4 版本&#xff0c;专门在左边菜单栏给出了两个工具&#xff08;一个是数据分析&#xff0c;另一个是根据文字描述生成图片&#xff09;&…

1.12号网络

1 网络发展历史 1.1 APRAnet阶段 阿帕网&#xff0c;是Interne的最早雏形 不能互联不同类型的计算机和不同类型的操作系统 没有纠错功能 1.2 TCP/IP两个协议阶段 什么是协议 在计算机网络中&#xff0c;要做到有条不紊的交换数据&#xff0c;需要遵循一些事先约定好的规则…

(2023版)斯坦福CS231n学习笔记:DL与CV教程 (12) | 视觉模型可视化与可解释性(Visualizing and Understanding)

前言 &#x1f4da; 笔记专栏&#xff1a;斯坦福CS231N&#xff1a;面向视觉识别的卷积神经网络&#xff08;23&#xff09;&#x1f517; 课程链接&#xff1a;https://www.bilibili.com/video/BV1xV411R7i5&#x1f4bb; CS231n: 深度学习计算机视觉&#xff08;2017&#xf…

Xline v0.6.1: 一个用于元数据管理的分布式KV存储

Xline是什么&#xff1f;我们为什么要做Xline&#xff1f; Xline是一个基于Curp协议的&#xff0c;用于管理元数据的分布式KV存储。现有的分布式KV存储大多采用Raft共识协议&#xff0c;需要两次RTT才能完成一次请求。当部署在单个数据中心时&#xff0c;节点之间的延迟较低&a…

将AI的潜能转化为人类的福祉

在这个技术迅速发展的时代&#xff0c;AI不仅是一项突破性的技术&#xff0c;更是人类未来的关键。作为一名AI训练师&#xff0c;我的目标不仅仅是开发先进的AI产品&#xff0c;更重要的是让这些产品服务于人类&#xff0c;改善人们的生活。 我相信&#xff0c;AI的真正价值在于…