跟着leedcode刷算法 -- 动态规划2

154 阅读2分钟

这是我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战

image.png

题3

最长连续序列

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

  • 输入:nums = [100,4,200,1,3,2]

  • 输出:4

  • 解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。 示例 2:

  • 输入:nums = [0,3,7,2,5,8,4,6,0,1]

  • 输出:9   提示:

  • 0 <= nums.length <= 105

  • -109 <= nums[i] <= 109 相关标签

  • 并查集

  • 数组

  • 哈希表

思路: 排序 遍历判断当前数据与前一个数据是否相差1

class Solution:
    def longestConsecutive(self, nums: List[int]) -> int:
        if not nums: return 0
        nums.sort()
        res = 1 
        tmp = 1
        for row in range(1,len(nums)):
            if nums[row] == nums[row-1]:
                pass
            elif nums[row]-1 == nums[row-1]:
                tmp+=1
                res=res if res>tmp else tmp
            else:
                tmp=1
        return res
            

执行结果:

image.png

题4

打家劫舍

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

示例 1:

  • 输入:[1,2,3,1]

  • 输出:4

  • 解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。

  •   偷窃到的最高金额 = 1 + 3 = 4 。 示例 2:

  • 输入:[2,7,9,3,1]

  • 输出:12

  • 解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。

  •   偷窃到的最高金额 = 2 + 9 + 1 = 12 。  

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 400 相关标签
  • 数组
  • 动态规划

思路: 打家劫舍 简单点说就是取最大的数,判断前后,然后间隔取值,看最大的数就可以了

虽然不是最优解,但是代码量应该是最少的了方法了

class Solution:
    def rob(self, nums: List[int]) -> int:
        res = 0 
        row = 0
        for num in nums:
            res, row = max(row + num, res), res
        return res

执行结果:

image.png