写在前面:
在找工作和日常学习的艰苦历程中,刷题,成为了所有计算机友友绕不开的大山。对于我来说,最大的挑战莫过于每周只有零星的时间可以利用,刷题节奏不稳定,导致几周之前灵感爆发时做出来的题目再看一眼完全没有任何思路或者无法复现原结果,再去学习起来事倍功半,也浪费了我们的宝贵时间。所以我希望在我每次做题之后,将宝贵的思路记录下来,写成博客。
为什么要写成博客呢?
1. 写博客可以作为一个自我督促的动力:论坛内各大神们的眼睛都是雪亮的,我作为一届开摆大学生的代码在大佬眼里可能非常 naive。在论文上发文督促我在学习中对自己要求更高
2. 写博客可以和社区内的朋友交流经验,获得意料之外的提升:题主目前就读大四,也算是“学有所成”,但通过实习经历发现自己和真正优秀的同龄人还有很大差距,而通过与他们交流和学习的过程,我收获了很多,也改变了很多,我也希望我的“所成”能帮助到更多人,我的帖子能服务到更多正在孤独刷题,积极找工的同龄人们。也希望我的一些小记能被更多人看见,有优秀的大佬可以莅临寒帖,真正的让圈子里各阶层的人得以交流
3. 写博客能让我获得成就感:看到自己的东西被他人阅读以及点赞的成就感是不言而喻的,而这些东西会成为继续坚持学习技术的最好动力!
4. 以 Leetcode 会友:最后,希望有遇到志同道合的小伙伴,在互相的求职路上多一份陪伴!
题目介绍:
- 题目链接:
. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/maximize-distance-to-closest-person/description/https://leetcode.com/problems/maximize-distance-to-closest-person/https://leetcode.com/problems/maximize-distance-to-closest-person/
- 题目所属类型:Array,Two-Pointer, Trick(我喜欢把一些可以投机取巧的题叫这个分类)
- 题目来自:Google 高频面试真题选
题目描述:
- 给定一个数组,1 代表这里有人坐(seated)0 代表这里是空位
- 这个题目的目标是最大化距离最近的人的距离,找到这个最大值
- 对于开头和结尾的人,离最近的人表示为他到结尾的长度: [1, 0, 0, 0] -> distance 为 3
题目想法 - Mindset:
- In general,我们需要按两个两个的 group,找他们之间可以坐的最大距离,再将这些距离全部聚合起来求的 Global Maximum
- 对于一个组 [1, 0, 0, 0, 1], 最大距离应该是坐在中间,即 [1, 0, 1, 0, 1], 他到最近的 seated 位置的距离为 2
- 经过观察:我们可以总结出中间组的一般规律:即组间最大距离为:
- (k+1)/ 2 ==> k 是组内两个 seated 位置中间的空位数
- 我们还需要考虑两个 edge cases:
- 第一个 seated 的 位置:[0, 0, 1, ...., 0], 这里虽然没有形成一个 group,但是这其实是一个距离为 2 的 distance
- 最后一个 seated 的位置:[0, 1, 0, .... , 1, 0, 0, 0], 这里最后一个seated 没有形成一个 group,但是这里其实也有一个距离为 3 的 distance
- 这两种情况的所有距离加起来的最大值就是我们的答案
题目代码:
class Solution {
public:
int maxDistToClosest(vector<int>& seats) {
int maxDistance = INT_MIN;
int left = -1;
//handle beginning leftover:
int beginning = 0, firstSeated = 0;
for(int i = 0; i < seats.size(); i++){
if(!seats[i]) beginning ++;
else{
maxDistance = beginning;
firstSeated = i;
break;
}
}
// starting from the first seated:
for(int i = firstSeated; i < seats.size(); i++){
if(seats[i] == 1){
if(left == -1){
left = i;
}
else{
int dis = i - left - 1; //spots between two seated
maxDistance = max(maxDistance, (dis+1) / 2);
left = i;
}
}
}
//handle ending leftover:
int dis = (seats.size()-left-1);
maxDistance = max(maxDistance, dis);
return maxDistance;
}
};
- Runtime 分析:因为我们只是遍历了整个数组一次,runtime 为 O(n)
- Space 分析:仅使用变量储存,常数储存空间:O(1)
- Optimal Solution!
写在后面:
第一次写博客,希望广大码友提供宝贵意见,一定严加改正!
对于题目解法有其他讨论欢迎一起参加,帖子中只展示最投机取巧也是最快的解法(本人能想到的),如果大家有更快的解法也欢迎一起交流!
ACM 大神请轻喷!!