开宗明义:本系列基于牛客网剑指offer,刷题小白,一天两道我快乐!旨在理解和交流,重在记录,望各位大牛指点!
牛客网-剑指offer
1、递归和循坏–菲波那契数列
描述:输入一个整数n,输出菲波那契数列的第 n n n 项(从0开始,第0项为0)。
斐波那契数列:1、1、2、3、5、8、13、21、34、……在数学上,以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)。
思路:迭代法,很简单,只需要知道菲波那契数列的迭代公式。
测试代码:
class Solution {
public:
int Fibonacci(int n) {
int first = 0;
int second = 1;
int result = n;
for (int i = 2; i <= n; i++) {
result = first + second;
first = second;
second = result;
}
return result;
}
};
2、动态规划-跳台阶
描述:一只青蛙一次可以跳上1级台阶,也可以跳上2阶。求该青蛙跳上一个n级台阶总共需要多少种跳法(先后次序不同算不同的结果)。
思路:
- 如果台阶是1阶,那么 f ( 1 ) = 1 f(1)=1 f(1)=1;
- 如果台阶两阶,那么 f ( 2 ) = 1 + 1 = 2 f(2)=1+1=2 f(2)=1+1=2;
- 那么 f ( n ) = f ( n − 1 ) + f ( n − 2 ) f(n)=f(n-1)+f(n-2) f(n)=f(n−1)+f(n−2);
测试代码:
class Solution {
public:
int jumpFloor(int n) {
//
if (n == 1) {
return 1;
}
//
if (n == 2) {
return 2;
}
//
int m1 = 1;
int m2 = 2;
while (n > 2) {//这边饶人
m2 = m2 + m1;//f(n)=f(n-1)+f(n-2)
m1 = m2 - m1;//这边是更新f(n-2)
n--;
}
return m2;
}
};