数据结构与算法之动态规划: LeetCode 198. 打家劫舍 (Ts, Py, Go版)

ndnSIM学习笔记(一) 在接下来的一段时间要用ndnSIM来做自己的仿真网络,需要系统的学习相关内容,以下为内容记录。1.安装      1.1核心依赖(必需的)             • python >= 2.6             • libsqlite3             • libcrypto++             • pkg-config             • Boost lib... 阅读详情

打家劫舍

  • https://leetcode.cn/problems/house-robber/

描述

  • 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统
  • 如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
  • 给定一个代表每个房屋存放金额的非负整数数组,计算你不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

示例 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

Typescript 版算法实现

1 )方案 1

function rob(nums: number[]): number {
    let nlen = nums.length;
    if(!nlen) {
        return;
    }
    // 下标为0,代表0个房屋的金额,0; 下标为1,代表第一个房屋的金额
    const dp = [0, nums[0]];
    for(let i=2; i<=nlen; ++i) {
        // 子问题公式,计算第i个房间的,这个数组是进行累加的
        dp[i] = Math.max(dp[i-2] + nums[i - 1], dp[i-1])
    }
    // dp数组,永远比nums数组大1
    return dp[nlen];
};
  • 思路
    • f(k) 从前k个房屋中能够偷窃到的最大数额
    • Ak = 第k个房屋的钱数
    • f(k) = max(f(k-2) + Ak, f(k-1)) 这是一个子问题
    • 考虑动态规划
  • 步骤
    • 定义子问题,f(k) = max(f(k-2) + Ak, f(k-1))
    • 反复执行子问题:从2~n, 执行上述公式

2 )方案 2

function rob(nums: number[]): number {
    let nlen = nums.length;
    if(!nlen) {
        return;
    }
    // 用两个变量不断代表数组的倒数两个值
    let dp0 = 0;
    let dp1 = nums[0];

    for(let i:number = 2; i <= nlen; ++ i) {
        // 子问题公式 计算第i个房间
        const tmp = Math.max(dp0 + nums[i - 1], dp1);
        // 更新两个工具值
        dp0 = dp1;
        dp1 = tmp;
    }
    return dp1;
}
  • 这里是优化了方案1的空间复杂度,从O(n) ~ O(1) 的性能提升

3 )方案 3

function rob(nums: number[]): number {
    if (nums.length === 1) {
        return nums[0]
    }
    const dp: number[] = Array.from({
        length: nums.length
    })

    dp[0] = nums[0]
    dp[1] = Math.max(dp[0], nums[1])

    for (let i = 2; i < nums.length; i++) {
        dp[i] = Math.max(
            dp[i - 2] + nums[i],
            dp[i - 1]
        )
    }

    return dp[dp.length - 1]
};
  • 这是官方的一个示例,是方案1的变形,没有方案2好

Python3 版算法实现

1 )方案 1

class Solution:
    def rob(self, nums: List[int]) -> int:
        nlen = len(nums)
        if not nlen:
            return 0

        # 下标为0,代表0个房屋的金额,0; 下标为1,代表第一个房屋的金额
        dp = [0, nums[0]]

        for i in range(2, nlen + 1):
            # 子问题公式,计算第i个房间的,这个数组是进行累加的
            dp.append(max(dp[i - 2] + nums[i - 1], dp[i - 1]))

        # dp数组,永远比nums数组大1
        return dp[nlen]

2 )方案 2

class Solution:
    def rob(self, nums: List[int]) -> int:
        nlen = len(nums)
        if not nlen:
            return 0

        # 用两个变量不断代表数组的倒数两个值
        dp0, dp1 = 0, nums[0]

        for i in range(2, nlen + 1):
            # 子问题公式 计算第i个房间
            tmp = max(dp0 + nums[i - 1], dp1)
            # 更新两个工具值
            dp0, dp1 = dp1, tmp

        return dp1

3 )方案 3

class Solution:
    def rob(self, nums: List[int]) -> int:
        if len(nums) == 1:
            return nums[0]

        dp = [0] * len(nums)

        dp[0] = nums[0]
        dp[1] = max(dp[0], nums[1])

        for i in range(2, len(nums)):
            dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])

        return dp[-1]

Golang 版算法实现

1 )方案 1

func rob(nums []int) int {
    nlen := len(nums)
    if nlen == 0 {
        return 0
    }

    // 下标为0,代表0个房屋的金额,0; 下标为1,代表第一个房屋的金额
    dp := []int{0, nums[0]}

    for i := 2; i <= nlen; i++ {
        // 子问题公式,计算第i个房间的,这个数组是进行累加的
        dp = append(dp, max(dp[i-2]+nums[i-1], dp[i-1]))
    }

    // dp数组,永远比nums数组大1
    return dp[nlen]
}

// 定义一个辅助函数 max 返回两个整数中的最大值
func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}

2 )方案 2

func rob(nums []int) int {
    nlen := len(nums)
    if nlen == 0 {
        return 0
    }

    // 用两个变量不断代表数组的倒数两个值
    dp0, dp1 := 0, nums[0]

    for i := 2; i <= nlen; i++ {
        // 子问题公式 计算第i个房间
        tmp := max(dp0+nums[i-1], dp1)
        // 更新两个工具值
        dp0, dp1 = dp1, tmp
    }

    return dp1
}

// 定义一个辅助函数 max 返回两个整数中的最大值
func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}

3 )方案 3

func rob(nums []int) int {
    nlen := len(nums)
    if nlen == 1 {
        return nums[0]
    }

    dp := make([]int, nlen)

    dp[0] = nums[0]
    dp[1] = max(dp[0], nums[1])

    for i := 2; i < nlen; i++ {
        dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])
    }

    return dp[nlen - 1]
}

// 定义一个辅助函数 max 返回两个整数中的最大值
func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}
大众奥迪诊断不求人:手把手解析SAE J2819(CAN TP2.0)协议报文与连接流程 本文深入解析大众奥迪车型诊断核心标准SAE J2819(CAN TP2.0)协议,详细拆解连接建立流程与报文控制字段。通过实战案例展示通道设置、参数协商等关键步骤,提供诊断设备配置建议和常见故障排查技巧,帮助工程师掌握汽车诊断通信协议的精髓。 阅读详情

相关推荐

雷达气象学(8)——反射率因子图实战(强对流预警篇)

本文聚焦雷达反射率因子图在强对流预警中的实战应用,深入解析了柱状回波、有界弱回波区(BWER)、三体散射(TBSS)等关键回波结构特征,这些是识别超级单体风暴和大冰雹的核心“身份证”。文章强调从静态识别转向动态追踪与多源数据综合研判的思维转变,并提供了系统的实战分析流程与常见误区避坑指南,旨在提升对强对流天气的短临预警能力。

weixin_29213827的博客 487

【算法与数据结构】198、213、337、LeetCode打家劫舍I, II, III

所有的LeetCode题解索引,可以看这篇文章——。

晚安的博客 1400

MSP430项目设计:2020年TI杯大学生电子设计竞赛 坡道行驶电动小车(C题)循迹小车(分享项目展示视频与源码)

文章目录题目要求一、硬件设计二、理论分析与计算三、电路与程序设计四、测试方案与测试结果五、项目展示 哔哩哔哩项目展示视频:https://www.bilibili.com/video/BV1oz4y1d7mH/ 百度网盘资料链接:https://pan.baidu.com/s/1PC-lkSORH_XCgIG-u3HCog 提取码:c7zz 取走记得点赞啊! 题目要求 1.任务 利用TI的MSP430/MSP432平台,设计制作一个四轮电动小车。要求小车能沿着指定路线在坡道上自动循迹骑线行驶。小车必须独立

mbs706的博客 4万+

打家劫舍(动态规划)

198. 打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 示例 1: 输入:[1,2,3,1] 输出:4 解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。 示例 2:

qq_43413774的博客 311

10.2 构网型变流器引发的次同步振荡与宽频振荡问题:机理分析与抑制技术

随着构网型变流器在新型电力系统中的规模化部署,其作为电压源主动支撑电网的能力得到验证的同时,也引发了一系列前所未有的稳定性问题。传统的同步发电机主导的电力系统中,振荡模式主要集中于**低频区间**。然而,构网型变流器通过快速数字控制实现的虚拟同步、惯性响应等先进功能,其控制环路动态与电网阻抗、其他电力电子设备之间产生了复杂的交互作用。这种交互不仅可能诱发经典的**次同步振荡**,更可能催生频率范围从数赫兹到数百赫兹甚至上千赫兹的**宽频振荡**。

技术工作者 1315

#智慧文旅#文创商城管理系统,一站式文旅商品营销管理平台

#智慧文旅#文创商城管理系统满足景区、运营公司或者全域文旅对文创店铺、商品的全流程管理需求,提供文创商品的线上线下产品销售、会员管理、促销管理等服务。包括文创店铺的基本信息管理、文创商品的分类管理、标签管理、上下架管理、库存案例、配送管理等功能。

数字赋能,开启智慧文旅新时代 1177

数据结构之动态规划(二)| 打家劫舍

动态规划,力扣:打家劫舍、python、matlab

Yizkkkkang的博客 281

海康工业相机使用:常见问题及解决方法

工业相机在使用过程中,经常会因为操作不当、使用环境不当等原因出现一些问题,本篇教程,主要针对海康工业相机常见问题及其定位方法做以简单介绍,希望可以帮助大家。 注:该教程对其他品牌工业相机“常见问题”排查,也具备一定的指导意义。 当出现无法通过客户端发现设备或者无法预览图像等问题,先确认当前的运行环境是否满足以下要求: 确认装有相机驱动软件的电脑网卡为千兆网卡(Gige接口相机); 确认网卡是否已开启巨型帧; 确认电脑与网口相机之间的网络链路为千兆; 确认装有相机驱动软件的USB接口为3...

Cche的博客 3万+

Leetcode-打家劫舍问题汇总-动态规划

https://leetcode-cn.com/problems/house-robber-iii/

高高冷的博客 532

【AutoDL】使用云服务器跑深度学习代码

1.算力市场 租用服务器,选择自己心仪的服务器2.镜像可以选择一些基础的镜像,社区镜像里是git上有的环境。3.上传文件在文件存储中,选择上传的区,在右边点击上传,选择自己的文件上传到云服务器中。

weixin_45768644的博客 3705

2023华为od机试【最小循环子数组】C++

2023华为od机试【最小循环子数组】C++ 给定一个由若干整数组成的数组nums,请检查数组是否是由某个子数组重复循环拼接而成,请输出这个最小的子数组。

MISAYAONE的博客 2185

5 分钟装好 dsh-purge:DeepSeek Harness 破甲插件从安装到一键还原

同一个敏感问题,Web 端被拒,桌面端却拿到完整回答?先别急着怪模型"双标"。dsh-purge 是装在本机官方 DeepSeek Harness 上的红队评测插件:拆层排查拦截点、按模型换破甲提示词,全程有备份、可一键还原。这篇带你装好、跑通、验证,一次讲完。 ## 先看你装完能得到什么 装完它承担的工作可以归成四块: | 能力 | 一句话说明 | 操作入口 | |---|---|---|

gitblog_00258的博客 1011

贪婪投影三角化算法

贪婪投影三角化算法是一种利用点云数据进行曲面重建的方法。其基本思想是通过迭代地连接点云中的邻近点来生成三角形,从而构建出整个表面。这种方法被称为“贪婪”,因为它在每一步仅考虑当前最优的策略,而不考虑全局的最优性。

twnkie的博客 1567

Folia 安装指南:把全屏歌词动画装进 Windows / macOS / Linux,15 分钟跑起来

Folia 是把歌词渲染成全屏沉浸式动画的音乐播放器,支持本地曲库和网易云、QQ 音乐等在线音源。下面带你安装桌面版、接通音源并播放一首带歌词的歌,顺利的话 10 到 15 分钟走完。 [![Folia 安装完成后的全屏歌词动画效果,Lumi 主题](https://raw.gitcode.com/GitHub_Trending/fo/folia-major/raw/7a5f975e337e5b

gitblog_00310的博客 681

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

LeetCode 213. 打家劫舍 II:环形数组场景下的动态规划解法(doocs/leetcode 多语言实现详解)

> 本文以 doocs/leetcode 仓库中 [213. House Robber II](https://link.gitcode.com/i/a47d6bf3e252862bf3166c2ec3b9508f) 的官方题解为骨架,完整讲解「环形打家劫舍」这道中等难度动态规划题的题目要点、环状问题到线性问题的归约思路、滚动变量状态设计,并结合仓库内 Python3、Java、C++、Go、Ty

gitblog_00536的博客 238

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

数据结构与算法笔记:字典序最大问题分析

字典序最大问题 问题描述 给定一个1到n的排列(无序状态的),依次插入到栈中,在每时每刻都可以多次从栈中弹出栈顶 问:应如何使得弹出栈顶的序列的字典序最大,并输出这个序列 问题分析 什么是字典序 比如两个序列:5,4,3,2,1和1,2,3,4,5 这两个中第一个的字典序最大 每个位置上的数字比其他序列上同一位置的数字要大 比如:第一位置中5比1大,第二位置中4比2大这样 即:字典序最大 = 从左向右看这个序列,每个数字都尽量大 题目给定一个1到n的排列,每个数字只出现一次 要使出栈的字典序最大

Wang的专栏 4393

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

数据结构与算法笔记:农夫过河问题python3实现

问题描述 农夫(Human)过河。一个农夫带着一只狼(Wolf),一只羊(Sheep)和一些菜(Vegetable)过河。河边只有一条船,由于船太小,只能装下农夫和他的一样东西。在无人看管的情况下,狼要吃羊,羊要吃菜,请问农夫如何才能使三样东西平安过河? 要求: 输出一行,为最终的过河方式,方案格式为 过河人员、回来人员、过河人员、回来人员、…、过河人员。 过去和回来的人员之间,用空格隔开。 以四...

Wang的专栏 3374

数据结构与算法笔记:计算思维之经典农夫过河问题C++实现

农夫、羊、狼、菜的过河问题 问题描述 角色:农夫,羊,狼,菜 条件1:船很小,只能装下农夫和其他一个角色 条件2:无人看管,羊吃菜,狼吃羊 问:如何让其他三种角色被农夫平安带着过河? 相关分析 我们可以先用人脑尝试一下相关渡河策略 1 ) 先渡狼,人回来再渡菜,人回来再渡羊 2 ) 先渡菜,人回来再渡狼,人回来再渡羊 以上两种很好想到,而且我们可以知道羊这种角色是不能先渡河过去的,羊需要最后再渡 如果先渡了羊了,之后再渡任何其他角色,都要将羊带回来 可以参考小游戏:http://gameschool

Wang的专栏 3312

数据结构与算法笔记:图搜索之DFS详解

图搜索 Graph Search 图搜索的分类 BFS广度优先(宽搜) DFS深度优先(深搜) !!!本文详解!!! 深度优先搜索DFS 深度优先遍历DFS, 这个策略其实是非常stupid or simple的,比BSF要简单的多 同样,我们可以通过一个故事来开始 在古希腊神话中, Ariadne是Crete的国王Minos的公主,她给忒修斯(Theseus)一个线团 使得忒修斯成功进入迷宫杀死牛头怪兽,但事后忒修斯抛弃了她 这是一个有道德意义的故事又或者存在不同的版本, 但不是我们的研究的对象

Wang的专栏 3119

数据结构与算法笔记:计算思维之人鬼渡河问题

人鬼渡河问题 1 ) 问题描述 目标:将东岸的3人3鬼通过一只小船安全转移到西岸,希望摆渡次数尽可能少 条件 船的容量有限,一次最多只能坐2人(或2鬼或1人1鬼) 无论是在河的东岸还是在河的西岸,一旦鬼数多于人数,则人将被鬼吃掉 怎样渡河的大权掌握在人的手中 说明:划船的时间忽略不计。船一靠岸即将船与岸视为一体,人和鬼即使还没有下 船也视为已上岸 任务:编写程序,求出一种渡河方案 备注:图片托管于github,请确保网络的可访问性 2 ) 分析 目标是找

Wang的专栏 2447

数据结构与算法之二叉树: LeetCode 701. 二叉搜索树中的插入操作 (Ts版)

1 ) 方案1:模拟。2 ) 方案2:递归。

Wang的专栏 2270

数据结构与算法笔记:计算思维之下楼梯台阶和象棋跳马问题

下台阶问题 1 ) 问题描述 从楼上走到楼下共有 h 个台阶,每一步有三种走法 走一个台阶; 走二个台阶; 走三个台阶。 问:一共可以走出多少种方案? 即共要多少步? 每一步走几级台阶? 2 ) 分析 初始思路 我们根据题目给定的场景,先简单模拟一下,设定 h=4h=4h=4 备注:图片托管于github,请确保网络的可访问性 如上图所示, 这里有4阶楼梯, 红色数字代表每一步走几级台阶 这里枚举了4层台阶的所有可能情况, 但是不管具体有几级台阶,下

Wang的专栏 2111

Python笔记:滑动验证码的识别算法

概述 用程序识别极验滑动验证码的验证,包括分析识别思路、识别缺口位置、生成滑块拖动路径、模拟实现滑块拼合通过验证等步骤。 准备工作 使用Python库是Selenium,浏览器为Chrome。请确保已安装Selenium库和ChromeDriver浏览器驱动。 关于极验滑动验证码: 极验滑动验证码官网为:http://www.geetest.com/ 验证方式为拖动滑块拼合图像,若图像完全拼合...

Wang的专栏 2103

数据结构与算法之堆: LeetCode 295. 数据流的中位数 (Ts版)

/ 返回 1.5 ((1 + 2) / 2)中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。3 ) 方案3:有序集合 + 双指针。2 ) 方案2:优先队列-优化版。1 ) 方案1:优先队列。

Wang的专栏 1907

数据结构与算法笔记:计算思维之谁做的好事与刑侦作案问题

谁做的好事 清华附中有四位同学中的一位做了好事,不留名,表扬信来了之后,校长问这四位是谁做的好事。 A说:不是我。 B说:是C。 C说:是D。 D说:他胡说。 已知:三个人说的是真话,一个人说的是假话。 现在请你根据这些信息,编写程序找出做了好事的人。 分析 将四个人说的四句话(自然语言)转换成计算机可以计算的式子, 可使用循环枚举的方式来判断 (1) 思路一:通过字符表示人 先定义一个字符变量 thisman 表示要寻找的做了好事的人的“名字(代号)”(A、B、C、D),即 char this

Wang的专栏 1829

数据结构与算法笔记:图搜索之BFS详解

图搜索 Graph Search 图搜索的分类 BFS广度优先(宽搜) DFS深度优先(深搜) 广度优先搜索BFS 我们可以用比喻来说明广度优先搜索算法 在一片草木枯黄的深秋草原上,在草原的某一处出现了一处野火 一开始的时候野火集中于一点之上,在这点野火耗尽当前植被变成灰烬之前点燃了周围的植被 比如节点s是初始火种,假设我们手中有一个秒表,每过1秒,我们的大火会向外迈进一步 这个过程只能向外,不能向内,因为只能点燃植被,不能把灰烬点燃 蓝色的点是即将变为灰烬的点,红色的点是刚被点燃的点,灰色的圆形或

Wang的专栏 1791
上一篇: 数据结构与算法之动态规划: LeetCode 70. 爬楼梯 (Ts, Py, Go版)
下一篇: 数据结构与算法之动态规划: LeetCode 63. 不同路径 II (Ts, Py, Go版)
Wang's Blog
博客等级 码龄12年 7434粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值