来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/friends-of-appropriate-ages

题目描述

在社交媒体网站上有 n 个用户。给你一个整数数组 ages ,其中 ages[i] 是第 i 个用户的年龄。

如果下述任意一个条件为真,那么用户 x 将不会向用户 y(x != y)发送好友请求:

age[y] <= 0.5 * age[x] + 7
age[y] > age[x]
age[y] > 100 && age[x] < 100
否则,x 将会向 y 发送一条好友请求。

注意,如果 x 向 y 发送一条好友请求,y 不必也向 x 发送一条好友请求。另外,用户不会向自己发送好友请求。

返回在该社交媒体网站上产生的好友请求总数。

示例 1:

输入:ages = [16,16]
输出:2
解释:2 人互发好友请求。

示例 2:

输入:ages = [16,17,18]
输出:2
解释:产生的好友请求为 17 -> 16 ,18 -> 17 。

示例 3:

输入:ages = [20,30,100,110,120]
输出:3
解释:产生的好友请求为 110 -> 100 ,120 -> 110 ,120 -> 100 。

提示:

n == ages.length
1 <= n <= 2 * 104
1 <= ages[i] <= 120

解题思路

在题目的描述中,x同学想和y同学成为朋友的条件有三个,不难看出条件3是包含在条件2中的,所以我们可以不考虑条件3,因为满足条件2必然会满足条件3,同时需要注意x和y发送好友请求,y并不是一定要和x发送好友请求的,世上没有那么多双向奔赴。

结合条件1和条件2可以得出,x同学得满足一个条件0.5 * ages[x] + 7 < ages[x]。求得x同学的年龄必须是15岁及以上,那么我们可以跳过年龄15岁以下的同学,只有满足15岁及以上的同学才有发送好友请求的能力。

接下来将所有同学的年龄进行升序排序,对于每一个x同学。都可以找到找到一个区间(0.5 * ages[x] + 7, ages[x] ],x同学会向这个区间中的每一个人发送好友请求。所以使用两个指针left和right分别记录这个区间的两个边界。由于0.5*ages[x] + 7 和 ages[x]都是单调递增的,所以x+1同学的区间肯定等于x同学或者位于x同学的右侧,那么left和right的值只需要向右滑动就可以了。求出区间后,需要将自己排除掉,所以需要人数减1,所以right - left 便是x同学发送好友请求的数量。

代码展示

class Solution {
public:
int numFriendRequests(vector<int>& ages) {
int iRet = 0;
sort(ages.begin(), ages.end());
int iLeft = 0, iRight = 0;
for(int i = 0; i < ages.size(); i++)
{
if(ages[i] <= 14)
continue;
while(ages[iLeft] <= 0.5 * ages[i] + 7)
{
iLeft++;
}
while(iRight + 1 < ages.size() && ages[iRight + 1] <= ages[i])
{
iRight++;
}
iRet += iRight - iLeft;
}
return iRet;
}
};

运行结果

最新文章

  1. USACO . Greedy Gift Givers
  2. Coursera 机器学习课程 机器学习基础:案例研究 证书
  3. 如何配置virtualBox端口转发
  4. uboot中添加FIQ中断及相关问题
  5. Ubuntu下vim的配置
  6. MySQL数据库备份还原(基于binlog的增量备份)
  7. DirectoryExists
  8. 【HDOJ】4972 A simple dynamic programming problem
  9. 基本套接字总结(@function)
  10. 什么是MongoDB、特点、历史、下载和工具
  11. 移动端ios电话号码
  12. 项目自动构建工具对比(Maven、Gradle、Ant)
  13. ShoneSharp语言(S#)的设计和使用介绍系列(2)— 掀开盖头
  14. Win7 安装bundle
  15. sql-leetcode Consecutive Numbers
  16. 安装oracle11g时遇到INS-13001环境不满足最低要求
  17. 线程池之 newScheduledThreadPool中scheduleAtFixedRate(四个参数)
  18. TZOJ 4325 RMQ with Shifts(线段树查询最小,暴力更新)
  19. #pragma once含义及用法
  20. 欧拉函数phic以及超大数的快速幂

热门文章

  1. 关键字break和continue
  2. 【LeetCode】剑指 Offer 30. 包含min函数的栈
  3. 制作 Python Docker 镜像的最佳实践
  4. 第三模块的下载、requests模块、openpyxl模块
  5. Mariadb对数据库和表的操作
  6. 内网渗透-at&amp;schtasks&amp;impacket的使用
  7. VMware Workstation Pro 16安装CentOS7超详细图文步骤
  8. 一文了解 Dubbo 3 配置工作原理
  9. [数据结构]广度优先搜索算法(Breadth-First-Search,BFS)
  10. Java连接Zookeeper以及书写简单增删改查的方法