青蛙跳台阶,打家劫舍,字母相同编码三道题思路总结
总结我自己思路的,写的不详细,想看详细的可以跳转到我加的链接,都是力扣上同一个人写的题解,很厉害。
字符串翻译数字
字符串翻译数字
当最后一位数字单独出来,则有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号。以防我回来看误以为我还是连续时间发的。