0
点赞
收藏
分享

微信扫一扫

动态规划-重复子问题合集

Python芸芸 2022-02-18 阅读 42

剑指offer10 Fibonacci

public int Fibonacci(int n) {
        int a=0,b=1,sum;
        for(int i=0;i<n;i++){
            sum=a+b;
            a=b;
            b=sum;
        }
        return a;
    }

剑指offer69 跳台阶

public int climbStairs(int n) {
        if(n<=1) return 1;
        int[] dp=new int[n+1];
        dp[1]=1;
        dp[2]=2;
        for(int i=3;i<=n;i++){
            dp[i]=dp[i-1]+dp[i-2];
        }
        return dp[n];
    }

力扣91 解码方法

思路:和上面两道题的思路类似。​​​​​​​

public int numDecodings(String s){
        int len=s.length();
        if(len==0) return 0;
        int[] dp=new int[len];
        char[] charArray=s.toCharArray();
        if(charArray[0]=='0') return 0;
        dp[0]=1;
        for(int i=1;i<len;i++){
            if(charArray[i]!='0') dp[i]=dp[i-1];
            int num=(charArray[i-1]-'0')*10+charArray[i]-'0';
            if(num>=10&&num<=26){
                if(i==1) dp[i]++;
                else dp[i]+=dp[i-2];
            }
        }
        return dp[len-1];
    }

剑指offer46 把数字翻译成字符串

public int translateNum(int num) {
        char[] ch=String.valueOf(num).toCharArray();
        int[] dp=new int[ch.length+1];
        dp[0]=1;
        dp[1]=1;
        for(int i=2;i<=ch.length;i++){
            int n=(ch[i-2]-'0')*10+ch[i-1]-'0';
            if(n>=10&&n<=25){
                dp[i]=dp[i-1]+dp[i-2];
            }
            else{
                dp[i]=dp[i-1];
            }
        }
        return dp[ch.length];
    }

优化代码:

public int translateNum(int num) {
        char[] ch=String.valueOf(num).toCharArray();
        int a=1;//dp[0]
        int b=1;//dp[1]
        for(int i=2;i<=ch.length;i++){
            int n=(ch[i-2]-'0')*10+ch[i-1]-'0';
            int c=0;
            if(n>=10&&n<=25){
                c=a+b;//dp[2]
            }
            else{
                c=b;
            }
            a=b;
            b=c;
        }
        return b;
    }

举报

相关推荐

0 条评论