蓝桥每日打卡--打家劫舍4
#蓝桥#JAVA#打家劫舍4
题目描述
沿街有一排连续的房屋。每间房屋内都藏有一定的现金。现在有一位小偷计划从这些房屋中窃取现金。
由于相邻的房屋装有相互连通的防盗系统,所以小偷 不会窃取相邻的房屋 。
小偷的 窃取能力 定义为他在窃取过程中能从单间房屋中窃取的 最大金额 。
给你一个整数数组 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 。
解题思路
本题采用二分查找算法来高效地找出满足条件的最小能力值。二分查找的前提是问题的解空间具有单调性,在本题中,能力值越大,能够偷取的不相邻房屋数量就可能越多,因此可以利用二分查找不断缩小可能的能力值范围,直到找到最小的满足条件的能力值。
具体步骤
1. 确定二分查找的左右边界
- 左边界
lower:通过Arrays.stream(nums).min().getAsInt()找出数组nums中的最小值。这是因为最小的能力值至少要能够偷取到数组中金额最小的房屋。 - 右边界
upper:通过Arrays.stream(nums).max().getAsInt()找出数组nums中的最大值。这是因为最大的能力值最多为数组中金额最大的房屋的金额。
2. 二分查找过程
- 使用
while(lower <= upper)循环进行二分查找,只要左边界小于等于右边界,就继续查找。 - 在每次循环中,计算当前左右边界的中间值
middle,作为本次猜测的能力值。
3. 检查当前能力值是否满足条件
- 初始化计数器
count为 0,用于记录在当前能力值下可以偷取的不相邻房屋的数量。 - 初始化布尔变量
visited为false,用于标记上一个房屋是否被偷取。 - 遍历数组
nums中的每个元素x:- 如果
x <= middle且!visited,说明当前房屋的金额小于等于当前猜测的能力值,并且上一个房屋没有被偷取,此时可以偷取当前房屋,将count加 1,并将visited标记为true。 - 否则,将
visited标记为false,表示当前房屋不被偷取。
- 如果
4. 根据检查结果调整二分查找的边界
- 如果
count >= k,说明在当前能力值下可以偷取到至少k个不相邻的房屋,当前能力值可能过大,将右边界upper更新为middle - 1,缩小查找范围。 - 否则,说明当前能力值过小,将左边界
lower更新为middle + 1,扩大查找范围。
5. 返回结果
- 当二分查找结束后,左边界
lower即为满足条件的最小能力值,将其返回。
class Solution {public int minCapability(int[] nums, int k) {int lower = Arrays.stream(nums).min().getAsInt();// 使用 Java 8 的 Stream API 对数组 nums 进行操作// Arrays.stream(nums) 将数组转换为流// min() 方法找出流中的最小值// getAsInt() 方法将 OptionalInt 类型的结果转换为 int 类型// 最终将数组中的最小值赋给变量 lower,作为二分查找的左边界int upper = Arrays.stream(nums).max().getAsInt();// 同样使用 Stream API// max() 方法找出流中的最大值// getAsInt() 方法将结果转换为 int 类型// 把数组中的最大值赋给变量 upper,作为二分查找的右边界while(lower <= upper){// 开始二分查找的循环,只要左边界小于等于右边界,就继续循环int middle = (lower + upper)/2;// 计算当前左右边界的中间值,作为本次猜测的能力值int count = 0;// 初始化一个计数器 count,用于记录在当前能力值下可以偷取的房屋数量boolean visited = false;// 初始化一个布尔变量 visited,用于标记上一个房屋是否被偷取for(int x :nums){// 遍历数组 nums 中的每个元素 xif(x <= middle&&!visited){// 如果当前房屋的金额 x 小于等于当前猜测的能力值 middle,并且上一个房屋没有被偷取count ++;// 则偷取当前房屋,计数器 count 加 1visited = true;// 标记当前房屋已被偷取}else{visited = false;// 否则,标记当前房屋未被偷取}}if(count >= k){// 如果在当前能力值下可以偷取的房屋数量 count 大于等于要求的数量 kupper = middle -1;// 说明当前能力值可能过大,将右边界 upper 更新为 middle - 1,缩小查找范围}else{lower = middle+1;// 否则,说明当前能力值过小,将左边界 lower 更新为 middle + 1,扩大查找范围}}return lower;// 当二分查找结束后,左边界 lower 即为满足条件的最小能力值,将其返回}
}
同时,利用二分法这里给出了更优的解决方案
class Solution {public int minCapability(int[] nums, int k) {int n = nums.length;int max = 0, min = Integer.MAX_VALUE;// 初始化 max 为 0,用于存储数组中的最大值// 初始化 min 为 Integer.MAX_VALUE,用于存储数组中的最小值for(int x:nums){// 遍历数组 nums 中的每个元素 xif(x < min) min = x;// 如果当前元素 x 小于 min,则更新 min 为 xif(x > max) max = x;// 如果当前元素 x 大于 max,则更新 max 为 x}int left = min, right = max;// 初始化二分查找的左边界 left 为数组的最小值// 初始化二分查找的右边界 right 为数组的最大值while(left <= right){// 开始二分查找的循环,只要左边界小于等于右边界,就继续查找int mid = left + right >> 1;// 计算当前左右边界的中间值 mid,作为本次猜测的能力值// 这里使用位运算 >> 1 代替除以 2,以提高计算效率int count = 0;// 初始化计数器 count,用于记录在当前能力值下可以偷取的房屋数量for(int i = 0; i < n; ++i){// 遍历数组 numsif(nums[i] <= mid){// 如果当前房屋的金额 nums[i] 小于等于当前猜测的能力值 midif(++count == k)break;// 先将计数器 count 加 1,若加 1 后 count 等于 k,说明已经找到了 k 个满足条件的房屋,退出循环++i;// 跳过下一个房屋,确保偷取的房屋不相邻}}if(count >= k)right = mid - 1;// 如果在当前能力值下可以偷取的房屋数量 count 大于等于 k,说明当前能力值可能过大,将右边界 right 更新为 mid - 1,缩小查找范围elseleft = mid + 1;// 否则,说明当前能力值过小,将左边界 left 更新为 mid + 1,扩大查找范围}return left;// 当二分查找结束后,左边界 left 即为满足条件的最小能力值,将其返回}
}
相关文章:
蓝桥每日打卡--打家劫舍4
#蓝桥#JAVA#打家劫舍4 题目描述 沿街有一排连续的房屋。每间房屋内都藏有一定的现金。现在有一位小偷计划从这些房屋中窃取现金。 由于相邻的房屋装有相互连通的防盗系统,所以小偷 不会窃取相邻的房屋 。 小偷的 窃取能力 定义为他在窃取过程中能从单间房屋中窃…...
Intel Alder Lake N200桌面级处理器 详细介绍
1.Intel Alder Lake N200桌面级处理器 详细介绍 Intel Processor N200 是一款属于 Alder Lake-N 系列的入门级处理器,以下是其详细介绍: 基本规格 架构:Alder Lake-N,采用 Gracemont 架构的高效能核心。 核心与线程࿱…...
AudioTrack
AudioTrack是Android Audio系统提供给应用开发者(java/C)的API,用于操作音频播放的数据通路。MeidaPlayer在播放音乐时用到的是它,我们可以也可以直接使用AudioTrack进行音频播放。它是最基本的音频数据输出类。 AudioTrack.java…...
多条件排序(C# and Lua)
C# 升序排序 OrderBy 按升序对序列的元素进行排序 ThenBy 按升序对序列中的元素执行后续排序 降序排序 OrderByDescending 按降序对序列的元素排序 ThenByDescending 按降序对序列中的元素执行后续排序 public class Fruit {public int id;public string name;publi…...
人工智能之数学基础:线性方程组求解的得力助手——增广矩阵
本文重点 增广矩阵是一个极具实用价值的工具,尤其在处理线性方程组时,它展现了卓越的功效。通过整合系数和常数项,增广矩阵简化了计算过程并提供了判断方程组解集的有效方法。 增广矩阵的起源与定义 增广矩阵的概念源于线性方程组求解的需求。在解决线性方程组时,我们常…...
Vue3 + ECharts 数据可视化实战指南
一、为什么选择ECharts? 百度开源的成熟可视化库 支持30种图表类型 完善的文档和社区支持 与Vue3完美兼容 二、环境搭建 1. 创建Vue3项目 npm create vuelatest # 选择TypeScript、Pinia等按需配置 2. 安装核心依赖 npm install echarts vue-echarts vueus…...
关于Flask框架30道面试题及解析
文章目录 基础概念1. 什么是Flask?其核心特性是什么?2. Flask和Django的主要区别?3. 解释Flask中的“路由”概念。如何定义动态路由?核心组件4. Flask的请求上下文(Request Context)和应用上下文(Application Context)有什么区别?5. 如何访问请求参数?POST和GET方法的…...
服务安全认证概述与基础认证方式
文章目录 1. 引言1.1 认证与授权的区别1.2 认证方式的演进 2. 基础认证方式2.1 HTTP Basic Authentication2.2 API Key 认证2.3 HMAC-SHA256 签名认证2.4 JWT(JSON Web Token) 3. 认证方式对比与总结3.1 认证方式对比3.2 如何选择合适的认证方式…...
【Android Studio开发】生命周期、Activity和组件通信(上)
零、前期配置 1.【Android】模式 2.点击【运行】,弹出模拟器 右侧是模拟机,显示Hello World 3. 打开【activity_main.xml】文件,点击【Design】,然后点击【Component Tree】 在弹出的Component Tree中右键【main】,选择【Conver…...
【ES】Elasticsearch学习
文章目录 简单的安装 简单的安装 参考:https://blog.csdn.net/smilehappiness/article/details/118466378 官网:https://www.elastic.co/guide/en/elasticsearch/reference/current/targz.html 下载:https://www.elastic.co/cn/downloads/e…...
实验三 Python 数据可视化 Python 聚类-K-means(CQUPT)
一、实验目的 Python 数据可视化: 1、学习使用 jieba、wordcloud 等类库生成词云图。 2、学习使用 Matplotlib 库进行数据可视化。 Python 聚类-K-means: 1、理解聚类非监督学习方法的基本原理。 2、掌握 Python、numpy、pandas、sklearn 实现聚类…...
【STM32】SPI通信协议W25Q64Flash存储器芯片(学习笔记)
通信接口部分有介绍SPI:【STM32】USART串口协议&串口外设-学习笔记-CSDN博客 SPI通信协议 SPI通信 SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线四根通信线:SCK(Serial Clock&…...
JavaScript实现一个函数,将数组扁平化(flatten),即把多维数组转为一维数组。
大白话实现一个函数,将数组扁平化(flatten),即把多维数组转为一维数组。 思路 实现数组扁平化的基本思路是遍历数组中的每个元素,如果元素是数组,就递归地将其扁平化并添加到结果数组中;如果元…...
SpringBoot最佳实践之 - 使用AOP记录操作日志
1. 前言 本篇博客是个人在工作中遇到的需求。针对此需求,开发了具体的实现代码。并不是普适的记录操作日志的方式。以阅读本篇博客的朋友,可以参考此篇博客中记录日志的方式,可能会对你有些许帮助和启发。 2. 需求描述 有一个后台管理系统…...
第六届机电一体化技术与智能制造国际学术会议(ICMTIM 2025)
重要信息 4月11-13日 南京江北新区工业大学亚朵酒店 www.icmtim.org(点击了解参会投稿等) 简介 由南京工业大学主办,南京工业大学电气工程与控制科学学院、中国矿业大学、黑龙江大学、江苏省自动化学会承办的第六届机电一体化技术…...
numpy学习笔记4:np.arange(0, 10, 2) 的详细解释
numpy学习笔记4:np.arange(0, 10, 2) 的详细解释 以下是 np.arange(0, 10, 2) 的详细解释: 1. 函数作用 np.arange() 是 NumPy 中用于生成均匀间隔数值序列的函数,类似于 Python 内置的 range(),但返回的是 NumPy 数组而非列表&…...
期刊分区表2025年名单下载(经济学、管理学)
2025年期刊分区表包括SCIE、SSCI、A&HCI、ESCI和OAJ,共设置了包括自然科学、社会科学和人文科学在内的21个大类 本次分享的是期刊分区表2025年名单经济学类、管理学类,一共7631025条 一、数据介绍 数据名称:期刊分区表2025年名单 数据…...
八股学习-JUC java并发编程
本文仅供个人学习使用,参考资料:JMM(Java 内存模型)详解 | JavaGuide 线程基础概念 用户线程:由用户空间程序管理和调度的线程,运行在用户空间。 内核线程:由操作系统内核管理和调度的线程&…...
嵌入式笔记 | 正点原子STM32F103ZET6 4 | 中断补充
1. 外设引脚重映射 1.1 定义 在STM32中,每个外设的引脚都有默认的GPIO端口,但有些引脚可以通过重映射寄存器将功能映射到其他端口。这种机制称为引脚重映射,主要用于解决引脚复用冲突或优化PCB布线。 1.2 重映射的类型 部分重映射&#x…...
PostgreSQL_数据下载并保存(psycopg2)
目录 前置: 1 数据下载 1.1 多个股票多个交易日 1.2 一个交易日所有股票 2 数据保存,使用python中的psycopg2包 2.1 在PyCharm中创建新项目,并安装包 2.2 代码-多个股票多个交易日 2.3 代码-一个交易日所有股票 2.4 在 pgAdmin4 中…...
启明星辰春招面试题
《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…...
边缘计算革命:重构软件架构的范式与未来
摘要 边缘计算通过将算力下沉至网络边缘,正在颠覆传统中心化软件架构的设计逻辑。本文系统分析了边缘计算对软件架构的范式革新,包括分布式分层架构、实时资源调度、安全防护体系等技术变革,并结合工业物联网、智慧医疗等场景案例,…...
【读点论文】Chain Replication for Supporting High Throughput and Availability
在分布式系统中,强一致性往往和高可用、高吞吐是矛盾的。比如传统的关系型数据库,其保证了强一致性,但往往牺牲了可用性和吞吐量。而像 NoSQL 数据库,虽然其吞吐量、和扩展性很高,但往往只支持最终一致性,无…...
Servlet、Servlet的5个接口方法、生命周期、以及模拟实现 HttpServlet 来写接口的基本原理
DAY15.1 Java核心基础 Servlet Servlet是一个接口,是java的基础,java之所以编写web的程序,接收请求并响应,就是因为Sevlet接口 Java 类实现了Servlet接口的时候就可以接收并响应请求,成为web服务器 Web服务器就是接…...
深入了解 C# 中的 LINQ:功能、语法与应用解析
1. 什么是 LINQ? LINQ(Language Integrated Query,语言集成查询)是 C# 和其他 .NET 语言中的一种强大的查询功能,它允许开发者在语言中直接执行查询操作。LINQ 使得开发者可以使用 C# 语法(或 VB.NET&…...
贝叶斯公式的一个直观解释
E E E:抓到娃娃 H H H:坐地铁 H ˉ \bar H Hˉ:坐公交 P ( E ) P ( H ) P ( E ∣ H ) P ( H ‾ ) P ( E ∣ H ‾ ) P({E}) P({H}) P({E} \mid {H}) {P}(\overline{{H}}) {P}({E} \mid \overline{{H}}) P(E)P(H)P(E∣H)P(H)P(E∣H) P (…...
Java 大视界 -- Java 大数据分布式计算中的通信优化与网络拓扑设计(145)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
reconstruct_3d_object_model_for_matching例子
文章目录 1.获取om3文件2.准备可视化3.准备3D可视化4.读取3D模型5.显示成对注册结果16.显示成对注册结果27.联合注册模型8.处理图像8.1子采样8.2 图像计算与平滑8.3 三角测量 9.基于表面做3D匹配10.评估模型准确度10.1 在场景中找到模型10.2 计算模型和场景之间的距离 11.立体系…...
【JavaWeb学习Day27】
Tlias前端 员工管理 条件分页查询: 页面布局 搜索栏: <!-- 搜索栏 --><div class"container"><el-form :inline"true" :model"searchEmp" class"demo-form-inline"><el-form-item label…...
Webrtc编译官方示例实现视频通话
Webrtc编译官方示例实现视频通话 前言 webrtc官网demo中给了一个供我们学习和应用webrtc的一个很好的例子:peerconnection,这期我们就来编译和运行下这个程序看看视频通话的效果以。 1、打开源码工程 继上期源码编译完成后,我们使用vs打开…...
