Median of Two Sorted Arrays

来源:互联网 发布:华威医药 知乎 编辑:程序博客网 时间:2024/05/22 15:58

题目(Median of Two Sorted Arrays)-hard

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)).

C语言解答

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {    int* nums = (int*)malloc(sizeof(int)*(nums1Size+nums2Size));    int i,j;    int flag1 = 0;    int flag2 = 0;    if(nums1Size==0 && nums2Size==0){        return 0;    }    if(nums1Size==0 && nums2Size!=0){        if(nums2Size%2 == 0){            return (nums2[nums2Size/2-1]+nums2[nums2Size/2])/2.0;        }else{            return nums2[nums2Size/2];        }    }    if(nums2Size==0 && nums1Size!=0){        if(nums1Size%2 == 0){            return (nums1[nums1Size/2-1]+nums1[nums1Size/2])/2.0;        }else{            return nums1[nums1Size/2];        }    }    if(nums1Size==1 && nums2Size==1){        return (nums1[0]+nums2[0])/2.0;    }        if(nums1Size>=1 && nums2Size>=1){        if(nums1[0]<=nums1[nums1Size-1]){            flag1 = 0;        }else{            flag1 = 1;        }        if(nums2[0]<=nums2[nums2Size-1]){            flag2 = 0;        }else{            flag2 = 1;        }        if(flag1 == flag2){            for(i = 0, j = 0; i < nums1Size && j < nums2Size;){                if(nums1[i]<=nums2[j]){                    nums[i+j] = nums1[i];                    i++;                }else{                    nums[i+j] = nums2[j];                    j++;                }            }            if(i<nums1Size){                for(; i< nums1Size; i++){                    nums[i+j] = nums1[i];                }            }            if(j<nums2Size){                for(; j< nums2Size; j++){                    nums[i+j] = nums2[j];                }            }                    }        if(flag1!=flag2){            for(i = 0, j = nums2Size - 1; i < nums1Size&&j >= 0;){                if(nums1[i]<=nums2[j]){                    nums[i+nums2Size-1-j] = nums1[i];                    i++;                }else{                    nums[i+nums2Size-1-j] = nums2[j];                    j--;                }            }            if(i < nums1Size){                for(; i< nums1Size; i++){                    nums[i+nums2Size-1-j] = nums1[i];                }            }            if(j < nums2Size){                for(; j >= 0; j--){                    nums[i+nums2Size-1-j] = nums2[j];                }            }        }                if((nums1Size+nums2Size)%2==0){            return (nums[(nums1Size+nums2Size)/2-1]+nums[(nums1Size+nums2Size)/2])/2.0;        }else{            return nums[(nums1Size+nums2Size)/2];        }            }}

收获

1. 首先理解题意:给定两个已经排序完成的int数组,然后将两个数组合并,找到中间值,而且时间复杂度为O(log(m+n)).
2. 很明显,题目的核心代码必须利用到两个int数组是sorted,按照一定的顺序进行合并即可;然后要注意的就是一些特定情况出现时的处理,比如某个数组为空,某个数组的值相等;
3. 作为leetcode题目中hard级别的题目来看,这个题目要求的并不是需要掌握多么复杂的数据结构以及算法基础,考验的是清晰的逻辑思考能力。

0 0
原创粉丝点击