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)\)
posted @ 2020-09-17 16:12  童年の波鞋  阅读(111)  评论(0编辑  收藏  举报