AcWing_800 数组元素的目标和(双指针)

AcWing

800. 数组元素的目标和

i指向0,定义ja[i] + b[j] > x的最左边界的前一个位置,起初指向m-1。当i ++时,a[i]增大,由于总和不变,b[j]必须减小,所以j只要一直减小,不用回退。

时间复杂度$O(n + m)$.

#include <iostream>
using namespace std;

int n, m, x;
const int N = 100010;
int a[N], b[N];
int p1, p2;

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    
    cin >> n >> m >> x;
    for(int i = 0; i <= n - 1; i ++) cin >> a[i];
    for(int i = 0; i <= m - 1; i ++) cin >> b[i];
    
    p1 = 0, p2 = m - 1;
    while(p1 <= n - 1 && p2 >= 0){
        while(a[p1] + b[p2] > x) p2 --;
        if(a[p1] + b[p2] == x){
            cout << p1 << ' ' << p2;
            break;
        }
        else p1 ++;
    }
    return 0;
}