20.Climbing Stairs

You are climbing a stair case. It takes n steps to reach to the top.

Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

分析:f(n)=f(n-1)+f(n-2)。

方法一:看到这题目之后第一反应是用递归的方法做。

      /**
	 * 递归的思想做f(n)=f(n-1)+f(n-2),理论对,但是超时。 
	 */
	public int climbStairs(int n) {
		if (n == 0 || n == 1) {
			return 1;
		} else if (n == 2) {
			return 2;
		} else {
			return climbStairs(n - 1) + climbStairs(n - 2);
		}
	}
方法二:递归的思想做。
但是提交方法一之后,运行超时。继续分析发现,可以采用动态规划的思想做,用数组保存f[1..n]的值。

       /**
	 * 动态规划的思想:用s[i]记录阶梯有i+1层时走的方法,避免重复计算。使用递归重复计算的话很容易时间超时,所以采用动态规划的思想做。
	 * 对数组s来说,当求s[i]的时候其之前元素都已知。所以只需要s[i]=s[i-1]+s[i-2]即可。
	 */
	public int climbStairs2(int n) {
		if (n == 0 || n == 1) {
			return 1;
		} else if (n == 2) {
			return 2;
		} else {
			int s[] = new int[n];
			s[0] = 1;
			s[1] = 2;
			for (int i = 2; i < n; i++) {
				s[i] = s[i - 1] + s[i - 2];
			}
			return s[n - 1];
		}
	}


方法三:方法二中已经极大的提高了计算效率,但是保存一个数组是没有必要的,只需要保存三个值就好了。计算第i个只需要知道i-1和i-2对应的值就好了。

      /**
	 * 调整方法2中的数组表示的方法,只用三个值来表示,f3 = f1 + f2。
	 * f1表示比f3差两个台阶的可上方法数量,f2表示比f3差一个台阶的可上方法数。
	 */
	public int climbStairs3(int n) {
		if (n == 0 || n == 1) {
			return 1;
		} else {
			int f1 = 1;
			int f2 = 1;
			int f3 = 0;
			for (int i = 2; i <= n; i++) {
				f3 = f1 + f2;
				f1 = f2;
				f2 = f3;
			}
			return f3;
		}
	}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值