【剑指 Offer 46. 把数字翻译成字符串】【剑指 Offer 10- II. 青蛙跳台阶问题】【198. 打家劫舍】【动态规划】

青蛙跳台阶,打家劫舍,字母相同编码三道题思路总结
总结我自己思路的,写的不详细,想看详细的可以跳转到我加的链接,都是力扣上同一个人写的题解,很厉害。

字符串翻译数字

字符串翻译数字
当最后一位数字单独出来,则有f(i-1)种做法;
当最后两位位数字单独出来,最后两位大于等于10且小于等于25,则有f(i-2)种做法;
所以i位数字一共有f(i-1)+f(i-2)种,边界值为f(0)=f(1)=1
这个空间复杂度O(N+1)

class Solution:
    def translateNum(self, num: int) -> int:
        s=str(num)
        length=len(s)
        dp=[0]*(len(s)+1)
        dp[0]=1
        dp[1]=1
        for i in range(2,len(s)+1):
            if "10"<=s[i-2:i] and s[i-2:i]<="25":
                dp[i]=dp[i-2]+dp[i-1]
            else:
                dp[i]=dp[i-1]
        return dp[length]

滚动数组可以降低空间复杂度,因为f(i)的值与前两位f(i-1)f(i-2)有关

class Solution:
    def translateNum(self, num: int) -> int:
        s=str(num)
        a,b=1,1
        for i in range(2,len(s)+1):
            if "10"<=s[i-2:i] and s[i-2:i]<="25":
                a,b=a+b,a
            else:
                a,b=a,a
        return a

打家劫舍

力扣题解
若第i家抢,则最大值为f(i-2)+num[i];
若第i家不抢,则最大值为f(i-1);
f(i)=max(f(i-1),f(i-2)+num[i]);
初始值f(1)=num[0],f2=max(num[0],num[1])

class Solution:
    def rob(self, nums: List[int]) -> int:
        length=len(nums)
        if  length==0:
            return 0
        elif length==1:
            return nums[0]
        else:
            dp=[0]*length
            dp[0]=nums[0]
            dp[1]=max(nums[0],nums[1])
            for i in range(2, length):
                dp[i]=max(dp[i-1],dp[i-2]+nums[i])
            return dp[length-1]

跳楼梯

跳楼梯
若最后一次跳一级,则有f(i-1)种跳法;
若最后一次跳两级,则有f(i-2)种跳法;
f(i)=f(i-1)+f(i-2);
初始值f(1)=1,f(2)=2
超出时间限制

class Solution:
    def numWays(self, n: int) -> int:
        if n==1 or n==0:
            return 1
        if n==2:
            return 2
        return self.numWays(n-2)+self.numWays(n-1)

正确做法:滚动数组

class Solution:
    def numWays(self, n: int) -> int:
        a,b,ret=1,1,0
        for i in range(n-1):
           ret=a+b
           b=a
           a=ret
        return a%1000000007

总结

本来这是我周五的任务,但是我太懒惰了,拖延到周日才写,今天差点也不写了,强迫自己才写完,太痛苦了。我啥时候才能自律呀。
发布时间是因为我周四写的草稿才是19号。以防我回来看误以为我还是连续时间发的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值