P1102 A-B数对 题解
MLSY_OIer_ZXL · · 题解
P1102 A-B数对 题解
题目传送门
简化一下题意:给你一个长度为 n 的数组 nums 还有 target,要求你找出数组 nums 中相减的差为 target 的数。
这题不明显就是双指针吗,为什么题解区里面都是用 map 暴力打出来的?
这里附上一篇用双指针的做法。
Solution:
首先我们用 sort 函数排序一下,然后定义一个 left 指针,我这边又定义了两个 right 指针方便思考和理解,最后只用一个 for 查找。
上代码吧,这么思路清晰的代码一定很好理解
Code:
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, c;
int arr[N];
int main() {
cin >> n >> c;
for (int i = 1; i <= n; i++) {
cin >> arr[i];
}
sort(arr + 1, arr + 1 + n);
int left = 1, right1 = 1, right2 = 1;
long long ans = 0;
for (left = 1; left <= n; left++) {
// 找到第一个满足条件的right1
while (right1 <= n && arr[right1] - arr[left] <= c) {
right1++;
}
// 找到第一个满足条件的right2
while (right2 <= n && arr[right2] - arr[left] < c) {
right2++;
}
// 如果满足条件,计算符合要求的数对
if (arr[right2] - arr[left] == c && arr[right1 - 1] - arr[left] == c && right1 - 1 >= 1) {
ans += right1 - right2;
}
}
cout << ans;
return 0;
}
这是一个标准的双指针题解,目前没看到几篇用双指针做的,都是用 map 暴力做的,为什么他们没超时?