LeetCode-825 适龄的朋友
来源:力扣(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;
}
};
运行结果
最新文章
- USACO . Greedy Gift Givers
- Coursera 机器学习课程 机器学习基础:案例研究 证书
- 如何配置virtualBox端口转发
- uboot中添加FIQ中断及相关问题
- Ubuntu下vim的配置
- MySQL数据库备份还原(基于binlog的增量备份)
- DirectoryExists
- 【HDOJ】4972 	A simple dynamic programming problem
- 基本套接字总结(@function)
- 什么是MongoDB、特点、历史、下载和工具
- 移动端ios电话号码
- 项目自动构建工具对比(Maven、Gradle、Ant)
- ShoneSharp语言(S#)的设计和使用介绍系列(2)— 掀开盖头
- Win7 安装bundle
- sql-leetcode Consecutive Numbers
- 安装oracle11g时遇到INS-13001环境不满足最低要求
- 线程池之 newScheduledThreadPool中scheduleAtFixedRate(四个参数)
- TZOJ 4325 RMQ with Shifts(线段树查询最小,暴力更新)
- #pragma once含义及用法
- 欧拉函数phic以及超大数的快速幂
热门文章
- 关键字break和continue
- 【LeetCode】剑指 Offer 30. 包含min函数的栈
- 制作 Python Docker 镜像的最佳实践
- 第三模块的下载、requests模块、openpyxl模块
- Mariadb对数据库和表的操作
- 内网渗透-at&;schtasks&;impacket的使用
- VMware Workstation Pro 16安装CentOS7超详细图文步骤
- 一文了解 Dubbo 3 配置工作原理
- [数据结构]广度优先搜索算法(Breadth-First-Search,BFS)
- Java连接Zookeeper以及书写简单增删改查的方法