牛客网-剑指offer

该部分主要是对递归的一个应用,同样也可以作为动态规划的基础题目去思考。

1、跳台阶

/** 
 * 
 * @author 崔洪振367
 * @version 创建时间:2017年6月28日 下午9:24:40 
 */
public class 跳台阶 {
	public int JumpFloor(int target) {
		if(target == 1){
			return 1;
		}
		
		if(target ==0){
			return 0;
		}
		
		if(target == 2){
			return 2;
		}
		
		return JumpFloor(target-1) + JumpFloor(target-2);
    }

}

2、斐波那契数列

/**
 * 
 * @author 崔洪振367
 * @version 创建时间:2017年6月28日 下午9:11:03
 */
public class 斐波那契数列 {
//	public int Fibonacci(int n) {
//
//		// 利用递归来实现
//		if (n <= 0) {
//			return 0;
//		}
//
//		if (n == 1) {
//			return 1;
//		}
//		return Fibonacci(n - 1) + Fibonacci(n - 2);
//
//	}

	public int Fibonacci2(int n) {

		// 利用循环来实现
		if(n <=0){
			return 0;
		}
		
		if(n == 1){
			return 1;
		}
		
		int a = 0; 
		int b = 1;
		int sum = 0;
		for(int i=2; i<=n; i++){
			sum = a+b;
			a = b;
			b = sum;
		}

		return sum;
	}

}

3、变态跳台阶

/**
 * 
 * @author 崔洪振367
 * @version 创建时间:2017年6月29日 下午3:38:16
 */
public class 变态跳台阶 {
	
	//通过递归来实现变态跳台阶
	public int JumpFloorII(int target) {
		if(target == 0){
			return 1;
		}
		
		if(target == 1){
			return 1;
		}
		return 2*JumpFloorII(target-1);
	}
	
//	//可以通过迭代来实现变态跳台阶
//	public int JumpFloorII1(int target){
//		if(target == 0) {
//            return 0;
//        }
//         
//        int[] dp = new int[target + 1];
//        dp[0] = 1;
//        dp[1] = 1;
//         
//        for(int i = 2;i <= target;i++) {
//            dp[i] = 0;
//            for(int j = 0;j < i;j++) {
//                dp[i] += dp[j];
//            }
//        }
//         
//        return dp[target];
//	}

}

4、矩形覆盖

解决此题的思路:可以试着找出1-4之间的覆盖情况,然后可以发现:后一个覆盖情况是前两个覆盖情况的变种。在前一种覆盖方式和一个2*1的组合。

package 剑指offer;

/**
 * 
 * @author 崔洪振367
 * @version 创建时间:2017年6月29日 下午4:05:19
 */
public class 矩形覆盖 {

	//我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。
	//请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
	public int RectCover(int target) {
		if(target == 0){
			return 0;
		}
		
		if(target == 1 || target == 2){
			return target;
		}
		return RectCover(target-1) + RectCover(target-2);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值