当前位置: 首页 > news >正文

莆田网站制作企业网页设计工作室长沙

莆田网站制作企业,网页设计工作室长沙,百度热搜电视剧,重庆品牌网站建设思路一&#xff1a;回溯&#xff1a;按照选和不选的判断方式&#xff0c;使用回溯来解决这个问题。 class Solution: def rob(self, nums: List[int]) -> int: n len(nums) #数组的长度 def dfs(i): if i<0: #到达边界条件后 return 0 #返回最大金额是0 res max(dfs(i…

 思路一:回溯:按照选和不选的判断方式,使用回溯来解决这个问题。

class Solution:

    def rob(self, nums: List[int]) -> int:

        n = len(nums) #数组的长度

        def dfs(i):

            if i<0: #到达边界条件后

                return 0 #返回最大金额是0

            res = max(dfs(i-1),dfs(i-2)+nums[i]) #如果选,下一次递归的就是i-2,并且要加上nums[i]的值,如果不选,下一次递归i-1。比较选或者不选的最大值并返回。

            return res

        res = dfs(n-1) #传入的是数组的最大下标

        return res

问题:回溯使用递归,时间复杂度是指数级别的,会超时,那如何让时间降下来?

思路二:有两次相同的计算结果,那就把每个位置的计算结果保存下来,可以把时间缩短。

 

class Solution:

    def rob(self, nums: List[int]) -> int:

        n = len(nums)

        cache = [-1]*n #因为每个位置一定不是负数

        def dfs(i):

            if i<0:

                return 0

            if cache[i] != -1: #当前的位置不是-1,那么这个位置被计算过,直接返回计算的结果

                return cache[i] 

            res = max(dfs(i-1),dfs(i-2)+nums[i])

            cache[i] = res #把当前位置的计算结果保存

            return res

        res = dfs(n-1)

        return res

问题:这种方式的空间复杂度就是O(n),如何将空间复杂度降下来:递推

思路三:我们可以确定的知道每个节点是那几个数归的结果,那把递的过程省略,直接归,也就是从下往上计算结果。

 

 循环对数组下标有要求,所以下标从2开始。

class Solution:

    def rob(self, nums: List[int]) -> int:

        n = len(nums)

        f = [0]*(n+2) #归的数组长度是n+2,每个数组的值是0

        for i,x in enumerate(nums): #遍历nums

            f[i+2] = max(f[i+1],f[i]+x) # 等同于res = max(dfs(i-1),dfs(i-2)+nums[i])

        return f[n+1]

改进空间复杂度:

class Solution:

    def rob(self, nums: List[int]) -> int:

        n = len(nums)

        f0 = f1 = 0

        for i,x in enumerate(nums):

            new_f = max(f1,f0+x)

            f0 = f1

            f1 = new_f

        return f1

思路:

class Solution:

    def climbStairs(self, n: int) -> int:

        dp0 = 1

        dp1 = 1

        if n <= 1:

            return 1

        dp = 0

        for i in range(2,n+1):

            dp = dp0 + dp1

            dp0 = dp1

            dp1 = dp

        return dp

 思路:

 

class Solution:

    def minCostClimbingStairs(self, cost: List[int]) -> int:

        n = len(cost)

        dp0 = 0 #第0级台阶的顶部最小花费是0

        dp1 = min(cost[0],cost[1]) #第1级台阶的顶部台阶的最小花费是cost[0]或cost[1]的最小值

        for i in range(2,n):

            dp = min(dp1+cost[i],dp0+cost[i-1])

            dp0 = dp1

            dp1 = dp

        return dp1

http://www.shuangfujiaoyu.com/news/49943.html

相关文章:

  • 网站怎么才可以不备案百度安装免费下载
  • 万网注册域名做简单网站手机网站搜索优化
  • wordpress网站速度慢芜湖seo
  • 青岛网站建设推广公司网络营销自学网站
  • 做网站必须要切图吗怎样才能在百度上面做广告宣传
  • 最便宜的网站叫什么名字可口可乐软文范例
  • 美国地接公司怎么在中国网站做推广看广告得收益的app
  • 公司网站需要程序员做吗头条新闻最新消息
  • 如何鉴定网站做的好坏百度电脑版网址
  • 有源码做网站凡科建站客服电话
  • 旅游网站建设案例百度搜索下载app
  • 公司网站建设招标文件范本网站关键词优化系统
  • 独立网站做seo优化网站seo优化心得
  • 英文网站建设用哪种字体网站seo是什么意思
  • 怎样查询网站的点击量关键词排名优化易下拉排名
  • 广州网络兼职网站建设cilimao磁力猫
  • 网站建设完整版app注册接单平台
  • 做泰迪狗网站的意义百度广告联盟官网
  • 乡村振兴网站建设青岛网站推广公司排名
  • 加强政府网站建设 提高重视app开发用什么软件
  • 怎么网上推广自己的产品商丘网站优化公司
  • wordpress文章附件seo快速优化文章排名
  • 网站和网店区别影视剪辑培训机构排名
  • 广告平面设计网站东莞seo靠谱
  • 2017网站建设报价单网络营销策划案
  • 通州网站建设公司百度seo招聘
  • 网站专业建设公司免费发帖论坛大全
  • 重庆网站建设cqsday深圳关键词推广排名
  • 局域网建设直播网站南宁网络推广品牌
  • 三站合一的网站怎么做教程seo推广主要做什么