此专栏就会写一些leetcode上面的算法题,放上一些自己的理解。
1.70. 爬楼梯爬楼梯
题目:
假设你正在爬楼梯。需要 n
阶你才能到达楼顶。
每次你可以爬 1
或 2
个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例1:
输入:n = 2 输出:2
示例2:
输入:n = 3 输出:3
分析:此题很明显就是动态规划问题,于是我们可以将它分为两个问题,爬楼梯的数量可以分为两个部分,第一个部分为只剩一阶的方法(n-1),第二个部分为只剩两阶的方法(n-2),所以总数=(n-1)+(n-2),然后因为已知0和1阶的时候方法为1,这样就可以优化算法,得到以下代码。
class Solution {
public int climbStairs(int n) {
int[] p=new int[n+1];
p[0]=1;
p[1]=1;
for(int i=2;i<=n;i++){
p[i]=p[i-1]+p[i-2];
}
return p[n];
}
}
此题其实也就是斐波那契数列,还可以使用公式解决(虽然我背不下来):
class Solution {
public int climbStairs(int n) {
double sqrt_5 = Math.sqrt(5);
double fib_n = Math.pow((1 + sqrt_5) / 2, n + 1) - Math.pow((1 - sqrt_5) / 2,n + 1);
return (int)(fib_n / sqrt_5);
}
}
作者:guanpengchn
链接:https://leetcode.cn/problems/climbing-stairs/solution/hua-jie-suan-fa-70-pa-lou-ti-by-guanpengchn/
2.509. 斐波那契数斐波那契数
题目:
斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n ,请计算 F(n) 。
分析:很容易知道,F(n)=F(n−1)+F(n−2),所以我们直接根据已知的F(0) = 0,F(1) = 1,就直接可以写出代码。
class Solution {
public int fib(int n) {
int a=0;
if(n<2){
a=n;
}else{
a=fib(n-1)+fib(n-2);
}
return a;
}
}
但是,显而易见,这样时间复杂度,空间复杂度很高:
所以,我们应该要将代码优化:
class Solution {
public int fib(int n) {
int m=0;
int a=0,b=0,c=1;
if (n<2){
m=n;
}else{
for (int i = 2; i <= n; i++) {
a=b;
b=c;
c=a+b;
}
m=c;
}
return m;
}
}
最终:
题目:
泰波那契序列 Tn 定义如下:
T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2
给你整数 n,请返回第 n 个泰波那契数 Tn 的值。
分析:此题和上面第二题类似,只是刚刚是F(n)=F(n−1)+F(n−2),现在需要F(n)=F(n−1)+F(n−2)+...+F(1)+F(0);但是,思想是一样的,代码:
class Solution {
public int tribonacci(int n) {
if (n ==0) {
return 0;
}
if (n <=2) {
return 1;
}
int a=0,b=0,c=1,d=1;
for (int i = 3; i <=n; i++) {
a=b;
b=c;
c=d;
d=a+b+c;
}
return d;
}
}