4. Median of Two Sorted Arrays

一、题目

  1、审题:

      

   2、分析

      求两个给出的有序数组整合后的最中间的数字;

二、解答

  1、方法一、

    暴力法:

    新建一个数组存放两个所给数组的元素;然后根据数组长度来取出中间的数;注意分数组中元素个数为奇数和偶数情况;

    时间复杂度为 O(log(m+n))

    

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {

        int[] arr = new int[nums1.length + nums2.length];   // 新建数组

        if(nums1.length == 0 && nums2.length == 0)
            return 0;
        else if(nums1.length == 0)
            arr = nums2;
        else if(nums2.length == 0)
            arr = nums1;
        else {
            int i = 0, j = 0, index = 0;

            while (i < nums1.length && j < nums2.length) {
                if (nums1[i] < nums2[j])
                    arr[index++] = nums1[i++];
                else
                    arr[index++] = nums2[j++];
            }

            while (i < nums1.length)
                arr[index++] = nums1[i++];
            while (j < nums2.length)
                arr[index++] = nums2[j++];
        }
        int median = arr.length / 2;
        double result;
        if(arr.length % 2 == 1)       // 一个中间数
            result = arr[median];
        else {              // 俩个中间数
            result = (arr[median] + arr[median - 1]) / 2.0;
        }
        return result;
    }
}

  方法二、

    ① 不需要将两个数组真的合并,我们只需要找到中位数在哪里就可以了。

    ② 用 len 表示合并后数组的长度,如果是奇数,我们需要知道第 (len + 1)/ 2 个数就可以了,如果遍历的话需要遍历 int ( len / 2 ) + 1 次。

    ③ 如果是偶数,我们需要知道第 len / 2 和 len / 2 + 1 个数,也是需要遍历 len / 2 + 1 次。所以遍历的话,奇数和偶数都是 len / 2 + 1 次。

    ④ 返回中位数的话,奇数需要最后一次遍历的结果就可以了,偶数需要最后一次和上一次遍历的结果。所以我们用两个变量 left 和 right ,right 保存当前循环的结果,在每次循环前将 right 的值赋给 left 。

    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int m = nums1.length;
        int n = nums2.length;
        int len = m + n;
        int left = -1 , right = -1;
        int aStart = 0, bStart = 0;
        for (int i = 0; i <= len / 2; i++) {
            left = right;
            if(aStart < m && (bStart >= n || nums1[aStart] < nums2[bStart]))
                right = nums1[aStart++];
            else 
                right = nums2[bStart++];
        }
        if((len & 1) == 0)    // 偶数
            return (left + right ) / 2.0;
        return right;
    }
原文地址:https://www.cnblogs.com/skillking/p/9384195.html