【LeetCode算法练习(C语言)】Median of Two Sorted Arrays

来源:互联网 发布:iphone软件下载 编辑:程序博客网 时间:2024/06/05 13:48

题目:
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)).

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

The median is 2.0
Example 2:
nums1 = [1, 2]
nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5

链接:Median of Two Sorted Arrays
解法:非递归二分归并,时间 O(log (m+n))

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {    int cnt = (nums1Size + nums2Size) / 2 + 1;    int pos1 = -1, pos2 = -1, tot1 = nums1Size, tot2 = nums2Size;    double ans;    while (pos1 + pos2 + 2 < cnt) {        if (pos1 == tot1 - 1) {            if (pos1 + (tot2 + pos2) / 2 + 2 <= cnt) pos2 = (tot2 + pos2) / 2;            else tot2 = (tot2 + pos2) / 2;        } else if (pos2 == tot2 - 1) {            if (pos2 + (tot1 + pos1) / 2 + 2 <= cnt) pos1 = (tot1 + pos1) / 2;            else tot1 = (tot1 + pos1) / 2;        } else if (nums1[(tot1 + pos1) / 2] < nums2[(tot2 + pos2) / 2]) {            if ((tot1 + pos1) / 2 + (tot2 + pos2) / 2 < cnt) pos1 = (tot1 + pos1) / 2;            else tot2 = (tot2 + pos2) / 2;        } else {            if ((tot1 + pos1) / 2 + (tot2 + pos2) / 2 < cnt) pos2 = (tot2 + pos2) / 2;            else tot1 = (tot1 + pos1) / 2;        }    }    if ((nums1Size + nums2Size) % 2) {        if (nums1[pos1] > nums2[pos2]) ans = (double)nums1[pos1];        else ans = (double)nums2[pos2];    } else {        if (nums1[pos1] > nums2[pos2]) {            if (pos1 >= 1 && nums1[pos1 - 1] > nums2[pos2]) ans = ((double)nums1[pos1] + (double)nums1[pos1 - 1]) / 2;            else ans = ((double)nums1[pos1] + (double)nums2[pos2]) / 2;        } else {            if (pos2 >= 1 && nums2[pos2 - 1] > nums1[pos1]) ans = ((double)nums2[pos2] + (double)nums2[pos2 - 1]) / 2;            else ans = ((double)nums1[pos1] + (double)nums2[pos2]) / 2;        }    }    return ans;}

Runtime: 45 ms

阅读全文
0 0
原创粉丝点击