思路:
如果只有1 級(jí)臺(tái)階麻敌,只有一種跳法;
如果有2 級(jí)臺(tái)階掂摔,那就有兩種跳的方法了:一種是分兩次跳术羔,每次跳1 級(jí)赢赊;另外一種就是一次跳2 級(jí)。
如果有3級(jí)臺(tái)階级历,那就有4種跳的方法:一種是分3次跳释移,每次跳1級(jí);另一種是一次跳1級(jí)寥殖,一次跳2級(jí)(調(diào)換過來也是一種)玩讳;另一種是一次就跳3級(jí);-
一般情況:把n 級(jí)臺(tái)階時(shí)的跳法看成是n 的函數(shù)嚼贡,記為f(n)熏纯。
當(dāng)n>3 時(shí),第一次跳的時(shí)候就有3種不同的選擇:- 一種是第一次只跳1 級(jí)粤策,此時(shí)跳法數(shù)目等于后面剩下的n-1 級(jí)臺(tái)階的跳法數(shù)目樟澜,即為f(n-1);
- 另外一種選擇是第一次跳2 級(jí)叮盘,此時(shí)跳法數(shù)目等于后面剩下的n-2 級(jí)臺(tái)階的跳法數(shù)目往扔,即為f(n-2);
- 另外一種選擇是第一次跳3 級(jí),此時(shí)跳法數(shù)目等于后面剩下的n-3 級(jí)臺(tái)階的跳法數(shù)目熊户,即為f(n-3)萍膛。
因此n 級(jí)臺(tái)階時(shí)的不同跳法的總數(shù)f(n) = f(n-1) + f(n-2) + f(n-3)。
時(shí)間復(fù)雜度:O(n)
public class Test {
public static void main(String[] args) {
System.out.println(jump(4));
}
private static int jump(int step) {
// TODO Auto-generated method stub
if(step <= 0) {
return 0;
}
if(step == 1 || step == 2) {
return step;
}
if(step == 3) {
return step + 1; //包括自身
}
return (jump(step - 1) + jump(step - 2) + jump(step - 3));
}
}
輸出結(jié)果是:7