您的位置:首页 > 教育 > 锐评 > 上海企业登记网络服务平台_代理浏览器在线_谷歌浏览器免费入口_windows系统优化软件

上海企业登记网络服务平台_代理浏览器在线_谷歌浏览器免费入口_windows系统优化软件

2025/2/25 18:17:37 来源:https://blog.csdn.net/Pisasama/article/details/145840468  浏览:    关键词:上海企业登记网络服务平台_代理浏览器在线_谷歌浏览器免费入口_windows系统优化软件
上海企业登记网络服务平台_代理浏览器在线_谷歌浏览器免费入口_windows系统优化软件

力扣3464. 正方形上的点之间的最大距离

题目

在这里插入图片描述

题目解析及思路

题目要求在points集合中找出k个点,k个点之间的最小的曼哈顿距离的最大值

最大最小值的题一般直接想到二分

将正方形往右展开成一条线,此时曼哈顿距离为两点直线距离**(仅起点右边的点)**

枚举起点二分答案,每次用二分找到>= st + mid的最近的点

代码

class Solution {
public:int maxDistance(int side, vector<vector<int>>& points, int k) {vector<long long> a;for(auto& p:points){int x = p[0],y = p[1];if (x == 0) {a.push_back(y);} else if (y == side) {a.push_back(side + x);} else if (x == side) {a.push_back(side * 3LL - y);} else {a.push_back(side * 4LL - x);}}ranges::sort(a);auto check = [&](int mid)->bool{//枚举起点for(long long st : a){//最右边的点的边界,当坐标超过边界时,该点与起点的距离已经<mid了,不满足条件long long end = side * 4LL + st - mid;long long cur = st;//找剩下k-1个点for(int i=0;i<k-1;i++){auto it = ranges::lower_bound(a,cur+mid);if(it == a.end() || *it > end){cur = -1;break;}cur = *it;}if(cur > 0){return true;}}return false;};int l = 1,r = side+1;while(l+1 < r){int mid = l + (r - l) / 2;if(check(mid)) l = mid;else r = mid;}return l;}
};

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com