最近面了shopee新加坡office,在二面中遇到了一道有意思的题目。
题目分为两部分,开始比较简单,followup会有难度(但是也是之前遇到过总结过的二分,但是该死的又是没有自己想出来
题目:
给出一个升序数组,其中每个数字代表的是每个空位置的坐标。现在要给三个人安排位置,要求使他们之间距离最大(以相邻两个人距离中较小的距离为距离)
解法:
首先肯定要把一个安排在最左边,一个在最右边(贪心,这时面试官问了我为什么要这样,怎么证明这样是对的?)
然后只需要找出中间的人的位置就行了。
最简单可以遍历一遍就可以了,但是我们可以用二分:如果左边范围比右边大,接下来可以在左边找;或者如果左边范围比右边小,之后在右边找。
但是需要注意的是:即使对于一个mid值它的两边不相等,但是这个mid位置仍然可能是最后的位置,所以二分的时候要注意不能简单的和以前一样:lo = mid + 1 or hi = mid - 1,而应该是:lo = mid or hi = mid,最后的范围会找出两个位置,再在这两个位置中找。(一开始写错了,幸好自己检查出来了,改过来了)
int minDist(vector<int>& seats) {
int sz = seats.size();
if (sz < 3)