双指针算法模板
模板
1 2 3 4 5 6 7 8 9 10
| for (int i = 0, j = 0; i < n; i ++ ) { while (j < i && check(i, j)) j ++ ;
} 常见问题分类: (1) 对于一个序列,用两个指针维护一段区间 (2) 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作
|
题目描述:
给定两个升序排序的有序数组 A 和 B,以及一个目标值 x。
数组下标从 0 开始。
请你求出满足 A[i]+B[j]=x 的数对 (i,j)。
数据保证有唯一解。
输入格式
第一行包含三个整数 n,m,x,分别表示 A 的长度,B 的长度以及目标值 x。
第二行包含 n 个整数,表示数组 A。
第三行包含 m 个整数,表示数组 B。
输出格式
共一行,包含两个整数 i 和 j。
数据范围
数组长度不超过 10^5。
同一数组内元素各不相同。
1≤数组元素≤10^9
输入样例:
4 5 6
1 2 4 7
3 4 6 8 9
输出样例:
1 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| #include<iostream>
using namespace std;
const int N = 1e5 + 10;
int a[N],b[N];
int main(){ int n, m, x; scanf("%d%d%d",&n,&m,&x); for(int i = 0; i < n; i++) scanf("%d",&a[i]); for(int i = 0; i < m; i++) scanf("%d",&b[i]); for(int i = 0, j= m - 1; i < n; i++){ while(j >= 0 && a[i] + b[j] > x) j--; if(j >= 0 && a[i] + b[j] == x) cout << i << ' ' << j << endl; } return 0; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include<stdio.h> #define N 100010
int a[N],b[N];
int main(){ int n,m,x; scanf("%d%d%d",&n,&m,&x); for(int i = 0; i < n; i++) scanf("%d",&a[i]); for(int i = 0; i < m; i++) scanf("%d",&b[i]); for(int i = 0,j = m - 1; i < n; i++){ while(j >= 0 && a[i] + b[j] > x) j--; if(j >= 0 && a[i] + b[j] == x) printf("%d %d",i,j); } return 0; }
|
版权声明: 此文章版权由chen-yisen所有,如有转载,请注明明來自原作者