此题算是一个比较明显的双指针题了,而且是确定最大窗口的那种,只要一个if的那种。困难的是对二维空间的建模,这里用atan2进行极角排序,从-180度开始,每转一圈加360度。对于环状问题,让数组等于两倍自己即可。
typedef vector<int> V;
class Solution {
V start;
public:
double get_arc(vector<double> v)
{
return atan2(v[2]-start[1], v[1]-start[0]);
}
double arcProcess(double arc, int i)
{
return arc+i*M_PI*2;
}
int visiblePoints(vector<vector<int>>& points, int angle, vector<int>& location) {
int x = location[0], y = location[1];
vector<double> pts;
int plus = 0;
for(auto p: points)
{
if(p[0] == x && p[1] == y)plus++;
else pts.emplace_back(atan2(p[1]-y, p[0]-x));
}
sort(pts.begin(), pts.end());
int n = pts.size();
for(int i=0;i<n;i++)pts.push_back(pts[i]);
double arc = M_PI*angle/180.0;
// 双指针解决
int l = 0, ans = 0;
for(int r=0;r<pts.size();r++)
{
double arcr = arcProcess(pts[r], r/n), arcl = arcProcess(pts[l], l/n);
if(arcr-arcl > arc)l++;
if(r-l+1>ans)ans = r-l+1;
}
return ans+plus;
}
};