【1610. 可见点的最大数目】数学模拟+注意细节+滑动窗口

总结之前先夸夸自己,细节都想到了,就是最后没有使用滑动窗口导致超时!已经很棒啦,相比于大一时的C语言的C已经有很大的进步啦!

 

注意的细节如下:

1、atan2函数的用法:返回的范围是[-\pi\pi],而不是[0, 2\pi],千万注意,所以为了保证扫描的连续性,要把[-\pi, 0]的部分加上2\pi得到[\pi,2\pi];

2、C++中表示\pi的方法:

3、注意当扫描到接近2\pi时,要在2\pi之后补上大小为angle的角度,以便扫描完整;补之前记得将之前加入angles数组中的角度值进行排序;

4、注意角度和弧度表示方法的统一。

以及不要使用双层循环,会超时,使用滑动窗口效果更好!j不会回退!!

代码如下:

class Solution {
public:
    int visiblePoints(vector<vector<int>>& points, int angle, vector<int>& location) {
        vector<double> angles;
        int num=points.size();
        int flag=0;
        int px=location[0],py=location[1];
        for(int i=0;i<num;i++)
        {
            if((points[i][1]-py==0)&&(points[i][0]-px==0))
            {
                flag++;
            }
            else
            {
                if(atan2(double(points[i][1]-location[1]),double(points[i][0]-location[0]))<0)
                    angles.push_back(atan2(double(points[i][1]-location[1]),double(points[i][0]-location[0]))+2*M_PI);
                else
                    angles.emplace_back(atan2(double(points[i][1]-py),double(points[i][0]-px)));
            }
        }
        sort(angles.begin(),angles.end());
        int count_90=0;
        for(int i=0;i<num-flag;i++)
        {
            if(angles[i]>=0&&angles[i]<=angle*M_PI/180.0)
            {
                angles.push_back(angles[i]+M_PI*2);
                count_90++;
            }
        }
        int count=0,max_count=0;
        int i=0,j=0;
        for(i=0;i<num-flag;i++)
        {
            count=0;
            while(j<num+count_90-flag&&angles[j]<=angles[i]+angle*M_PI/180.0)
            {
                j++;
            }
            if(j-i>max_count)
            {
                max_count=j-i;
            }
        }
        return max_count+flag; 
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值