leetcode 1610 极角序+双指针+环形问题

在这里插入图片描述
此题算是一个比较明显的双指针题了,而且是确定最大窗口的那种,只要一个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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值