zoukankan      html  css  js  c++  java
  • 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;
        }
  • 相关阅读:
    UVa 116 单向TSP(多段图最短路)
    POJ 1328 Radar Installation(贪心)
    POJ 1260 Pearls
    POJ 1836 Alignment
    POJ 3267 The Cow Lexicon
    UVa 1620 懒惰的苏珊(逆序数)
    POJ 1018 Communication System(DP)
    UVa 1347 旅行
    UVa 437 巴比伦塔
    UVa 1025 城市里的间谍
  • 原文地址:https://www.cnblogs.com/skillking/p/9384195.html
Copyright © 2011-2022 走看看