LeetCode——适龄的朋友 C++

题目描述:

         本题的题目要求中第三个式子条件因为包含在第二个式子中,所以该式子可以省略掉,对于式子二:

age[y] > age[x]

我们可以用一个快排来解决,这样始终满足后面元素向前发出好友请求,再结合式子一进行判断即可。

        本题可以采用双指针方法来避免两次循环的时间复杂度,还有一点就是同龄人之间是可以相互发送的,对于这个条件我们可以用一个同龄计数器来记录有多少连续的同龄人,在最终计数器中添加进同龄计数器中的数字即可(注意在迭代中及时将同龄计数器归零否则会出现错误)

 完整代码如下:

int numFriendRequests(vector<int>& ages) {
        sort(ages.begin(),ages.end());
        int i=0,num=0,j=1,num_1=0;
        while(i<=ages.size()-1&&j<=ages.size()-1){
            if(ages[j-1]!=ages[j])num_1=0;//如果不同龄则将同龄计数器归零
            if(ages[i]<=0.5*ages[j]+7){
                if(j-i>1){
                    i++;
                }
                else{
                i++;
                j++;
                }
                continue;
            }
            else{
                if(ages[j-1]==ages[j]){//判断是否同龄
                    num_1++;
                    num+=num_1;
                }
                else num_1=0;
                num+=j-i;
                j++;
            }
        }
        return num;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值