zoukankan      html  css  js  c++  java
  • 寻找两个有序数组的中位数

    题目:

    给定两个大小为 m 和 n 的有序数组 nums1 和 nums2

    请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

    你可以假设 nums1 和 nums2 不会同时为空。

    示例 1:

    nums1 = [1, 3]
    nums2 = [2]
    
    则中位数是 2.0
    

    示例 2:

    nums1 = [1, 2]
    nums2 = [3, 4]
    
    则中位数是 (2 + 3)/2 = 2.5
    看到这个题。很容易想到我写过的一篇博客合并两个有序的数组它其中第三种解法我们可以应用。
    所以这个题的思路就是:
      1.申请一个这两个数组长度加起来大小的新数组。
      2.按照顺序排列
      3.元素个数分为奇数和偶数:
        3.1若为奇数,直接返回长度除以2然后加1下标的元素。
        3.2若为偶数,返回长度除以2以及长度除以2加1的和的一半。
    代码如下:
    class Solution {
        public double findMedianSortedArrays(int[] nums1, int[] nums2) {
            int n1 = nums1.length;
            int n2 = nums2.length;
            int[] nums = new int[n1 + n2];
            int i = 0;
            int j = 0;
            int index = 0;
            while(i < n1 && j < n2){
                if(nums[i] <= nums[j]){
                    nums[index++] = nums1[i++];
                }else{
                    nums[index++] = nums2[j++];
                }
            }
            if(i < n1){
                while(i < n1){
                    nums[index++] = nums1[i++];
                }
            }
            if(j < n2){
                while(j < n2){
                    nums[index++] = nums2[j++];
                }
            }
            if(nums.length % 2 == 1){
                return nums[(nums.length / 2) + 1];
            }else{
                int num = nums[nums.length / 2] + nums[nums.length / 2 +1];
                return nums[num];
            }
        }
    }
    

     上面这种方法都是在插入的时候就排序,如果先放进去再排序则时间复杂度就超了。



  • 相关阅读:
    前端工具Gulp的学习
    研究javascript中的this
    如何让引入ES6的html文件运行起来
    windows用命令方式查看文件内容
    windows中用'ls'命令查看项目目录
    一步步理解ajax
    【拥抱ES6】搭建一个ES6环境
    npm还是cnpm
    【聊一聊】css中的经典布局——圣杯布局
    【聊一聊】css中的经典布局——双飞翼布局
  • 原文地址:https://www.cnblogs.com/youdiaodaxue16/p/10744819.html
Copyright © 2011-2022 走看看