题目链接:https://www.acwing.com/problem/content/802/
双指针的妙用
先打暴力,在改成双指针。
正确解法 遍历l,确保不会漏
#include<iostream> using namespace std; const int maxn = 1e5 + 10; int a[maxn], b[maxn]; int n, m, x; int main() { cin >> n >> m >> x; for(int i = 0; i < n; i ++) cin >> a[i]; for(int i = 0; i < m; i ++) cin >> b[i]; for(int l = 0, r = m-1; l < n; l ++) { while(r >= 0 && a[l] + b[r] > x) r--; if(a[l] + b[r] == x) { cout << l << " " << r; break; } } return 0; }
错误解法 让l和r一起移动的话,会漏掉某些组合
#include<iostream> using namespace std; const int maxn = 1e5 + 10; int a[maxn], b[maxn]; int n, m, x; int main() { cin >> n >> m >> x; for(int i = 1; i <= n; i ++) cin >> a[i]; for(int i = 1; i <= m; i ++) cin >> b[i]; int l = 1, r = max(n, m); while(l < r) { while(a[l] + b[r] > x) r --; while(a[l] + b[r] < x) l ++; if(a[l] + b[r] == x) break; } cout << l-1 << " " << r-1; return 0; }
原文:https://www.cnblogs.com/lovezxy520/p/14088260.html