美文网首页
「每日一道算法题」Median of Two Sorted Ar

「每日一道算法题」Median of Two Sorted Ar

作者: Levi段玉磊 | 来源:发表于2018-12-27 15:37 被阅读0次

Algorithm

OJ address

Leetcode website : 4. Median of Two Sorted Arrays

Description

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

You may assume nums1 and nums2 cannot be both empty.

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

Solution in C

第一种解法:

#include <stdio.h>
int a[5000];

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
    int index1 = 0;
    int index2 = 0;
    int index3 = 0;
    while(index1<nums1Size && index2<nums2Size) {
        if (nums1[index1]<nums2[index2]) {
            a[index3++] = nums1[index1++];
        }
        else {
            a[index3++] = nums2[index2++];
        }
    }
    while (index1<nums1Size) {
        a[index3++] = nums1[index1++];
    }
    while (index2<nums2Size) {
        a[index3++] = nums2[index2++];
    }
    if ((index3 % 2) != 0) {
        return a[(index3-1)/2];
    }
    else {
        return (a[index3/2]+a[index3/2-1])/2.0;
    }   
}

int main(int argc, char const *argv[])
{
    int c[2] = {1,3};
    int b[2] = {2};
    double dd = findMedianSortedArrays(c,2,b,1);
    printf("dd:%g\n", dd);
    return 0;
}

第二种解法:

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
    int index1, index2, index3, index5, index6, res, resA, resB;
    index1 = index2 = index3 = index5 = index6 = res = resA = resB = 0;
    int length = nums1Size + nums2Size;
    if (length%2!=0) {
        index5 = (length-1)/2;
        index6 = 0;
    }
    else {
        index5 = res = length/2;
        index6 = length/2-1;
    }
    for (int i=0;i<length;++i) {
        if (index1<nums1Size && index2<nums2Size) {
            if (nums1[index1] < nums2[index2]) res = nums1[index1++];
            else res = nums2[index2++];
        }
        else if (index1<nums1Size) res = nums1[index1++];
        else res = nums2[index2++];
        if (i == index5) resA = res;
        if (i == index6) resB = res;
    }
    return (length%2!=0) ? resA : ((resA + resB)/2.0);
}

Solution in Python

class Solution(object):
    def findMedianSortedArrays(self, nums1, nums2):
        i = 0
        j = 0
        length = len(nums1)+len(nums2)
        if length%2!=0:
            res = (length-1)/2
            respre = 0
        else:
            res = length/2
            respre = length/2-1
        for x in range(length):
            if i < len(nums1) and j < len(nums2):
                if nums1[i] < nums2[j]:
                    dd = nums1[i]
                    i = i+1
                else:
                    dd = nums2[j]
                    j = j+1
            elif i < len(nums1):
                dd = nums1[i]
                i = i+1
            elif j < len(nums2):
                dd = nums2[j]
                j = j+1
            if x == res:
                resA = dd
                break
            if x == respre:
                resB = dd
        if length%2!=0: 
            return resA   
        else: 
            return (resA + resB)/2.0
        
if __name__ == '__main__':
    a = Solution()
    d1 = [1,2]
    d2 = [3]
    c = a.findMedianSortedArrays(d1,d2)
    print c

My Idea

题目含义是,给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。

关于复杂度的理解就是,不要用排序去做,一次遍历解决这道题目,其实不用一遍遍历也可以解决这个题目,我写了两个解法:

  1. 第一种解法就是全部遍历,在遍历的时候比较两个数组每各元素的大小,将最小的元素存到新的数组中,然后遍历结束,在新的数组中找到中位数即可。算法的时间复杂度是O(m+n)
  2. 显然第一种解法是全部遍历,但是还有更好的方法,就是不用开数组,仅仅比较给到的两个数组,由于给到的数组长度是题目给你的,那中位数的位置也是固定的了,其实就是比较两个数组,一直比较到中位数的那个位置,然后保存中位数,直接返回结果就可以了。中位数的位置就是两个数组中间的位置。所以时间复杂度是O((m+n)/2),比第一种方法快一倍。而且不用开数组保存,大大的节约了空间复杂度。只要开变量保存结果就可以了。

相关文章

网友评论

      本文标题:「每日一道算法题」Median of Two Sorted Ar

      本文链接:https://www.haomeiwen.com/subject/qgorlqtx.html