力扣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;}};