LeetCode-4. 兩個排序陣列的中位數

kewlgrl發表於2018-05-01

4. 兩個排序陣列的中位數


給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2 

請找出這兩個有序陣列的中位數。要求演算法的時間複雜度為 O(log (m+n)) 。

示例 1:

nums1 = [1, 3]
nums2 = [2]

中位數是 2.0

示例 2:

nums1 = [1, 2]
nums2 = [3, 4]

中位數是 (2 + 3)/2 = 2.5

C




#include<bits/stdc++.h>
using namespace std;
/********************提交程式碼********************/
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size)
{
    int *a=(int*)malloc((nums1Size+nums2Size+1)*sizeof(int));//將兩個陣列的值合併在一個陣列中
    int *b=(int*)malloc((nums1Size+nums2Size+1)*sizeof(int));//排好序的合併陣列
    int i,j=0,k,maxnum=0;
    double ans=0;
    for(i=0; i<nums1Size; ++i)
    {
        a[j++]=nums1[i];
        if(nums1[i]>maxnum)//記錄最大值
            maxnum=nums1[i];
    }
    for(i=0; i<nums2Size; ++i)
    {
        a[j++]=nums2[i];
        if(nums2[i]>maxnum)
            maxnum=nums2[i];
    }
    int *cnt=(int*)malloc((maxnum+1)*sizeof(int));//雜湊排序
    for(i=0; i<=maxnum; ++i)//初始化
        cnt[i]=0;
    for(i=0; i<nums1Size+nums2Size; ++i)
        ++cnt[a[i]];
    j=0;
    for(i=0; i<=maxnum; ++i)
        for(k=0; k<cnt[i]; ++k)//根據數出現的次數計入新的陣列
        {
            b[j++]=i;
        }
    if((nums1Size+nums2Size)%2)//奇數個
        ans=b[(nums1Size+nums2Size)/2];
    else//偶數個
        ans=(b[(nums1Size+nums2Size)/2]+b[(nums1Size+nums2Size)/2-1])/2.0;
    return ans;
}
/***************************************************/
int main()
{
#ifdef ONLINE_JUDGE
#else
    freopen("F:/cb/read.txt","r",stdin);
    //freopen("F:/cb/out.txt","w",stdout);
#endif
    ios::sync_with_stdio(false);
    cin.tie(0);
    int m,n;
    while(cin>>m>>n)
    {
        int a[1000],b[1000];
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        for(int i=0; i<m; ++i)
            cin>>a[i];
        for(int i=0; i<n; ++i)
            cin>>b[i];
        cout<<findMedianSortedArrays(a,m,b,n)<<endl;
    }
    return 0;
}

感覺我的思路和題目的分類不太一致哇……

兩個陣列歸到一個陣列裡放著,然後用雜湊的思想排序。

忍不住吐槽,Σ(っ°Д°;)っ這居然是困難題??? 恕我直言,某些中等題都比這個讓我頭疼(•́へ•́╬)

因為是“要求演算法的時間複雜度為 O(log (m+n))”?

就是隻能掃一遍,用cnt陣列記錄每個數出現的次數,然後掃描cnt陣列,值是幾就表明這個數出現了幾次,依次存起來就是有序陣列辣(〃'▽'〃)

相關文章