70. Climbing Stairs

输入:台阶数量n
输出:有多少种走法
规则:每次可以上一个台阶或者两个台阶
分析:想明白一件事情。如果现在在第k个台阶,那下一步可以到达第k+1个台阶,或者第k+2个台阶。换句话说想要到达第k个台阶,可以通过第k-1或者第k-2个台阶达到。所以第k个台阶的走法=第k-1个台阶的走法+第k-2个台阶的走法。

再用比较小的数检测一下对不对。
如果有1个台阶,有1种走法:1。
如果有2个台阶,有2种走法:1,1;2。
如果有3个台阶,可以从第2个台阶,再走1个到达3,也可以从第1个台阶,再走2个到达3。所以nums[3]=nums[2]+nums[1]=2+1=3。实际上也是:1,1,1;2,1;1,2;。
如果有4个台阶,可以从第3个台阶,再走1个到达4,也可以从第2个台阶,再走2个到达4。所以nums[4]=nums[3]+nums[2]=3+2=5。实际走法:1,1,1,1;2,1,1;1,2,1(从第3个台阶 )
1,1,2;2,2(从第2个台阶 )
验证正确。可以编码了。

以下代码从回溯、备忘录模式、动态规划、节省空间版的动态规划。不做详细介绍,直接看代码。

/*** 暴力* @param n* @return*/public int climbStairs(int n) {if(n==0) return 0;if(n==1) return 1;if(n==2) return 2;return climbStairs(n-1)+climbStairs(n-2);}/*** 备忘录模式* @param n* @return*/public int climbStairsV2(int n) {int[] memo = new int[n+1];climbStairs(n,memo);return memo[n];}private int climbStairs(int n,int[] memo){if(n==0) return 0;if(memo[n]>0) return memo[n];if(n<=2){memo[n]=n;return memo[n];}memo[n] = climbStairs(n-1,memo)+climbStairs(n-2,memo);return memo[n];}/*** 动态规划:自底向上* @param n* @return*/public int climbStairsV3(int n) {if(n==1) return 1;int[] dp = new int[n+1];dp[1]=1;dp[2]=2;for(int i=3;i<=n;i++){dp[i]=dp[i-1]+dp[i-2];}return dp[n];}/*** 节省内存的动态规划,但实际LeetCode反馈出来的内存并不少* @param n* @return*/public int climbStairsV4(int n) {if(n==1) return 1;int num1 =1;int num2 =2;int num3=0;for(int i=3;i<=n;i++){num3=num1+num2;num1=num2;num2=num3;}return num2;}

还有第五种解法,利用矩阵乘法。先看菲波那切数列中:0,1,1,2,5,8…
我们利用以下公式:
[FnFn−1Fn−1Fn−2]=[1110]n−1\left[ \begin{matrix} F_{n} &amp; F_{n-1} \\ F_{n-1} &amp; F_{n-2} \end{matrix} \right] =\left[ \begin{matrix} 1 &amp; 1 \\ 1 &amp; 0 \end{matrix} \right] ^{n-1}[FnFn1Fn1Fn2]=[1110]n1
可以求得第n个斐波那契数列的值。使用数学归纳法证明。
我们当前题目与斐波那契数列的不同是起始值不同,我们的序列是:0,1,2,3,5,8,13…所以我们求第n个值使用的公式是:

[FnFn−1Fn−1Fn−2]=[2110]∗[1110]n−2(n&gt;1)\left[ \begin{matrix} F_{n} &amp; F_{n-1} \\ F_{n-1} &amp; F_{n-2} \end{matrix} \right] =\left[ \begin{matrix} 2 &amp; 1 \\ 1 &amp; 0 \end{matrix} \right]*\left[ \begin{matrix} 1 &amp; 1 \\ 1 &amp; 0 \end{matrix} \right] ^{n-2}(n&gt;1)[FnFn1Fn1Fn2]=[2110][1110]n2(n>1)

我们看到两个公式不一样的地方是初始化值不同。

public int climbStairsV5(int n) {if(n<=2) return n;int[][] q = {{1,1},{1,0}};int[][] p = {{2,1},{1,0}};int[][] res = pow(q,n-2);res = multiply(p,res);return res[0][0];}private int[][] pow(int[][] a,int n){if(n<=1){return a;}a = pow(a,n/2);a = multiply(a,a);if(n%2!=0){int[][] ret = {{1,1},{1,0}};a = multiply(ret,a);}return a;}private int[][] multiply(int[][] a, int[][] b) {int[][] c = new int[2][2];c[0][0] = a[0][0]*b[0][0]+a[0][1]*b[1][0];c[0][1] = a[0][0]*b[0][1] + a[0][1]*b[1][1];c[1][0] = a[1][0] * b[0][0]+a[1][1]*b[1][0];c[1][1] = a[1][0]*b[0][1]+a[1][1]*b[1][1];return c;}

代码添加链接描述

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

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

相关文章

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第39篇]侧信道攻击和故障攻击有什么区别

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 侧信道攻击(Side-channel attacks, SCA)是一类攻击者尝试通过观察侧信道泄露来推测目标计算的信息。&#x…

面向对象:包装类、对象处理、类成员

包装类 Java是面向对象编程语言&#xff0c;但也包含了八种基本的数据类型&#xff0c;这八种基本的数据类型不支持面向对象的编程机制&#xff0c;基本的数据类型也不具备对象的特性&#xff1a;没有成员变量、方法被调用。所有类型的变量都继承Object类&#xff0c;都可以当成…

mysql-安装报错计算机中丢失MSVCR100.dll文件丢失

https://blog.csdn.net/weirdo_world/article/details/82393330

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]40一般来说SPA和DPA的区别是什么

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 电磁(Electronmagnetic, EM)功率分析攻击被划分成两种类型的攻击&#xff0c;简单功率分析(SPA)或者差分功率…

LDAP入门

LDAP入门 首先要先理解什么是LDAP&#xff0c;当时我看了很多解释&#xff0c;也是云里雾里&#xff0c;弄不清楚。在这里给大家稍微捋一捋。首先LDAP是一种通讯协议&#xff0c;LDAP支持TCP/IP。协议就是标准&#xff0c;并且是抽象的。在这套标准下&#xff0c;AD&#xff08…

关于Java中的HashMap

1 容量总是2次幂 /*** Returns a power of two size for the given target capacity.*/static final int tableSizeFor(int cap) {int n cap - 1;n | n >>> 1;n | n >>> 2;n | n >>> 4;n | n >>> 8;n | n >>> 16;return (n <…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]41所有的侧信道分析都是能量分析吗

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 侧信道攻击(SCA)利用在密码算法的物理实现上下文中获得的信息&#xff0c;而不是针对理论弱点的经典密码分析…

spring学习(22):分层架构

pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 …

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]42蒙哥马利乘法,哪里泄漏侧信道路吗?

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 看看你的C代码为蒙哥马利乘法&#xff0c;你能确定它可能在哪里泄漏侧信道路吗? 几个月前(回到3月份)&…

spring学习(23):基础组件

Spring中的Component是一个通用注解&#xff0c;可用于任何bean对象&#xff0c;还可以细分为&#xff1a;Repository、Service、Controller&#xff0c;分别对应于DAO类&#xff08;持久层&#xff09;、Service类&#xff08;服务层&#xff09;、Controller&#xff08;控制…

Golang tcp转发 remoteAddr错误

Golang tcp 转发 第一版本 accept获取的Conn里的localAddr做为源地址&#xff0c;remoteAddr来做为目的地址 // tcpForward package mainimport ("fmt""net""os" )func TcpForward(port int) {lisPort : fmt.Sprint(":", port)listen,…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]43 为AES 对抗侧信道攻击的防御

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 为AES描述一些基础的&#xff08;可能无效&#xff09;的对抗侧信道攻击的防御 侧信道防御&#xff1a;为什…

深度学习02——Softmax、DNN、WideDeep Model

说明&#xff1a;本系列是七月算法深度学习课程的学习笔记 1 背景介绍 深度学习在图片上的应用&#xff1a;功能上讲&#xff1a;图像分类和物体识别&#xff1b;应用上&#xff1a;可以用来分类图片&#xff1a;白菜形状的玉器摆件、白菜、大白菜&#xff1b;图片搜索&#…

扩展 KMP(模板) 洛谷P5410

题目&#xff1a;https://www.luogu.org/problemnew/show/P5410 博客 #include<bits/stdc.h>using namespace std;#define ll long long #define mem(a,b) memset(a,b,sizeof(a)) #define inf 0x3f3f3f3fconst int maxn1e510;int nxt[maxn],extend[maxn];int q;string s,…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]44在ECC密码学方案中基本的防御方法

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 在ECC密码学方案中&#xff0c;描述一些基本的防御方法 在上篇文章中我们提到了在ECC中对抗侧信道攻击的一…

第六十五期:央行万字工作论文:区块链能做什么、不能做什么?

本文从经济学角度研究了区块链的功能。首先&#xff0c;在给出区块链技术的经济学解释的基础上&#xff0c;归纳出目前主流区块链系统采取的“Token 范式”&#xff0c;厘清与区块链有关的共识和信任这两个基础概念&#xff0c;并梳理智能合约的功能。 作者&#xff1a;徐忠 邹…

[dp]leetcode 198. House Robber

输入&#xff1a;一个数组nums&#xff0c;每一个元素nums[i]表示第i个房间的价值。 输出&#xff1a;一个抢劫犯能抢到又不会被警察发现的最大价值。 规则&#xff1a;如果抢劫犯抢了相邻房间&#xff0c;那么报警装置就会触发&#xff0c;警察会得到通知。 分析&#xff1a;我…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]45.描述一些对抗RSA侧信道攻击的防御方法

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 为了让这篇文章保持简单&#xff0c;我们将会我们将讨论所谓的“香草”RSA(在加密中不使用随机性)&#xff…

第六十六期:运维专家写给运维工程师的6条人生忠告

最近由于新公司需要招聘运维人员&#xff0c;所以接触了大量应聘者&#xff0c;基本都是85后的年轻人。在他们身上看到年轻的活力&#xff0c;也看到浮躁社会留下的烙印。作为一个奔5的老IT运维人员&#xff0c;真心希望他们少走自己的弯路&#xff0c;能够成就自己的一番事业&…

深度学习03——CNN

说明&#xff1a;本系列是七月算法深度学习课程的学习笔记 文章目录1神经网络与卷积神经网络1.1 深度神经网络适合计算机视觉处理吗1.2CNN的结构1.2.1 数据输入层1.2.2 卷积层1.2.3 激励层1.2.3 池化层1.2.4 全连接层1.3CNN的训练算法1.4CNN的优缺点2正则化与Droupout3典型结构…