力扣3102.最小化曼哈顿距离
题目
题目解析及思路
题目要求返回移除一个点后的最小的最大曼哈顿距离
最大最小值的题一般直接想到二分
本题有一个简单办法就是利用切比雪夫距离
当正方形转45°,即边上点**( x , y ) -> (x + y , y - x)时,两点间max(横坐标差值,纵坐标差值)即为两点间曼哈顿距离,从而将一个加法式子转化成了取最大值的式子**
因此找k个点的最小曼哈顿距离就是找k个点中max(最大x-最小x,最大y-最小y)
代码
class Solution {
public:
int minimumDistance(vector<vector<int>>& points) {
multiset<int> sx,sy;
//把所有点加进去,一个删一个
for(auto& p:points){
sx.insert(p[0] + p[1]);
sy.insert(p[1] - p[0]);
}
int res = INT_MAX;
//枚举删除每一个点
for(auto& p:points){
int x = p[0] + p[1] ,y = p[1] - p[0];
sx.erase(sx.find(x));
sy.erase(sy.find(y));
int dx = *sx.rbegin() - *sx.begin();
int dy = *sy.rbegin() - *sy.begin();
res = min(res,max(dx,dy));
sx.insert(x);
sy.insert(y);
}
return res;
}
};