【LeetCode算法练习(C语言)】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 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

你可能感兴趣的:(算法分析)