斐波那契数问题

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;
	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值