【备战秋招】7月27日-OPPO-第三题-严格递增三元组(第一套)

在线测试本题

严格递增三元组(第一套)

题目描述

给定 n n n 个数组 a 1 , … , a n a_1, \dots, a_n a1,,an, 找出所有的严格递增三元组( 1 ≤ i < j < k ≤ n 1 \leq i < j < k \leq n 1i<j<kn) , 使得 a i = a k = a j + 1 a_i = a_k = a_j + 1 ai=ak=aj+1 , 输出其数量。

输入描述

第一行输入一个正整数 n ( 3 ≤ n ≤ 1 0 5 ) n(3 \leq n \leq 10^5) n(3n105)

第二行输入 a 1 , . . . , a n ( 1 ≤ a i ≤ 1 0 9 ) a_1,...,a_n(1 \leq a_i \leq 10^9) a1,...,an(1ai109)

输出描述

一个正整数,代表符合条件的三元组数量

示例

输入

5
2 2 1 1 2

输出

4

题解

我们要找这样的三元组:(x + 1 , x , x + 1) 。对于一个特定的x,我们要算个数,就是去考虑前缀和后缀中x + 1 的个数,快速查询x + 1的个数我们只需要使用使用哈希表即可。假如个数是a和b,答案就是a * b.
所以计算顺序是从左到右枚举中间这个x,这样枚举的好处是左右两边要考虑的区域随着从左到右枚举的过程,它们就是一个连续的前缀和后缀,方便我们更新前缀哈希和后缀哈希。移动过程中前缀哈希增添一个数,后缀哈希删除一个数。

代码见网站内部(文章顶部):塔子哥的文字题解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

塔子哥学算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值