变态跳台阶java 剑指offer

变态跳台阶

题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

思路:f(n)=f(n-1)+f(n-2)+f(n-3)+…+1;

f(n-1)=f(n-2)+f(n-3)+f(n-4)+…+1;

两式子相减得到f(n)=2f(n-1)

f(1)=1;

所以f(n)=2^n

public class Solution {
    public int JumpFloorII(int target) {
         int a=1;
        if(target==1)
            return 1;
        else
        for(int i=1;i<target;i++){
            a=a*2;
        }
        return a;
    }
}

其实相比上面的公式法我更喜欢直接的代码实现,因为个人把思路转化为代码的能不8太行,所以来多锻炼多刷题

import java.util.*;
public class Solution {
    public int JumpFloorII(int target) {
        if (target <= 2) {
            return target;
        }
        int[] dp = new int[target + 1];
        Arrays.fill(dp, 1); //初始化每一种都可以直接从 0 跳到 n
        dp[0] = 0; //从 0 跳到 0 为 0 种,因为 n = 0,没法跳
        for (int i = 2; i <= target; i++) {
            for (int j = i - 1; j >= 1; j--) {
                dp[i] += dp[j]; //第 n 个状态是由前 n - 1 种状态推导出来,就是累加!
            }
        }
        return dp[target];
    }
}

这种呢就是直接f(n)=f(n-1)+f(n-2)+…f(1)+1的代码实现

import java.util.*;
public class Solution {
    public int JumpFloorII(int target) {

        if(target<=2)
            return target;
        else{ 
            int [] arr=new int[target+1];
            
            Arrays.fill(arr,0);
            arr[0]=0;
            arr[1]=1;
            for(int i=2;i<=target;i++){
                
                for(int j=i-1;j>=1;j--)
                {
                    arr[i]=arr[j]+arr[i];
            
                }
                arr[i]=arr[i]+1;
            }
            return arr[target];
        }
    }
}

修改了下,我觉得这才是f(n)=f(n-1)+f(n-2)+…+1的直接实现,上一个版本不够直接

发布了13 篇原创文章 · 获赞 0 · 访问量 841

猜你喜欢

转载自blog.csdn.net/kelexing4/article/details/105355723
今日推荐