[LeetCode]Median of Two Sorted Arrays

原创 2015年07月07日 20:43:09

这里写图片描述

题目的要求实际上是log(m+n)
实际提交时(m+n)log(m+n)也是对的
c++实现时,两句话就可以了,两个vector放一起
sort一些即可
锻炼一下c的能力,写了下快排

//交换两个元素
void swap(int *a, int *b){
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

int median3(int *v, int left, int right){
    int median = (left+right)/2;
    //先将最小的放在left
    if(v[median]<v[left])
        swap(v+median, v+left);
    if(v[right]<v[left])
        swap(v+right,v+left);
    //中间的数放在median
    if(v[median]>v[right])
        swap(v+median, v+right);
    swap(v+median, v+right-1);
    return v[right-1];
}
void InsertSort(int *v, int N){
    int tmp;int i,j;
    for(i = 1; i != N; ++i){
        tmp = v[i];
        for(j = i; j!=0&&v[j-1]>tmp; --j)
            v[j]=v[j-1];
        v[j] =tmp;
    }
}
void QuickSort(int *v, int left, int right){
    if((right-left)>16){
    int i = left, j = right-1;
    int pivot = median3(v, left, right);
    for(;;){
        while(v[++i]<pivot){}
        while(v[--j]>pivot){}
        if(i<j)
            swap(v+i,v+j);
        else
            break;
    }
    swap(v+right-1, v+i);
    QuickSort(v,left,i-1);
    QuickSort(v,i+1,right);
    }
    else
        InsertSort(v+left, right-left+1);

}
void Quick_Sort(int *v, int N){
    QuickSort(v,0,N-1);
}
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
        int *v = (int*)malloc(sizeof(int)*(nums1Size+nums2Size));
        for(int i = 0; i!= nums1Size; ++i)
            v[i] = nums1[i];
        for(int j = 0; j!= nums2Size; ++j)
            v[nums1Size+j]=nums2[j];
        int v_size = nums1Size+nums2Size;
        Quick_Sort(v,v_size);
        if(v_size%2)
            return v[(v_size-1)/2];
        else
            return (v[v_size/2]+v[v_size/2-1])/2.0;
}

补充
o(m+n)寻找kth

#include<iostream>

using namespace std;

int findkth(int *a,int m, int *b,int n,int k){
    if(m==0)
        return b[k-1];
    if(n==0)
        return a[k-1];
    if(k==1)
        return a[0]<b[0]?a[0]:b[0];
    int idx = 1;    //现在指向第k大的数
    int i = 0;
    int j = 0;
    while(idx!=k){
        while(a[i]<b[j]){if(idx==k) return a[i];++i;++idx;}
        while(a[i]>=b[j]){if(idx==k) return b[j];++j; ++idx;}
    }
}

int main(){
    int a[4]={1,2,3,6};
    int b[2]={5,7};
    cout <<findkth(a,4,b,2,5)<<endl;
    return 0;

}

一个很好的方法
最后从medianof two sorted arrays中看到了一种非常好的方法。原文用英文进行解释,在此我们将其翻译成汉语。该方法的核心是将原问题转变成一个寻找第k小数的问题(假设两个原序列升序排列),这样中位数实际上是第(m+n)/2小的数。所以只要解决了第k小数的问题,原问题也得以解决。

首先假设数组A和B的元素个数都大于k/2,我们比较A[k/2-1]和B[k/2-1]两个元素,这两个元素分别表示A的第k/2小的元素和B的第k/2小的元素。这两个元素比较共有三种情况:>、<和=。如果A[k/2-1]

double findKth(int a[], int m, int b[], int n, int k)
{
    //always assume that m is equal or smaller than n
    if (m > n)
        return findKth(b, n, a, m, k);
    if (m == 0)
        return b[k - 1];
    if (k == 1)
        return min(a[0], b[0]);
    //divide k into two parts
    int pa = min(k / 2, m), pb = k - pa;
    if (a[pa - 1] < b[pb - 1])
        return findKth(a + pa, m - pa, b, n, k - pa);
    else if (a[pa - 1] > b[pb - 1])
        return findKth(a, m, b + pb, n - pb, k - pb);
    else
        return a[pa - 1];
}

class Solution
{
public:
    double findMedianSortedArrays(int A[], int m, int B[], int n)
    {
        int total = m + n;
        if (total & 0x1)
            return findKth(A, m, B, n, total / 2 + 1);
        else
            return (findKth(A, m, B, n, total / 2)
                    + findKth(A, m, B, n, total / 2 + 1)) / 2;
    }
};
版权声明:本文为博主原创文章,未经博主允许不得转载。

两个有序数组的中位数Median of Two Sorted Arrays(很重要)

https://leetcode.com/problems/median-of-two-sorted-arrays/ 对于一个长度为n的已排序数列a,若n为奇数,中位数为a[n / 2 + 1]...
  • gao1440156051
  • gao1440156051
  • 2016年06月21日 11:11
  • 3284

寻找两个数组的中位数 Median of Two Sorted Arrays ***问题转化思想***

题目源自于Leetcode。经典好题。 题目: There are two sorted arrays A and B of size m and n respectively. Find the ...
  • u012239334
  • u012239334
  • 2013年11月20日 14:46
  • 721

LintCode数组题总结

做算法题的时候,几乎不可避免要跟数组打交道。在LintCode上数组那一章有这么一些题目: 1)547. Intersection of Two Arrays 比较简单。要求找到2个数组的...
  • luoshengkim
  • luoshengkim
  • 2016年06月02日 23:16
  • 1807

【数组】两个排序数组的中位数Median of Two Sorted Arrays

题目:找到两个排序数组的中位数, 两个数组大小分别是m和n, 要求时间复杂度是O(log(m+n)) 中位数:数组长度是基数,则中位数是中间值;数组长度是偶数,则中位数是中间两个数的算术平均值 ...
  • yeahfeng520
  • yeahfeng520
  • 2017年04月16日 16:45
  • 122

算法设计与分析(3)-- Median of Two Sorted Arrays(难度:hard)

Median of Two Sorted Arrays
  • alexlau8
  • alexlau8
  • 2017年03月07日 15:28
  • 115

寻找两个不等长数组的中位数 Median of Two Sorted Arrays

题目源自于Leetcode。经典好题。 题目: 给出两个有序数组,长度不一定相同,一个是m一个是n,要求给出他们合并在一起之后的数组的中位数。 要求时间复杂度为O(log(m+n)),所以不可以合并数...
  • luckyjoy521
  • luckyjoy521
  • 2013年11月10日 14:42
  • 3191

Median of Two Sorted Arrays(两个有序数组的中位数)

There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the ...
  • KaJIU
  • KaJIU
  • 2017年03月06日 21:28
  • 80

Median of Two Sorted Arrays(求两个数组的中位数)

There are two sorted arrays nums1 and nums2 of size m and n respectively.Find the median of the two ...
  • ylifam
  • ylifam
  • 2017年03月07日 00:08
  • 139

Median of Two Sorted Arrays - 寻找两个有序数组的中位数(重)

问题: There are two sorted arrays A and B of size m and n respectively. Find the median of the two so...
  • skyoceanlover
  • skyoceanlover
  • 2014年06月20日 21:10
  • 483

Intersection of Two Arrays II两个数组交集(重要!)

https://leetcode.com/problems/intersection-of-two-arrays-ii/ Given two arrays, write a function ...
  • gao1440156051
  • gao1440156051
  • 2016年06月26日 23:21
  • 1465
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[LeetCode]Median of Two Sorted Arrays
举报原因:
原因补充:

(最多只允许输入30个字)