Median of Two Sorted Arrays

来源:互联网 发布:java list json 转换 编辑:程序博客网 时间:2024/05/17 05:51

题目:
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

主要思想:
在两个数组中查找第k个元素时(k从1开始),若nums1[k/2-1]>nums2[k/2-1],这说明在数组nums2中,前k/2个元素(数组从nums2[0]开始)中肯定不包含第k个元素,将这前k/2个元素剔除,在num1和剩余的nums2元素中查找第k-k/2个元素.

代码:

double find_the_Kth_element(int* nums1, int nums1Size, int* nums2, int nums2Size,int k){// k从1开始,而不是0开始    if(nums1Size<nums2Size)// 默认是数组1的长度大于数组2的      return find_the_Kth_element(nums2, nums2Size, nums1,nums1Size,k);    if(nums2Size==0)         return nums1[k-1];    if(k==1)        return nums1[0]<nums2[0]?nums1[0]:nums2[0]; // min()    int partitionPosition2=k/2<nums2Size?k/2:nums2Size;// min()    int partitionPosition1=k-partitionPosition2; //这一步很巧妙    if(nums1[partitionPosition1-1]>nums2[partitionPosition2-1])        return find_the_Kth_element(nums1, nums1Size,        nums2+partitionPosition2,nums2Size-partitionPosition2,k-partitionPosition2);    else if( nums1[partitionPosition1-1]<nums2[partitionPosition2-1])        return find_the_Kth_element(nums1+partitionPosition1, nums1Size-        partitionPosition1, nums2,nums2Size,k-partitionPosition1);    else return nums1[partitionPosition1-1];}double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {    int total=(nums1Size+nums2Size);    if(total&0X1)        return find_the_Kth_element(nums1, nums1Size, nums2, nums2Size,total/2+1);    else return (find_the_Kth_element(nums1, nums1Size, nums2, nums2Size,total/2)+                 find_the_Kth_element(nums1, nums1Size, nums2, nums2Size,total/2+1))/2;}
0 0