这道题要求我们在序列中找到
A
−
B
=
C
A-B=C
A−B=C 的数对的个数,下标不同的数对算作不同的数对
如果采用常规做法就是两层循环,每个数字依次作为
B
B
B ,在从其之后的元素选出元素与之相减,看得到的结果是不是
C
C
C,是的话
a
n
s
+
+
ans++
ans++ ,这是枚举的做法
我们不妨换一个思路,既然我们枚举每个数字作为
B
B
B,那么B就是确定的,题目中的
C
C
C 也是确定的,
A
−
B
=
C
A-B=C
A−B=C 问题,我们就可以转换为
B
+
C
=
A
B+C=A
B+C=A 问题,对于每一个数字
B
B
B,我们在其之后的元素中,去找有多个元素恰好比
B
B
B 大
C
C
C 就可以了
如何快速的找到恰好比
B
B
B 大
C
C
C 的数字有多少个呢?我们只需要找到这个比
B
B
B 大
C
C
C 的数第一次出现的位置和最后一次出现的位置,这样两次位置的下标之差就是这个比
B
B
B 大
C
C
C 的数字出现的个数,为了快速找到这个数字,我们可以借助二分查找中的
l
o
w
e
r
_
b
o
u
n
d
(
)
lower\_bound()
lower_bound() 函数 和
u
p
p
e
r
_
b
o
u
n
d
(
)
upper\_bound()
upper_bound() 函数(注意,使用二分之前一定要保证数组有序哦!我们可以用
s
o
r
t
sort
sort 快速排序,
s
o
r
t
sort
sort 的时间复杂度是
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn) )
l
o
w
e
r
_
b
o
u
n
d
lower\_bound
lower_bound 查找第一个大于等于某个元素的值,可以用来查找第一个比
B
B
B 大
C
C
C 的数的下标
u
p
p
e
r
_
b
o
u
n
d
upper\_bound
upper_bound 查找第一个大于某个元素的值,可以用来查找最后一个比
B
B
B 大
C
C
C 的数的下标,因为最后一个刚好比
B
B
B 大
C
C
C 的数,一定他的下一个数(数组是有序的),而我们用
l
o
w
e
r
_
b
o
u
n
d
lower\_bound
lower_bound 找的就是最后一个刚好比
B
B
B 大
C
C
C 的数的下一个数,可结合下图理解
第二种情况,比如序列是
1
1
1
1
(
c
=
1
)
1\ 1\ 1\ 1\ (c=1)
1111(c=1),对于
1
1
1 ,第一个
>
=
1
+
1
>= 1+1
>=1+1 和 第一个
>
1
+
1
> 1+1
>1+1 的元素都找不到,**都找不到的话
l
o
w
e
r
_
b
o
u
n
d
lower\_bound
lower_bound 和
u
p
p
e
r
_
b
o
u
n
d
upper\_bound
upper_bound 返回的结果都是数组的最后一个元素再往后一个元素的地址,**那么二者相减就是
0
0
0 ,说明没有比
1
1
1 恰好大
1
1
1 的元素