剑指offer之变态跳台阶
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
问题分析:此题为跳台阶的进阶版,但思考方式其实类似。当站在第n级台阶上,那么可能从n-1,n-2…1,0开始跳,所以我们只需要将所有可能性相加。f(n)表示第n级的跳法,那么f(n)=f(n-1)+f(n-2)+…+f(1)+f(0)。初始条件仍然不变。只需要在做加法时,加上后面的可能性。
具体实现:
import java.util.ArrayList;
public class Solution {
public int JumpFloorII(int target) {
ArrayList<Integer> list = new ArrayList<>();
if(target <= 1){
return 1;
}
list.add(1);
list.add(1);
for(int i = 2; i <= target; i++){
int sum = 0;
for(int j = 1; j < i+1; j++){
sum +=list.get(i-j);
}
list.add(sum);
}
return list.get(target);
}
}
但在看过牛客上大佬的解法后,发现上述方法时间复杂度较高,为n的2次方。
所以其实可以进行优化:
我们可以看到f(n-1)=f(n-2)+f(n-3)+…+f(1)+f(0);
f(n)=f(n-1)+f(n-2)+f(n-3)+…+f(1)+f(0);
上面两式我们可以看出来f(n)=f(n-1)+f(n-1)=2*f(n-1);
所以我们还可以简化过程,实现如下:
public class Solution {
public int JumpFloorII(int target) {
if(target <= 1){
return 1;
}
int a = 1,b = 0;
for(int i = 2; i <= target; i++){
b = a << 1;//口诀:左移乘2,右移除2
a = b;
}
return b;
}
}