欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LeetCode刷题——4.寻找两个有序数组的中位数

程序员文章站 2022-04-17 16:57:32
...

题目来源:https://leetcode-cn.com/problems/median-of-two-sorted-arrays

题目4:

给定两个大小为 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

解法:
一、首先我想解决该算法的思想是对于两个数组,首先判断两数组长度和的奇偶性。

若为奇数,则取最中间一个数为中位数;使用index1和index2来表示两个数组的起点,若两索引之和小于中位数的索引,则停止继续遍历;在遍历的过程中,如果数组一的值小于数组二的值,则数组一的索引加一遍历,反之数组二的索引加一遍历,当遍历到中位数的索引时,使得中位数为当前遍历到的值,该值即为中位数。

若为偶数,则取中间两个数的平均数为中位数;遍历过程如上,只不过当遍历到中位数索引-1的位置和中位数索引的位置时,把这两个数保存下来,求他两的平均值即为中位数。代码如下:

LeetCode刷题——4.寻找两个有序数组的中位数

可是运行时间太长,超过限制,没有得到结果。

二、参考了网上的解法,提交结果通过,代码如下:

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int i = 0,j = 0;
        int count = 0;
        int len1 = nums1.length;
        int len2 = nums2.length;
        int[] nums = new int[len1+len2];
        if(len1 ==0){
            if(len2%2 ==0)
                return (nums2[len2/2-1]+nums2[len2/2])/2.0;
            else
                return nums2[len2/2];
        }
        if(len2 ==0){
            if(len1%2 ==0)
                return (nums1[len1/2-1]+nums1[len1/2])/2.0;
            else
                return nums1[len1/2];
        }
        while(count!=(len1+len2)){
            if(i==len1){
                while(j!=len2)
                    nums[count++] = nums2[j++];
                break;
            }
            if(j==len2){
                while(i!=len1)
                    nums[count++] = nums1[i++];
                break;
            }
            if(nums1[i]<nums2[j])
                nums[count++] = nums1[i++];
            else
                nums[count++] = nums2[j++];
        }
        if(count%2==0)
            return (nums[count/2-1]+nums[count/2])/2.0;
        else
            return nums[count/2];
    }
}

这个算法的思想较好理解,首先分别判断两个数组是不是空数组,如果一个为空,则直接由另一个去计算中位数,再判断该不为空的数组的奇偶性,分别讨论。

如果两个数组都不为空,则新创建一个数组,根据传入两数组的值大小进行遍历,将较小的一个放入新数组,依次向后进行,如果在遍历过程中,一个数组遍历完了,则单独遍历另一个数组,直到遍历完该数组,最终能够得到一个新数组,在该数组中数的排列是有序的,可直接根据奇偶性得到中位数。

但是该结果的时间复杂度貌似不是O(log(m + n))。

三、符合题目的解法