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;
        }
  • 相关阅读:
    四则运算在线答题dos
    动手动脑11.11
    Java编程中关于异常处理的10个要点
    java第五周课后作业1
    java静态初始化块的执行顺序
    java工程项目作业1
    十一Java作业三
    Linux运维笔记(一)网络基础知识
    分布式笔记(二)一致性协议
    分布式笔记(一)分布式构架概述
  • 原文地址:https://www.cnblogs.com/skillking/p/9384195.html
Copyright © 2011-2022 走看看