题目描述:

在一排座位( seats)中,1 代表有人坐在座位上,0 代表座位上是空的。

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

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

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

示例 1:

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

示例 2:

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

提示:

  1. 1 <= seats.length <= 20000
  2. seats 中只含有 0 和 1,至少有一个 0,且至少有一个 1

要完成的函数:

int maxDistToClosest(vector<int>& seats)

说明:

1.这道题给了一个vector,里面存放着0和1,1表示这个位置有人,0表示没人。现在亚力克斯想坐在一个离最近的人距离最远的座位上,也就是“四周最空旷”的座位。

2.我们之前做过一道跟这道题类似的题目,我们只需做两次循环,一次把所有0的位置跟左边的1比较,得到跟左边的最近的1的位置距离。再跟右边的1比较,得到跟右边的最近的1的位置距离。

每个数都能得到两个位置距离,一个跟左边最近的1比较,一个跟右边最近的1比较,除了最开始的1的左边的数,比如[0,0,1,1]中第一个0和第二个0,只有跟右边的1比较得到的位置距离,还有最后面的1的右边的数,比如[1,1,0,0]中的两个0,只有跟左边的1比较得到的位置距离。

我们得到的两个位置距离,取小的那个。

把每个原本0值对应的得到的位置距离,存在vector中。

最后遍历一遍这个vector,得到最大的位置距离,返回。

在实际代码实现中,我们还可以简化步骤,降低时间复杂度和空间复杂度,代码如下:(附详解)

    int maxDistToClosest(vector<int>& seats)
{
int left,right,s1=seats.size(),max1;
for(left=0;left<s1;left++)//left表示最左边的第一个1的位置
{
if(seats[left]==1)
break;
}
for(int i=left+1;i<s1;i++)//从left的下一位开始,逐个计算跟左边最近的1的距离
{
if(seats[i]==1)//不断更新左边最近的1的位置
left=i;
else//把距离存储在原本的vector中,为了避免混乱,以负数(相反数)的形式存储
seats[i]=-(i-left);
}
for(right=s1-1;right>=0;right--)//right表示最右边的第一个1的位置
{
if(seats[right]==1)
break;
}
if(right!=s1-1)//如果最右边的第一个1不是最后一位,也就是right的右边还有0
max1=-seats[s1-1];//那么max1初始化为……
else//如果右边的第一个1在最后一位,也就是right的右边没有0了
max1=0;//那么max1初始化为0
for(int i=right-1;i>=0;i--)//从right的前一位开始,逐个计算跟右边最近的1的距离
{
if(seats[i]==1)
right=i;
else if(seats[i]==0)//应对[0,0,1,1,0,0,0]这种情况中的前两个0
{
max1=max(max1,right-i);
}
else//正常情况下 夹在两个1中间的情况
{
seats[i]=max(-(right-i),seats[i]);
max1=max(max1,-seats[i]);
} }
return max1;
}

上述代码可能注释也还解释得不是十分清楚。

我们通过跟左边最近的1和右边最近的1的位置比较,得到位置距离,存储在原本的vector中。

存储的时候,为了避免跟原本的1混乱了,存储成负数(相反数)的形式。

我们最后还需要遍历一遍vector,得到最大的位置距离。

但笔者为了省时间,把最后这一步融合在代码中最后的for循环中了,跟右边最近的1比较完之后,得到的数值再跟vector中存储的数值比较,只剩下一个数,然后不断更新最大的位置距离。

为了实现这一点,我们需要考虑最开始max1要初始化为多少。

还不懂的同学自己手推一遍代码,理清过程就清楚啦!

上述代码实测12ms,beats 100% of cpp submission。

leetcode-849-到最近的人的最大距离的更多相关文章

  1. 力扣(LeetCode) 849. 到最近的人的最大距离

    在一排座位( seats)中,1 代表有人坐在座位上,0 代表座位上是空的. 至少有一个空座位,且至少有一人坐在座位上. 亚历克斯希望坐在一个能够使他与离他最近的人之间的距离达到最大化的座位上. 返回 ...

  2. [LeetCode] Maximize Distance to Closest Person 离最近的人的最大距离

    In a row of seats, 1 represents a person sitting in that seat, and 0 represents that the seat is emp ...

  3. C#LeetCode刷题之#849-到最近的人的最大距离(Maximize Distance to Closest Person)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3754 访问. 在一排座位( seats)中,1 代表有人坐在座位 ...

  4. [Swift]LeetCode849. 到最近的人的最大距离 | Maximize Distance to Closest Person

    In a row of seats, 1 represents a person sitting in that seat, and 0 represents that the seat is emp ...

  5. Leetcode849.Maximize Distance to Closest Person到最近的人的最大距离

    在一排座位( seats)中,1 代表有人坐在座位上,0 代表座位上是空的. 至少有一个空座位,且至少有一人坐在座位上. 亚历克斯希望坐在一个能够使他与离他最近的人之间的距离达到最大化的座位上. 返回 ...

  6. [LeetCode] 849. Maximize Distance to Closest Person 最大化最近人的距离

    In a row of seats, 1 represents a person sitting in that seat, and 0 represents that the seat is emp ...

  7. my understanding of (lower bound,upper bound) binary search, in C++, thanks to two post 分类: leetcode 2015-08-01 14:35 113人阅读 评论(0) 收藏

    If you understand the comments below, never will you make mistakes with binary search! thanks to A s ...

  8. [LeetCode] 849. Maximize Distance to Closest Person_Easy tag: BFS

    In a row of seats, 1 represents a person sitting in that seat, and 0 represents that the seat is emp ...

  9. LeetCode 75,90%的人想不出最佳解的简单题

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题的44篇文章,我们一起来看下LeetCode的75题,颜色排序 Sort Colors. 这题的官方难度是Medi ...

随机推荐

  1. MySQL学习2---索引

    MySQL 索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 索引分单列索引和组合索引.单列索引,即一个索引只包含单个列,一个表可以有多个单列索引, ...

  2. Win2003+apache+PHP+SqlServer2008 配置

    Win2003+apache+PHP+SqlServer2008 配置     安装前的准备: 1.Apache2.2.2 2.PHP5.2.17 3.SqlServer2008 4.sqlncli. ...

  3. Python爬虫利器一之Requests库的用法

    前言 之前我们用了 urllib 库,这个作为入门的工具还是不错的,对了解一些爬虫的基本理念,掌握爬虫爬取的流程有所帮助.入门之后,我们就需要学习一些更加高级的内容和工具来方便我们的爬取.那么这一节来 ...

  4. 【记录】CentOS7安装NODEBB

    NodeBB介绍: NodeBB 是一个更好的论坛平台,专门为现代网络打造.它是免费的,易于使用. NodeBB 论坛软件是基于 Node.js开发,支持 Redis 或 MongoDB 的数据库.它 ...

  5. VS2013的IDE开发使用便捷实用技巧----(补充)

    快捷键操作真的很高效.很酷······ 节省时间,提高开发效率 向人们展示可以惊讶到他们的功能,就像“我怎么就没发现”这种功能. 1. Peek View(本地查看程序源代码位置,便捷跳转) 可以在不 ...

  6. .Net工程师面试笔试宝典

    .Net工程师面试笔试宝典 传智播客.Net培训班内部资料 http://net.itcast.cn 这套面试笔试宝典是传智播客在多年的教学和学生就业指导过程中积累下来的宝贵资料,大部分来自于学员从面 ...

  7. css 颜色渐变 兼容性

    参考文献:http://caibaojian.com/css3-background-gradient.html    https://www.cnblogs.com/xzzzys/p/7495725 ...

  8. 使用Eclipse切换TFS工作区

    这个问题首先牵涉到两个概念: - Eclipse的工作区:Eclipse的工作区是运行Eclipse时需要连接的本地代码空间,默认情况下,在Eclipse中创建的项目都保存在Eclipse的工作区中 ...

  9. Hibernate 之核心接口

    1.持久化和ORM 持久化是指把数据(内存中的对象)保存到可持久保存的存储设备中(如硬盘),主要应用于将内存中的数据存储到关系型数据库中,在三层结构中,持久层专注于实现系统的逻辑层面,将数据使用者与数 ...

  10. ASP.NET IIS 支持PUT、DELETE请求

    IIS 本身不支持PUT.DELETE请求,但可以通过一下方法修改进而达到目的 删除IIS安装的WebDav模块,选择你的项目,右边有个“模块”,双击它:找到WebDavModule,删除它(不推荐, ...