刷爆力扣之到最近的人的最大距离

简介: 刷爆力扣之到最近的人的最大距离

一 🏠 题目描述

849. 到最近的人的最大距离


给你一个数组 seats 表示一排座位,其中 seats[i] = 1 代表有人坐在第 i 个座位上,

seats[i] =0 代表座位 i 上是空的(下标从 0 开始)。

至少有一个空座位,且至少有一人已经坐在座位上。


亚历克斯希望坐在一个能够使他与离他最近的人之间的距离达到最大化的座位上。


返回他到离他最近的人的最大距离。


示例 1:




输入:seats = [1,0,0,0,1,0,1]
输出:2
解释:
如果亚历克斯坐在第二个空位(seats[2])上,他到离他最近的人的距离为 2如果亚历克斯坐在其它任何一个空位上,他到离他最近的人的距离为 1因此,他到离他最近的人的最大距离是 2

示例 2:


输入:seats = [1,0,0,0]
输出:3
解释:
如果亚历克斯坐在最后一个座位上,他离最近的人有 3 个座位远。
这是可能的最大距离,所以答案是 3

示例 3:


输入:seats = [0,1]
输出:1

提示:


2 <= seats.length <=2 * 104seats[i] 为 01

至少有一个 空座位

至少有一个 座位上有人


二 🏠破题思路

2.1 🚀 关键信息

解决问题第一步,当然先提取题目字面上的关键信息 😎😎😎


数组 seats 表示一排座位,其中 seats[i] = 1 代表有人坐在第 i 个座位上,seats[i] = 0 代表座位 i 上是空的,至少有一个空座位,且至少有一人已经坐在座位上。找到一个能够使离最近的人距离最大化的座位 🌺🌺🌺



提取完题目中的关键信息后,直接进入第二阶段,思路整理 😃😃😃



2.2 🚀 思路整理

分类讨论法:对于 seats 中 一段 [X1 , X2] 距离( X1,X2 表示两个已占座位且不为左右两端)


若 X2 - X1 + 1 可以整除 2 ,则离最近人最大化距离为 X2 (X2 - X1 + 1) / 2


若 X2 - X1 + 1 不可以整除 2 则离最近人最大化距离为 (X2 - X1 + 1) / 2 + 1 🌷🌷🌷



那么对于两端 [ 0 , x ] 和 [ x , end ] ( x 表示已占座位)

[ 0 , x ] ,离最近人最大化距离为 x
[ x , end ],离最近人最大化距离为 end - x 🐌🐌🐌



整理完解题思路后,直接进入第三阶段,代码实现 😃😃😃



三 🏠 代码详解

3.1 🚀 代码实现

按照我们刚才的破题思路,直接代码走起来 👇👇👇👇


int maxDistToClosest(std::vector<int>& seats) {
  int maxDist =0, currentDist =0, len = seats.size(); //初始化最大距离, 当前距离, 数组长度
for (int i =0; i < len; i++) { //遍历输入数组
if (seats[i] ==0) { //若当前座位为空
++currentDist; //则当前距离加加
    continue; //继续循环
  } 
if (currentDist - i !=0) { //不是最左端
if (currentDist % 2==0) currentDist = currentDist / 2; //可以整除 2else currentDist = currentDist / 2+1;  //不可以整除 2  } 
  maxDist = std::max(maxDist, currentDist); //把最大距离赋值给 maxDist
  currentDist =0; //赋值后将 currentDist 清零
  }
if (seats[len -1] ==0) maxDist = std::max(maxDist, currentDist); //处理0结尾的情况
  return maxDist; //返回最大距离
}


3.2 🚀 细节解析

看完 👀👀👀 全注释版的代码实现后,相信看官大大对整体逻辑已经是大写的 OK 了 😃😃😃


那么我们挖掘上述实现的晦涩细节 😖😖😖 进行解析,直接开干,走起来 👇👇👇👇


if (currentDist - i !=0) { //不是最左端
if (currentDist % 2==0) currentDist = currentDist / 2; //可以整除 2else currentDist = currentDist / 2+1;  //不可以整除 2} 

if 分支内的判断对应着


若 X2 - X1 + 1 可以整除 2 ,则离最近人最大化距离为 X2 (X2 - X1 + 1) / 2


若 X2 - X1 + 1 不可以整除 2 则离最近人最大化距离为 (X2 - X1 + 1) / 2 + 1 🐳🐳🐳



if (currentDist - i !=0) ... //不是最左端
maxDist = std::max(maxDist, currentDist); //把最大距离赋值给 maxDist

这里若 currentDist - i == 0 ,则对应着 [ 0 , x ] ,离最近人最大化距离为 x 🐌🐌🐌



if (seats[len -1] ==0) maxDist = std::max(maxDist, currentDist); //处理0结尾的情况

最后的分支判断对应着 [ x , end ],离最近人最大化距离为 end - x


官网解答与该法效率接近,但不易理解,故不赘述,如感兴趣可自行查阅 🌼🌼🌼



四 🏠 心路历程

为方便各位看官大大了解博主真实刷题过程,我把当时状态纯纯真实还原,记录在心路历程这一小节,不感兴趣的小伙伴可以直接跳过哈


博主在第一阶段提取 🚀 关键信息并没有问题,在第二阶段 🚀 思路整理没有问题(上述实现和题解博主原创)



相关文章
|
程序员 测试技术 开发工具
成功软件开发者的9种编程习惯
成功软件开发者的9种编程习惯
255 1
|
设计模式 算法 PHP
深入理解PHP中的数组操作探索编程之美:从代码到架构的思维转变
【8月更文挑战第24天】在PHP编程中,数组是基础且强大的数据结构。本文将通过浅显易懂的方式,介绍如何在PHP中高效地操作数组,包括创建、遍历、排序和过滤等常见任务。无论你是初学者还是有经验的开发者,这篇文章都会带给你新的启示。 【8月更文挑战第24天】在编程的世界中,代码不仅仅是冰冷的字符排列,它承载着思想、解决问题的智慧和创新的灵魂。本文将通过个人的技术感悟,带领读者从编写单一功能的代码片段出发,逐步深入到整个软件架构的设计哲学,探索如何将代码块转化为高效、可维护和可扩展的系统。我们将一起见证,当代码与架构思维相结合时,如何引发技术实践的革命性飞跃。
|
Java 开发者
解锁Java多线程编程中的死锁之谜
解锁Java多线程编程中的死锁之谜
103 0
|
C语言
【C语言】搞懂内存函数
本文介绍memcpy的使用和模拟实现、memmove的使用和模拟实现、memcmp使用、memset使用
127 0
|
容器
2037. 使每位学生都有座位的最少移动次数
一个房间里有 n 个座位和 n 名学生,房间用一个数轴表示。给你一个长度为 n 的数组 seats ,其中 seats[i] 是第 i 个座位的位置。同时给你一个长度为 n 的数组 students ,其中 students[j] 是第 j 位学生的位置。
189 0
|
弹性计算 NoSQL Linux
安装宝塔、WebIDE
本文介绍了使用ECS云服务器搭建博客的操作及部分日常实验。
301 2
|
运维 Java 关系型数据库
Day5-安装Linux服务器面板管理工具
阿里云云服务器ecs第五天打卡
Day5-安装Linux服务器面板管理工具
|
Linux
oeasy 教您玩转linux 010303文件管理器 nautilus
oeasy 教您玩转linux 010303文件管理器 nautilus
324 0
|
5天前
|
人工智能 运维 安全
|
3天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!