800.给定两个升序排序的有序数组 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
输入样例:
456124734689
输出样例:
11
【解析】拿到双指针算法先想暴力,再想优化。
(1)暴力:
for(i=0;i<n;i++)for(j=0;j<m;j++)
时间复杂度 O(n*m)
(2)优化:找单调性
题中A、B都是升序排序的有序数组
for(i=0;i<n;i++){
在B中找到最小的j,使得A[i]+B[j]>= x;
(当 i 往后移动,j 一定是往前移动,这样 i,j 都不会回溯,
整个过程就是i往右移动,j往左移动,直到找到答案为止)
}
双指针算法时间复杂度:O(n+m)
#include<iostream>
using namespace std;const int N=100010;
int a[N],b[N];
int n,m,x;
int main(void){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,j >=0;i++){while(a[i]+ b[j]> x) j--;if(a[i]+ b[j]== x){printf("%d %d",i,j);break;}}return0;}