首页 > 其他分享 >Leetcode刷题70.爬楼梯

Leetcode刷题70.爬楼梯

时间:2023-09-17 18:44:38浏览次数:28  
标签:return storeMap int public result climbStairs 70 Leetcode 刷题

题目:假设你正在爬楼梯。需要 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 阶

提示:

  • 1 <= n <= 45

解答:

如图所示:

走第一步需要思考一个问题是一次走两个楼梯,还是一次走一个楼梯,之后的每一步都是这样思考,所以说这是一个典型的递归问题。

遇到递归先考虑终止条件;本题的终止条件就在走后一步的走法,是以一个楼梯结尾还是一两个楼梯结尾;

说以答案非常简单只有三行代码

 

public int climbStairs(int n){
      if (n==1) return 1;
      if (n==2) return 2;
    return=climbStairs(n-1)+climbStairs(n-2);
}

但是这个方法的实现的时间复杂度比较大,因为在递归的时候重复计算非常多,比如:要求f(5)必须要知道f(4)+f(3),而要求f(4)就必须知道f(3)+f(2),在这里f(3)就求了两次。所以我们要对代码进行优化。

我们可以创建一个HsahMap每求出一个值就把它保存到这个HsahMap中这样在下次用的时候就可以避免重复计算。

代码如下:

 

 

public class Solution {
private Map<Integer,Integer> storeMap = new HashMap<>();
public int climbStairs(int n){
if (n==1) return 1;
if (n==2) return 2;
if (null!=storeMap.get(n))
return storeMap.get(n);
else {
int result =climbStairs(n-1)+climbStairs(n-2);
storeMap.put(n,result);
return result;
}
}
}

 

时间复杂度为O(n)

除了递归的方法我们还可以用循环的方法来解决,既然从上往下会造成重复计算那么我们就从下往上来循环。这样也可以规避重复计算的问题。

代码如下:

 

 

public class Solution {//循环的解法,自底向上累加
       public int climbStairs(int n){
           if(n==1)return 1;
           if(n==2)return 2;
           int result=0;
           int pre = 2;
           int prPre =1;
           for(int i=3 ;i<=n;++i){
               result =pre +prPre;
               prPre=pre;
               pre=result;
           }
           return result;
       }
}

 

2023/9/17

 

 

标签:return,storeMap,int,public,result,climbStairs,70,Leetcode,刷题
From: https://www.cnblogs.com/buguniaogugu/p/17709434.html

相关文章

  • leetcode71. 简化路径
     classSolution:defsimplifyPath(self,path:str)->str:li=path.split("/")res=[]foriinli:ifi=='..'andres:res.pop()ifi!='.'andi!='......
  • 算法训练day10 LeetCode 232
    算法训练day10:LeetCode232.225.232.用栈实现队列题目232.用栈实现队列-力扣(LeetCode)题解代码随想录(programmercarl.com)classMyQueue{public:stack<int>stIn;stack<int>stOut;MyQueue(){}voidpush(intx){......
  • 刷题记录(八)
    buuctf-OnePointerPHP题目给了源码:add_api.php:<?phpinclude"user.php";if($user=unserialize($_COOKIE["data"])){ $count[++$user->count]=1; if($count[]=1){ $user->count+=1; setcookie("data",serialize($user)); }el......
  • CTF BugKu平台——Crypto篇刷题记录(后续更新)
    (CTFBugKu平台——Crypto篇)前言记录一下密码学的刷题记录也是为了更好的巩固自己基本有的解码都附有超链接希望大家能顺利通关感谢观看!抄错的字符:描述:老师让小明抄写一段话,结果粗心的小明把部分数字抄成了字母,还因为强迫症把所有字母都换成大写。你能帮小明恢复并......
  • 70-函数也是对象-内存分析
         ......
  • leetcode 加油站——一次遍历
     classSolution:defcanCompleteCircuit(self,gas:List[int],cost:List[int])->int:n=len(gas)max_gas=0rest=0records=[]start=0foriinrange(n):tmp=gas[i]-cost[i]re......
  • 【LeetCode】删除数对后的最小数组长度
    题目给你一个下标从0开始的非递减整数数组nums。你可以执行以下操作任意次:选择两个下标i和j,满足i<j且nums[i]<nums[j]。将nums中下标在i和j处的元素删除。剩余元素按照原来的顺序组成新的数组,下标也重新从0开始编号。请你返回一个整数,表示执行......
  • leetcode 二叉树的最小深度
    给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。示例1:输入:root=[3,9,20,null,null,15,7]输出:2示例2:输入:root=[2,null,3,null,4,null,5,null,6]输出:5解题思路如果当前节点为null,返......
  • Sketch下载 - Sketch 70.3 官方最新版下载 各个版本下载
    Sketch是一款适用于所有设计师的矢量绘图应用。矢量绘图也是目前进行网页,图标以及界面设计的最好方式。但除了矢量编辑的功能之外,我们同样添加了一些基本的位图工具,比如模糊和色彩校正。我们尽力让Sketch容易理解并上手简单,有经验的设计师花上几个小时便能将自己的设计技巧在Sket......
  • leetcode 平衡二叉树
    给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。示例1:输入:root=[3,9,20,null,null,15,7]输出:true示例2:输入:root=[1,2,2,3,3,null,null,4,4]输出:false示例3:输入:root......