Python每日一练(20230516) 打家劫舍 I\II\III\IV HouseRobber

news2024/12/22 19:14:08

 

目录

1. 打家劫舍 I House Robber i

2. 打家劫舍 II House Robber ii

3. 打家劫舍 III House Robber iii

4. 打家劫舍 IV House Robber iv

🌟 每日一练刷题专栏 🌟

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


leetcode 对应题号: 198、213、337、2560

1. 打家劫舍 I House Robber i

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

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

示例 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 rob1(self, nums):
        if not nums:
            return 0
        n = len(nums)
        if n == 1:
            return nums[0]
        dp = [0] * n
        dp[0] = nums[0]
        dp[1] = max(nums[0], nums[1])
        for i in range(2, n):
            dp[i] = max(dp[i-2]+nums[i], dp[i-1])
        return dp[n-1]

    def rob2(self, nums):
        if not nums:
            return 0
        n = len(nums)
        if n == 1:
            return nums[0]
        prepre, pre = nums[0], max(nums[0], nums[1])
        for i in range(2, n):
            cur = max(prepre+nums[i], pre)
            prepre, pre = pre, cur
        return pre

    def rob3(self, nums):
        mem = [-1] * len(nums)
        return helper(nums, mem, len(nums)-1)

def helper(nums, mem, i):
    if i < 0:
        return 0
    if mem[i] >= 0:
            return mem[i]
    res = max(helper(nums, mem, i-2)+nums[i], helper(nums, mem, i-1))
    mem[i] = res
    return res

if __name__ == '__main__':
    solution = Solution()
    nums = [1, 2, 3, 1]
    print(solution.rob1(nums))
    print(solution.rob2(nums))
    print(solution.rob3(nums))
    nums = [2, 7, 9, 3, 1]
    print(solution.rob1(nums))
    print(solution.rob2(nums))
    print(solution.rob3(nums))

输出:

4
4
4
12
12
12


2. 打家劫舍 II House Robber ii

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。

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

示例 1:

输入:nums = [2,3,2]
输出:3
解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。

示例 2:

输入:nums = [1,2,3,1]
输出:4
解释:你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。
     偷窃到的最高金额 = 1 + 3 = 4 。

示例 3:

输入:nums = [1,2,3]
输出:3

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 1000

代码:

def robII(nums):
    if not nums:
        return 0
    n = len(nums)
    if n == 1:
        return nums[0]
    return max(rob_range(nums, 0, n-2), rob_range(nums, 1, n-1))

def rob_range(nums, start, end):
    dp = [0] * (end-start+1)
    dp[0] = nums[start]
    dp[1] = max(nums[start], nums[start+1])
    for i in range(2, end-start+1):
        dp[i] = max(dp[i-2]+nums[start+i], dp[i-1])
    return dp[-1]

if __name__ == '__main__':
    nums = [2,3,2]
    print(robII(nums))
    nums = [1,2,3,1]
    print(robII(nums))
    nums = [1,2,3]
    print(robII(nums))

输出:

3
4
3


3. 打家劫舍 III House Robber iii

小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。

除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。

给定二叉树的 root 。返回 在不触动警报的情况下 ,小偷能够盗取的最高金额 。

示例 1:

输入: root = [3,2,3,null,3,null,1]
输出: 7 
解释: 小偷一晚能够盗取的最高金额 3 + 3 + 1 = 7

示例 2:

输入: root = [3,4,5,1,3,null,1]
输出: 9
解释: 小偷一晚能够盗取的最高金额 4 + 5 = 9

提示:

  • 树的节点数在 [1, 10^4] 范围内
  • 0 <= Node.val <= 10^4

代码:

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
        
class Solution:
    def rob(self, root: TreeNode) -> int:
        def _rob(node):
            if not node:
                return (0, 0)
            left = _rob(node.left)
            right = _rob(node.right)
            rob = node.val + left[1] + right[1]
            not_rob = max(left) + max(right)
            return (rob, not_rob)
        
        return max(_rob(root))

def listToTree(lst: list) -> TreeNode:
    if not lst:
        return None
    root = TreeNode(lst[0])
    queue = [root]
    i = 1
    while i < len(lst):
        node = queue.pop(0)
        if lst[i] is not None:
            node.left = TreeNode(lst[i])
            queue.append(node.left)
        i += 1
        if i < len(lst) and lst[i] is not None:
            node.right = TreeNode(lst[i])
            queue.append(node.right)
        i += 1
    return root

if __name__ == '__main__':
    solution = Solution()
    null = None
    root = listToTree([3,2,3,null,3,null,1])
    print(solution.rob(root))
    root = listToTree([3,4,5,1,3,null,1])
    print(solution.rob(root))

输出:

7
9


4. 打家劫舍 IV House Robber iv

沿街有一排连续的房屋。每间房屋内都藏有一定的现金。现在有一位小偷计划从这些房屋中窃取现金。

由于相邻的房屋装有相互连通的防盗系统,所以小偷 不会窃取相邻的房屋 。

小偷的 窃取能力 定义为他在窃取过程中能从单间房屋中窃取的 最大金额 。

给你一个整数数组 nums 表示每间房屋存放的现金金额。形式上,从左起第 i 间房屋中放有 nums[i] 美元。

另给你一个整数 k ,表示窃贼将会窃取的 最少 房屋数。小偷总能窃取至少 k 间房屋。

返回小偷的 最小 窃取能力。

示例 1:

输入:nums = [2,3,5,9], k = 2
输出:5
解释:
小偷窃取至少 2 间房屋,共有 3 种方式:
- 窃取下标 0 和 2 处的房屋,窃取能力为 max(nums[0], nums[2]) = 5 。
- 窃取下标 0 和 3 处的房屋,窃取能力为 max(nums[0], nums[3]) = 9 。
- 窃取下标 1 和 3 处的房屋,窃取能力为 max(nums[1], nums[3]) = 9 。
因此,返回 min(5, 9, 9) = 5 。

示例 2:

输入:nums = [2,7,9,3,1], k = 2
输出:2
解释:共有 7 种窃取方式。窃取能力最小的情况所对应的方式是窃取下标 0 和 4 处的房屋。返回 max(nums[0], nums[4]) = 2 。

提示:

  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= 10^9
  • 1 <= k <= (nums.length + 1)/2

代码:

from typing import List
class Solution:
    def minCapability(self, nums: List[int], k: int) -> int:
        left = min(nums)
        right = max(nums)
        dp = [0] * (len(nums) + 2)
        while left <= right:
            mid = left + (right - left) // 2
            for i in range(len(nums)):
                dp[i + 2] = dp[i + 1]
                if nums[i] <= mid:
                    dp[i + 2] = max(dp[i + 2], dp[i] + 1)
            if dp[len(nums) + 1] >= k:
                right = mid - 1
            else:
                left = mid + 1
        return left

if __name__ == '__main__':
    s = Solution()
    nums = [2, 3, 5, 9]
    print(s.minCapability(nums, 2))
    nums = [2, 7, 9, 3, 1]
    print(s.minCapability(nums, 2))

输出:

5
2


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/531178.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

除了OA以外,只用点击按钮就能实现协同办公,靠一个工具就能实现

OA不同时期&#xff0c;不同功能 OA是办公自动化系统&#xff0c;与互联网技术的发展有着密切的联系。 很多办公场景都离不开OA协同系统。OA是办公系统&#xff0c;借助与互联网的交互性&#xff0c;开创出的一种新型的办公方式。 所以&#xff0c;说到OA软件&#xff0c;在不…

Linux 网络基础(1)基础知识、IP地址、端口、协议、网络字节序

基础知识 网络发展背景&#xff1a; 网络的划分&#xff1a;局域网&#xff08;覆盖范围在1000m以内&#xff09;、城域网&#xff08;覆盖范围在20km以内&#xff09;、广域网&#xff08;更大范围&#xff09; 组网方式&#xff1a;以太网、令牌环网.... 日常名词&#xff1a…

ChatGPT「最强竞争对手」Claude有了史诗级更新~~~百页数据一分钟读完还能做出总结

号称ChatGPT「最强竞争对手」的Claude&#xff0c;迎来史诗级更新—— 模型记忆力原地起飞&#xff0c;现在1分钟看完一本数万字的小说&#xff0c;已经是一件很理所当然的事情了。 消息一出&#xff0c;评论区直接炸了&#xff0c;网友们蜂拥而至&#xff0c;「wocao连连」&am…

报表解决方案Telerik Reporting - 轻松完成嵌入式报表开发

假设您是一名开发人员&#xff0c;思考一下您的用户将从Web报表设计器中得到什么吗&#xff1f;他们能突出异常数据吗?他们能够从头开始创建一个报告吗?让我们站在商业用户的角度&#xff0c;看看这到底是怎么回事。 Telerik Reporting Web Designer是一个多功能且用户友好的…

Redis系列--redis管道

一、前言 1、reids客户端向服务端发送命令分四步&#xff08;发送命令-命令排队-命令执行-返回结果&#xff09;&#xff0c;并监听socket返回&#xff0c;通常以阻塞模式等待服务端响应。 2、服务端处理命令&#xff0c;并将结果返回给客户端 以上两步称为&#xff1a;Roun…

榜店商城独立版禾匠队列服务测试失败问题解决方法-开启禾匠队列教程

发现很多用户在安装完成后或者在使用独立版本的过程中可能突然会遇到测试不通过,队列测试失败的情况,安装完成后输入站点域名登录到商城后台,先清理缓存然后进入“设置”-“队列服务”,按要求启动服务并测试服务是否正常运行,如果运行失败的话,如下图所示 这里狮子喵就给…

端子引脚焊接异常分析

No.1 案例概述 PCBA端子引脚焊接发生异常&#xff0c;通过对PCBA基板和端子进行一系列分析&#xff0c;定位到问题发生的原因在于共面性不良&#xff0c;且端子焊接引脚与锡膏接触程度不足导致。详细分析方案&#xff0c;请浏览文章获知。 Q:什么是共面性&#xff1f; 共面性也…

第一章 Java语言概述

一 Java知识脉络图 1.1 Java基础全程脉络图 1.2 本章专题与脉络 二 计算机的硬件与软件 2.1 计算机组成&#xff1a;硬件软件 2.2 CPU、内存与硬盘 CPU&#xff08;Central Processing Unit&#xff0c;中央处理器&#xff09; 人靠大脑思考&#xff0c;电脑靠CPU来运算、控…

LocalAI - 兼容OpenAI API的本地大模型技术栈【LLM】

LocalAI 是一个用于本地推理的 与OpenAI API 规范兼容的REST API&#xff0c; 它允许使用消费级硬件在本地或本地运行模型&#xff0c;支持llama.cpp、alpaca.cpp、gpt4all.cpp、rwkv.cpp、whisper.cpp、vicuna、koala、gpt4all-j、cerebras 等大模型。 推荐&#xff1a;用 NSD…

linux入门---模拟实现命令行解释器

目录标题 前提准备工作 前提 平时使用指令操作linux系统的时候可能会输入一些不好的指令&#xff0c;这些指令可能会对操作系统内核造成影响&#xff0c;所以就有了命令行解释器这个东西&#xff0c;它会过滤掉那些不好的指令从而让linux系统更加的安全&#xff0c;比如说我们…

初识linux之线程池与一些常见的锁

目录 一、线程池的概念 1. 线程池的概念 2. 线程池的应用场景 二、模拟实现一个线程池 1. 线程的简单封装 2. 锁的简单封装 3. 线程池的模拟实现 3.1 整体结构及头文件 3.2 构造函数 3.3 析构函数 3.4 线程启动 3.5 传入任务 3.6 整体结构 三、线程安全的单例模式…

向基于语义模型的操作集成的演变

在过去的许多年里&#xff0c;已经定义了许多架构方法&#xff0c;用于系统集成以及其信息和流程的表示。这些方法包括面向数据、面向消息、面向服务和面向信息的方法。需要探讨的问题是&#xff1a; 这些不同的方法有何不同和联系&#xff1f;从实时运营整合架构的角度来看&a…

MQTT协议理解

提示&#xff1a;记录mqtt服务搭建及访问教程 文章目录 前言一、MQTT是什么&#xff1f;二、使用步骤1.MQTT服务器搭建2.MQTT集成 总结 前言 一直想了解下mqtt&#xff0c;本人又懒&#xff0c;被动型学习&#xff0c;刚好项目需要&#xff0c;此篇记录下MQTT搭建过程及心得体…

小模型媲美2000倍体量大模型,谷歌提出新思路:蒸馏也能Step-by-Step

深度学习自然语言处理 原创作者&#xff1a;林哲乐 论文&#xff1a;Distilling Step-by-Step! Outperforming Larger Language Models with Less Training Data and Smaller Model Sizes地址&#xff1a;https://arxiv.org/pdf/2305.02301.pdf录取&#xff1a;ACL2023 进NLP群…

在JavaScript中4种创建枚举方式

本文译者为 360 奇舞团前端开发工程师 原文标题&#xff1a;4 Ways to Create an Enum in JavaScript原文作者&#xff1a;Dmitri Pavlutin原文地址&#xff1a;https://dmitripavlutin.com/javascript-enum/ 使用枚举&#xff08;enum&#xff09;可以方便地表示一个变量&…

一个通用的多相机视觉SLAM框架的设计和评估

文章&#xff1a;Design and Evaluation of a Generic Visual SLAM Framework for Multi-Camera Systems 作者&#xff1a;Pushyami Kaveti, Arvind Thamil Chelvan Hanumant Singh 编辑&#xff1a;点云PCL 来源&#xff1a;https://arxiv.org/pdf/2210.07315.pdf 代码&#x…

针对基于智能卡进行认证的活动目录的攻击

最近&#xff0c;我参与了一项攻击基于智能卡的活动目录的工作。实际上&#xff0c;你根本不需要使用物理智能卡来验证登录这个活动目录。证书的属性决定了它是否可以用于基于智能卡进行登录。因此&#xff0c;如果你能获得相应的私钥&#xff0c;那么就可以绕过智能卡的验证实…

借助ChatGPT自动生成PPT

借助ChatGPT自动生成PPT 首先让GPT生成一段markdown格式的PPT内容&#xff0c;尽量描述全面&#xff0c;以什么语言&#xff0c;什么格式&#xff0c;排版等等。 打开mindshow网址&#xff0c;点击import and create&#xff0c;选择以markdown方式创建&#xff0c;再次点击弹…

LayerNorm 在 Transformers 中对注意力的作用研究

LayerNorm 一直是 Transformer 架构的重要组成部分。如果问大多人为什么要 LayerNorm&#xff0c;一般的回答是&#xff1a;使用 LayerNorm 来归一化前向传播的激活和反向传播的梯度。 其实这只是部分正确&#xff1a;Brody、Alon 和 Yahav 的一篇题为“On the Expressivity Ro…

LabVIEWCompactRIO 开发指南20 应用程序接口

应用程序接口 STMAPI如图4.24所示。对于基本操作&#xff0c;它由一个读VI和一个写VI组成。它还具有两个补充VI&#xff0c;以帮助传输元数据&#xff0c;但它们的使用不是强制性的。每个主要的VI都是多态&#xff0c;这意味着可以将它们与不同的传输层一起使用。本文档讨论基…