【算法刷题 | 动态规划08】6.9(单词拆分、打家劫舍、打家劫舍||)

在这里插入图片描述

文章目录

  • 21.单词拆分
    • 21.1题目
    • 21.2解法:动规
      • 21.2.1动规思路
      • 21.2.2代码实现
  • 22.打家劫舍
    • 22.1题目
    • 22.2解法:动规
      • 22.2.1动规思路
      • 22.2.2代码实现
  • 23.打家劫舍||
    • 23.1题目
    • 23.2解法:动规
      • 23.2.1动规思路
      • 23.2.2代码实现

21.单词拆分

21.1题目

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true

**注意:**不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。

  • 示例一:
输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以由 "leet" 和 "code" 拼接成。
  • 示例二:
输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以由 "apple" "pen" "apple" 拼接成。注意,你可以重复使用字典中的单词

21.2解法:动规

21.2.1动规思路

image-20240609094110964

21.2.2代码实现

	public boolean wordBreak(String s, List<String> wordDict) {boolean[] dp=new boolean[s.length()+1];dp[0]=true;//先遍历背包for(int j=0;j<=s.length();j++){//再遍历物品for(String word:wordDict){int len=word.length();if( j>=len && dp[j-len] && word.equals(s.substring(j-len,j))){//若dp[i]为true且[i,j]出现在字典中dp[j]=true;break;}}}return dp[s.length()];}

22.打家劫舍

22.1题目

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

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

  • 示例一:
输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。
  • 示例二:
输入:[2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。偷窃到的最高金额 = 2 + 9 + 1 = 12 。

22.2解法:动规

22.2.1动规思路

  1. 确定dp数组以及下标:dp[i]:下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]
  2. 确定递推公式:偷/不偷:dp[i]=Math.max(nums[i]+dp[i-2],dp[i-1])
  3. dp数组初始化:dp[0]=nums[0];dp[1]为nums[0]、nums[1]两者的最大者
  4. 确定遍历顺序:从前往后

22.2.2代码实现

	public int rob(int[] nums) {if(nums.length==1){return nums[0];}int[] dp=new int[nums.length];dp[0]=nums[0];dp[1]=nums[0]>nums[1]?nums[0]:nums[1];for(int i=2;i<nums.length;i++){//取、不取dp[i]=Math.max(nums[i]+dp[i-2],dp[i-1]);}return dp[nums.length-1];}

23.打家劫舍||

23.1题目

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

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

  • 示例一:
输入:nums = [2,3,2]
输出:3
解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。
  • 示例二:
输入:nums = [1,2,3,1]
输出:4
解释:你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。

23.2解法:动规

23.2.1动规思路

  1. 与上一题:打家劫舍不同,该题房屋是呈环状的,即第一个房屋和最后一个房屋是连在一起的

  2. 情况一:取第一个房屋:

    image-20240609200503083

  3. 情况二:取最后一个房屋:、

    image-20240609200528695

23.2.2代码实现

	public int rob(int[] nums) {if(nums.length==1){return nums[0];}return Math.max(robRange(nums,0,nums.length-2),robRange(nums,1,nums.length-1));}//寻找区间[start,end]的最大金额值private int robRange(int[] nums,int start,int end){if(start==end){return nums[start];}int[] dp=new int[nums.length];dp[start]=nums[start];dp[start+1]=Math.max(nums[start],nums[start+1]);for(int i=start+2;i<=end;i++){dp[i]=Math.max(nums[i]+dp[i-2],dp[i-1]);}return dp[end];}

在这里插入图片描述

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

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

相关文章

java中的异常-异常处理(try、catch、finally、throw、throws)+自定义异常

一、概述 1、java程序员在编写程序时提前编写好对异常的处理程序&#xff0c;在程序发生异常时就可以执行预先设定好的处理程序&#xff0c;处理程序执行完之后&#xff0c;可以继续向后执行后面的程序 2、异常处理程序是在程序执行出现异常时才执行的 二、5个关键字 1、tr…

在CentOS 7.9上安装和配置mitmproxy的详细步骤

以下是在CentOS 7.9上安装和配置mitmproxy的详细步骤&#xff1a; 更新系统&#xff1a;首先&#xff0c;打开终端并运行以下命令来更新您的系统&#xff1a; sudo yum update这将确保所有的包都是最新的。 安装Python和pip&#xff1a;mitmproxy需要Python 3.6或更高版本。Ce…

Redis实战篇02

1.分布式锁Redisson 简单介绍&#xff1a; 使用setnx可能会出现的极端问题&#xff1a; Redisson的简介&#xff1a; 简单的使用&#xff1a; 业务代码的改造&#xff1a; private void handleVoucherOrder(VoucherOrder voucherOrder) {Long userId voucherOrder.getUserI…

2024真机项目

项目需求&#xff1a; 1. 172.25.250.101 主机上的 Web 服务要求提供 www.exam.com 加密站点&#xff0c;该站点在任何路由可达 的主机上被访问&#xff0c;页面内容显示为 "Hello&#xff0c;Welcome to www.exam.com !"&#xff0c;并提供 content.exam.com/yum/A…

数据:人工智能的基石 | Scale AI 创始人兼 CEO 亚历山大·王的创业故事与行业洞见

引言 在人工智能领域&#xff0c;数据被誉为“新石油”&#xff0c;其重要性不言而喻。随着GPT-4的问世&#xff0c;AI技术迎来了新的浪潮。众多年轻创业者纷纷投身这一领域&#xff0c;Scale AI的创始人兼CEO亚历山大王&#xff08;Alexander Wang&#xff09;就是其中的佼佼…

什么是Java?

什么是Java&#xff1f;java是什么&#xff1f;下面我们来总结一下。 java是什么&#xff1f; java是一个静态编程语言&#xff0c;具有强大的多线程特征&#xff0c;目前java不仅采用c语言的优点&#xff0c;还去掉了一些多继承指针&#xff0c;等复杂的概念&#xff0c;我们…

Linux C/C++ 进程控制

Linux C/C 进程控制 1.信号2.进程终止3.调用可执行程序4.进程创建5.僵尸进程6.多进程与信号8.共享内存9.循环队列10. 信号量的基本概念11.多进程的生产消费者模型 1.信号 ​ 信号(signal)是软件中断&#xff0c;是进程之间相互传递消息的一种方法&#xff0c;用于通知进程发生…

回文数java算法

回文数是指从左往右读和从右往左读都一样的数字。要判断一个数字是否是回文数&#xff0c;可以将该数字转换成字符串&#xff0c;然后将字符串分割为字符数组&#xff0c;最后比较数组的对应位置的字符是否相同。 以下是一个判断回文数的Java算法&#xff1a; public static …

Git配置 安装及使用

团队开发的神 找工作必备 环境变量 配置好环境后 打开终端环境 winr cmd 我习惯在桌面打开&#xff0c;然后进入相应的文件夹 &#xff08;文件夹结构&#xff09; &#xff08;个人感觉能用cmd不用git&#xff0c;cmd更好用一些&#xff09; 进入对应的文件夹 填写自己对…

docker安装rabbitmq详解

目录 1、安装 1-1.查看rabbitmq镜像 1-2.下载Rabbitmq的镜像 1-3.创建并运行rabbitmq容器 1-4.查看启动情况 1-5.启动web客户端 1-6.访问rabbitmq的客户端 2..遇到的问题 解决方法: 1、安装 1-1.查看rabbitmq镜像 docker search rabbitmq 1-2.下载Rabbitmq的镜像 拉…

2024.6.9 五

文件区别 文本文件,又各种不同编码方式编码,导致占用空间也会不同 二进制文件,只有0和1,指定软件才能打开 操作文件步骤 先打开文件 用函数open(filename,mode,encoding) 默认打开方式是 ’ r ’ r----只读取,文件指针在文件开头,没有文件报错 w----纯覆写。如果文件存在&am…

国标GB/T 28181详解:校时流程详细说明

目录 一、定义 二、作用 1. 时间同步性 2. 事件记录的准确性 3. 跨平台、跨设备协作 4. 降低时间误差 5. 安全性提升 三、基本要求 四、命令流程 五、协议接口 六、校时效果 1、未校时的情况 2、校时后的效果 七、参考 一、定义 GB28181协议要求所有的监控设…

python后端结合uniapp与uview组件tabs,实现自定义导航按钮与小标签颜色控制

实现效果&#xff08;红框内&#xff09;&#xff1a; 后端api如下&#xff1a; task_api.route(/user/task/states_list, methods[POST, GET]) visitor_token_required def task_states(user):name_list [待接单, 设计中, 交付中, 已完成, 全部]data []color [#F04864, …

HOW - 接口防腐层(Anti-corruption layer)

目录 一、介绍1.1 主要概念1.2 实现方式1.3 示例 二、前端开发领域应用&#xff1a;接口不确定数据防腐层2.1 步骤和技术2.2 示例实现2.3 应用示例 一、介绍 在程序开发领域&#xff0c;防腐层&#xff08;Anti-Corruption Layer&#xff0c;ACL&#xff09;是一种架构模式&am…

CPP初阶:CPP的内存管理模式

目录 一.new和delete操作自定义类型 1.1C语言的内存管理 1.2CPP的内存管理方式 1.3C与CPP内存管理的差异 二.operator new和operator delete函数 三.CPP空间操作符使用深化 3.1 连续内存开辟与释放 3.2 非连续内存开辟与释放 四.new和delete的实现原理 4.1内置类型 4.2…

100道面试必会算法-32-二叉树右视图用栈实现队列

100道面试必会算法-32-二叉树右视图&用栈实现队列 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4]示例 2: 输入: [1,n…

人机环境生态系统智能的流动性

一般来说&#xff0c;流动性可以理解为事物在空间或时间上的转移、变化或运动。在人机环境生态系统中&#xff0c;流动性可以涉及以下几个方面&#xff1a; 信息流动&#xff1a;数据、消息、知识等在系统中的传递和交换。这可能包括传感器收集的数据传输到处理中心&#xff0c…

【内网攻防实战】红日靶场(一)续篇_金票与银票

红日靶场&#xff08;一&#xff09;续篇_权限维持 前情提要当前位置执行目标 PsExec.exe拿下域控2008rdesktop 远程登录win7msf上传文件kail回连马连上win7upload上传PsExec.exe PsExec.exe把win7 带到 2008&#xff08;域控hostname&#xff1a;owa)2008开远程、关防火墙Win7…

OpenCV绘制直线

一 绘制图形 画线 画矩形 画圆 画椭圆 画多边形 绘制字体 二 画线 line(img,开始点&#xff0c;结束点&#xff0c;颜色…) 参数结束 img&#xff1a;在那个图像上画线 开始点,结束点&#xff1a;指定线的开始与结束位置&#xff1b; 颜色&#xff0c;线宽&#xff0c;线体…

java算法中枚举法是怎么运用的

在Java算法中&#xff0c;枚举法是一种通过列举所有可能性来解决问题的方法。它通常用于解决一些较为简单的问题&#xff0c;其中问题的规模较小且可能的解决方案有限。 枚举法的基本思想是列举出所有可能的解&#xff0c;然后依次检查这些解是否满足问题的要求。在Java中&…