题目:3143. 正方形中的最多点数
思路:找最多可以包含的点数,半径越大发生不合法的概率也越大。因此我们对正方形的边长用二分法,来找到最多可以包含的点数。再用二进制来表示26个字母出现的情况。
细节看注释
class Solution {
public:
int mx=0;
bool check(int u,vector<vector<int>>& points, string& s){
//26个字母,那用int就可以表示字母出现的情况
int sta=0;
//合法的情况下,包含的点数
int ans=0;
for(int i=0;i<points.size();i++){
//找到能包含这个点的最小边长
int x=max(abs(points[i][0]),abs(points[i][1]));
//该字母的位置
int t=s[i]-'a';
//当前点在正方形内
if(x<=u){
//如果字母还没出现,就可以计数
if(((sta>>t)&1)==0){
sta|=(1<<t);
ans++;
}else{
//出现说明不合法
return false;
}
}
}
mx=max(mx,ans);
return true;
}
int maxPointsInsideSquare(vector<vector<int>>& points, string s) {
//枚举可能的边长(实际是边长的一半)
int l=0,r=1e9+1;
while(l<=r){
int mid=(l+r+1)/2;
if(check(mid,points,s))l=mid+1;
else r=mid-1;
}
return mx;
}
};