0
点赞
收藏
分享

微信扫一扫

[双指针]leetcode825:适龄的朋友(medium)

zidea 2022-02-04 阅读 40

题目:
在这里插入图片描述
在这里插入图片描述


题解:


代码如下:

class Solution {
public:
    /*
    这题目意思真难懂:若想x给y发消息,则必然三个条件都不成立,由于条件2包含条件3了,所以条件2不成立,条件3必然不成立,因此我们仅需条件1和条件2同时不成立即可,也就是 0.5*x+7<y<=x,由 x>0.5x+7 => x>14,所以x<=14的不用考虑了。由于x递增时,区间(0.5*x+7,x]也是单调递增的,所以我们可以将数组排序,然后利用双指针寻找满足条件y的范围即可。
    */
    int numFriendRequests(vector<int>& a) {
        int n=a.size();
        sort(a.begin(),a.end());
        int l=0,r=0,res=0;
        for(int x:a)
        {
            if(x<=14)continue;
            // 左边界寻找大于0.5*x+7的起点
            while(a[l]<=0.5*x+7)l++;
            // 右边界寻找刚好小于等于x的位置,若a[r+1]>x,说明r+1超过边界了,而r刚好为边界
            while(r+1<n&&a[r+1]<=x)r++;
            res+=r-l;
        }
        return res;
    }
};
举报

相关推荐

0 条评论