力扣1610.可见点的最大数目
-
把所有极角算出来
- atan2(x,y)函数 返回值为弧度(带π)
-
存入数组并排序 + 断链成环
- 再开n个空间 d[n+i] = d[i] + 2*π
-
在极角数组中找到一段极差<k的最大数目的区间(滑窗)
-
class Solution { vector<double> d; double k; public: int visiblePoints(vector<vector<int>>& points, int angle, vector<int>& location) { int res=0,cnt=0; //将angle角度转换成k弧度 k = (double)angle/180.0 * M_PI; for(auto p:points) { if(p == location) cnt++; //统一+π全部变为正数 不加也可以 else d.push_back(atan2(p[1] - location[1],p[0] - location[0]) + M_PI); } int n = d.size(); sort(d.begin(),d.end()); for(int i=0;i<n;i++) { d.push_back(d[i] + 2*M_PI); } for(int i=0,j=0;i<2*n;i++) { while(d[i] - d[j] > k) j++; res = max(res,i-j+1); } return res+cnt; } };