1.斐波那契数
Leetcode 509;easy;
1,1,2,3,5,8,13…从第三项开始之后的每一项都是前两项的和。
递归有许多重复计算。
public int fib(int N) {
if (N < 1)
return 0;
if (N == 1)
return 1;
return fib(N - 1) + fib(N - 2);
}
非递归,效率高,面试官的挚爱。
public int fib(int N) {
if (N < 1)
return 0;
if (N == 1 || N == 2)
return 1;
int first = 0, second = 1, third = 1;
for (int i = 3; i <= N; i++) {
first = second + third;
third = second;
second = first;
}
return first;
}
利用矩阵乘法,解法时间复杂度为logN。
2.爬楼梯问题
Leetcode 70;easy;
爬楼梯一次可以爬一个台阶和两个台阶,现有n阶台阶,问总共有多少种方法?
爬到第N阶台阶的解法是:爬到N-1阶的解法+爬到N-2阶的解法。
和斐波那契解法类似,唯一不同之处在于初始值不同。
public int climbStairs(int n) {
if(n < 1)
return 0;
if (n == 2 || n == 1)
return n;
return climbStairs(n - 1) + climbStairs(n - 2);
}
面试官希望的解法:
public int climbStairs(int n) {
if(n < 1)
return 0;
if (n == 2 || n == 1)
return n;
int first = 0;
int second = 2;
int third = 1;
for (int i = 3; i <= n; i++) {
first = second + third;
third = second;
second = first;
}
return first;
}
3. 牛数量问题
程序员代码面试指南(第二版)
假设农场中成熟的母牛每年会生1头小母牛,并且永远不会死。第一年农场有1只成熟的母牛,从第二年开始,母牛开始生小母牛。每只小母牛3年之后成熟又可以生小母牛。给整数N,求出N年后牛的数量。
和斐波那契数字同样思路。返回结果为s(n - 1)+ s(n - 3)
package dynamicprogram;
public class Main奶牛数量问题 {
public static void main(String[] args) {
System.out.println(s1(6));
System.out.println(s2(6));
}
public static int s1(int n) {
if (n < 1)
return 0;
if (n <= 4)
return n;
return s1(n - 1) + s1(n - 3);
}
public static int s2(int n) {
if (n < 1)
return 0;
if (n <= 4)
return n;
int a = 1;
int b = 2;
int c = 3;
int d = 4;
int temp = 0;
for (int i = 5; i <= n; i++) {
temp = d + b;
a = b;
b = c;
c = d;
d = temp;
}
return temp;
}
}