1.斐波那契数列
斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n ,请计算 F(n) 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/fibonacci-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public int fib(int n) {
if(n==0){
return 0;
}
if(n==1){
return 1;
}
return fib(n-1)+fib(n-2);
}
}
使用递归,计算会产生很多多余的计算,比如计算fib(7),会计算fib(6)和fib(5),而fib(6)又会去计算fib(5).
使用一个数组存储计算结果,其中dp[i]表示第i项
class Solution {
public int fib(int n) {
/*if(n==0){
return 0;
}
if(n==1){
return 1;
}
return fib(n-1)+fib(n-2);*/
//如果n=4,因为是从0开始,那么数组中应该有5个数据
int[] dp = new int[n+1];
dp[0] = 0;
dp[1] = 1;
for(int i=2;i<=n;i++){
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
}
也可以不用数组
class Solution {
public int fib(int n) {
if(n==0){
return 0;
}
if(n==1){
return 1;
}
//return fib(n-1)+fib(n-2);
//如果n=4,因为是从0开始,那么数组中应该有5个数据
/*int[] dp = new int[n+1];
dp[0] = 0;
dp[1] = 1;
for(int i=2;i<=n;i++){
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];*/
int a=0,b=1,c=1; //分别代表第一项、第二项、结果
for(int i=3;i<=n;i++){
a = b;
b = c;
c = a+b;
}
return c;
}
}
2. 不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/unique-paths
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
/**
初始化dp[i][j] 数组
dp[i][j]代表走到第i行第j列的路径,因为只能向下或者向右
那么对于每个格子来说,它的值只与它的上方格子个左边格子的值有关
那么:
1. i=0,j>0 时:dp[0][...] = 1
2. i>0,j=0 时:dp[...][0] = 1
3. i>0,j>0 时:dp[i][j] = dp[i-1][j]+dp[i][j-1]
*/
public int uniquePaths(int m, int n) {
//初始化dp数组
int[][] dp = new int[m][n];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(i==0){
dp[i][j] = 1;
}else if(j==0){
dp[i][j] = 1;
}else{
//进行状态转移
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
}
return dp[m-1][n-1];
}
}