数组元素的目标和
给定两个升序排序的有序数组 A 和 B,以及一个目标值 x。
数组下标从 00 开始。
请你求出满足 A[i]+B[j]=x=的数对 (i,j)。
数据保证有唯一解。
输入格式
第一行包含三个整数 n,m,x,分别表示 A 的长度,B 的长度以及目标值 x。
第二行包含 n 个整数,表示数组 A。
第三行包含 m个整数,表示数组 B。
输出格式
共一行,包含两个整数 i 和 j。
数据范围
数组长度不超过 105105。
同一数组内元素各不相同。
1≤数组元素≤1091≤数组元素≤109
输入样例:
输出样例:
方法一
用哈希表记录x-a[i]
的下标,如果b
中元素在哈希表中出现过说明b[j]+a[i]==x
。题目保证有唯一解,输出完直接返回。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #include<iostream> #include<vector> #include<unordered_map> using namespace std;
int main(){ int n,m,x; cin>>n>>m>>x; vector<int> a(n+1),b(n+1); unordered_map<int,int> h; for(int i=0;i<n;i++){ cin>>a[i]; h[x-a[i]]=i; } for(int i=0;i<m;i++) { cin>>b[i]; if(h.find(b[i])!=h.end()){ cout<<h[b[i]]<<" "<<i<<endl; break; } } return 0; }
|
方法二
指针i
指向a
的起点,指针j
指向b
的终点。如果a[i]+b[j]<x
,i++
.如果a[i]+b[j]>x
,j--
如果相等,输出。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #include<iostream> #include<vector> using namespace std;
int main(){ int n,m,x; cin>>n>>m>>x; vector<int> a(n),b(n); for(int i=0;i<n;i++) cin>>a[i]; for(int i=0;i<m;i++) cin>>b[i]; int i=0,j=m-1; while(a[i]+b[j]!=x){ if(a[i]+b[j]>x) j--; else i++; } cout<<i<<" "<<j; return 0; }
|