2021/7/20:动态规划

 

class Solution:
    def rob(self, nums: List[int]) -> int:
        n = len(nums)
        res = [([0]*2) for _ in range(n)]
        res[0][0] = 0
        res[0][1] = nums[0] #0不偷,1偷
        for i in range(1,n):
            res[i][0] = max(res[i-1][0],res[i-1][1])
            res[i][1] = res[i-1][0]+nums[i]
        return max(res[n-1][0],res[n-1][1]) 

 

class Solution:
    def rob(self, nums: List[int]) -> int:
        n = len(nums)
        if n ==0:
            return 0
        if n ==1 :
            return nums[0]
        if n ==2 :
            return max(nums)
        res_0 = [([0]*2) for _ in range(n-1)]
        res_1 = [([0]*2) for _ in range(n-1)]
        res_0[0][0] = 0
        res_0[0][1] = -1000 #0不偷,1偷
        res_1[0][0] = -1000
        res_1[0][1] = nums[0] #0不偷,1偷
        res_0[1][0] = 0
        res_0[1][1] = nums[1] #0不偷,1偷
        res_1[1][0] = nums[0]
        res_1[1][1] = -1000 #0不偷,1偷
        for i in range(2,n-1):
            res_0[i][0] = max(res_0[i-1][0],res_0[i-1][1])       #不偷1,不偷i
            res_0[i][1] = res_0[i-1][0]+nums[i]
            res_1[i][0] = max(res_1[i-1][0],res_1[i-1][1]) 
            res_1[i][1] = res_1[i-1][0]+nums[i]
        print(res_0)
        print(res_1)
        resn_0 = max(res_0[-1][0],res_0[-1][1],res_1[-1][0],res_1[-1][1])
        resn_1 = res_0[-1][0] +nums[-1]
        return max(resn_0,resn_1) 

 

class Solution:
    def minPathSum(self, grid: List[List[int]]) -> int:
        m = len(grid)
        n = len(grid[0])
        minpath = [[0]*n for _ in range(m)]
        for i in range(m):
            for j in range(n):
                if i-1 >= 0 and j-1 >= 0:
                    minpath[i][j] = min(minpath[i][j-1]+grid[i][j],minpath[i-1][j]+grid[i][j])
                elif i-1 >=0:
                    minpath[i][j] = minpath[i-1][j]+grid[i][j]
                elif j-1 >=0:
                    minpath[i][j] = minpath[i][j-1]+grid[i][j]
                else:
                    minpath[i][j] = grid[i][j]
        return minpath[m-1][n-1]

 

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        minpath = [[0]*n for _ in range(m)]
        for i in range(m):
            for j in range(n):
                if i-1 >= 0 and j-1 >= 0:
                    minpath[i][j] = minpath[i-1][j] + minpath[i][j-1]
                elif i-1 >= 0 or j-1 >= 0:
                    minpath[i][j] = 1
                else:
                    minpath[i][j] = 1
        return minpath[m-1][n-1]

 

class NumArray:

    def __init__(self, nums: List[int]):
        self.nums = nums

    def sumRange(self, left: int, right: int) -> int:
        amount = 0
        for i in range(left,right+1):
            amount += self.nums[i]
        return amount


# Your NumArray object will be instantiated and called as such:
# obj = NumArray(nums)
# param_1 = obj.sumRange(left,right)
class NumArray:

    def __init__(self, nums: List[int]):
        if nums:
            self.nums = [0]
            for num in nums:
                self.nums.append(self.nums[-1]+num)
        else: self.nums = []
    def sumRange(self, left: int, right: int) -> int:
        return self.nums[right+1]-self.nums[left]


# Your NumArray object will be instantiated and called as such:
# obj = NumArray(nums)
# param_1 = obj.sumRange(left,right)

 

暴力破解法:判断每2个数之间是不是一个等差数列 时间复杂度n^3

class Solution:
    def numberOfArithmeticSlices(self, nums: List[int]) -> int:
        n = len(nums)
        count = 0
        for a in range(n-2):
            d = nums[a+1]-nums[a]
            for b in range(a+2,n):
                flag=0
                for i in range(a+1,b+1):
                    if(nums[i]-nums[i-1] != d):
                        break;
                    flag = i
                if (flag == b):
                    count += 1
        return count

动态规划:时间复杂度:O(N) 空间复杂度O(N)

 

class Solution:
    def numberOfArithmeticSlices(self, nums: List[int]) -> int:
        n = len(nums)
        amount = 0
        if n <3:
            return 0
        dp = [0]*n
        for i in range(2,n):
            if nums[i]-nums[i-1] == nums[i-1] -nums[i-2]:
                dp[i] = dp[i-1]+1
                amount += dp[i]
        return amount

动态规划:时间复杂度:O(N) 空间复杂度O(1)

class Solution:
    def numberOfArithmeticSlices(self, nums: List[int]) -> int:
        n = len(nums)
        amount = 0
        if n <3:
            return 0
        predp = 0
        dp = 0
        for i in range(2,n):
            if nums[i]-nums[i-1] == nums[i-1] -nums[i-2]:
                dp = predp +1
                amount += dp
                predp = dp
            else:
                predp = 0
        return amount

 

 

class Solution:
    def integerBreak(self, n: int) -> int:
        if n == 2:
            return 1
        dp = [0]*(n+1)
        for i in range(2,n+1):
            for j in range(i):
                dp[i] = max(dp[i],j*(i-j),j*dp[i-j])
        return dp[n]

 

class Solution:
    def numSquares(self, n: int) -> int:
        dp =  [n]*(n+1)
        dp[0] = 0
        for i in range(1,n+1):
            for j in range(1,int(i**0.5)+1):
                dp[i] = min(i,dp[i],dp[i-j*j]+1)
        print(dp)
        return dp[n]

 搞清楚状态转移方程的判定条件! 

如果是两个字母,则要看s[i-2] 和s[i-1],可以分开看

class Solution:
    def numDecodings(self, s: str) -> int:
        n = len(s)
        dp = [0]*(n+1)
        dp[0] = 1
        dp[1] = 1
        if s[0] == '0':
            return 0
        for i in range(2,n+1):
            if s[i-1] != '0':
                dp[i] += dp[i-1]
            if s[i-2] != '0' and int(s[i-2:i]) <=26:
                dp[i] += dp[i-2]
        return dp[n]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值