wyjgm

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  1. 题目描述
给定两个升序排序的有序数组 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. 算法思路
  • 仍然先考虑暴力做法,直接枚举数组每一个位置的元素,然后遍历另一个数组的元素,判断是否有等于x的,如果有就输出答案,时间复杂度为O(n*m)
  • 观察单调性,对于每一个i而言,i越大对应元素的值也就越大,此时j也就应该从后往前找,也就是i变大j变小,此时时间复杂度为O(n+m)
  1. 代码实现
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

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

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 i=0;i<n;i++){
  	int l=0,r=m-1;
  	while(l<r){
  		int mid=l+r>>1;
  		if(b[mid]+a[i]>=x) r=mid;
  		else l=mid+1;
  	}
  	if(a[i]+b[l]==x){
  		cout << i <<' '<<l<<endl;
  		break;
  	}
  }
  
  /*for(int i=0,j=m-1;i<n;i++){
  	while(j && a[i]+b[j]>x)	j--;
  	if(a[i]+b[j]==x){
  		cout << i <<' '<<j<<endl;
  		break;
  	}	
  	
  }*/
  
  return 0;
}
posted on 2026-02-23 15:51  我要加个米  阅读(2)  评论(0)    收藏  举报