b_pat_中位数(巧妙添加一个最大值在数组末尾防止越界)
输出一个整数,表示两个序列的中位数。
数据范围
1≤N≤2×105,
序列中的整数都在 int 范围内。
方法一:双指针
用 c 记录当前遍历的个数;注:由于两个数组A、B的长度都是不同的,可能存在长度较短的B遍历完了,还没有找到中位数的尴尬情况;所以通过再末尾添加一个 LONG_MAX 来让指针继续跑
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int n; cin>>n;
ll A[n+1]; for (int i=0; i<n; i++) cin>>A[i];
int m; cin>>m;
ll B[m+1]; for (int i=0; i<m; i++) cin>>B[i];
int h=(n+m-1)/2, c=0, i=0, j=0;
A[n]=LONG_MAX, B[m]=LONG_MAX;
while (c<h) {
if (A[i]<B[j]) i++;
else j++;
c++;
}
cout<<(A[i]<B[j] ? A[i] : B[j]);
return 0;
}
复杂度分析
- Time:\(O(n)\),
- Space:\(O(1)\),