数据结构与算法

数组--寻找中位数

2020-01-06  本文已影响0人  暮想sun

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
例:nums1 = [1, 2] nums2 = [3, 4]
思路:从左右分别开始进行比较,如果两个数组中其中一个比较完毕。直接将另一个数组的元素赋值给新数组

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

        //nums1为空
        if (nums1.length == 0) {
            return findMedianSortedArrays(nums2);
        }

        //nums2为空
        if (nums2.length == 0) {
            return findMedianSortedArrays(nums1);
        }

        //都不为空
        int[] nums = new int[nums1.length + nums2.length];

        //定义左右数组下标
        int left = 0;
        int right = nums.length - 1;

        //定义第一第二数组开始和结束标志
        int firstNumLeft = 0, secondNumLeft = 0, firstNumRight = nums1.length - 1, secondNumRight = nums2.length - 1;
        while (firstNumLeft <= firstNumRight && secondNumLeft <= secondNumRight) {
            if (nums1[firstNumLeft] <= nums2[secondNumLeft]) {
                nums[left++] = nums1[firstNumLeft++];
            } else {
                nums[left++] = nums2[secondNumLeft++];
            }

            if (nums1[firstNumRight] >= nums2[secondNumRight]) {
                nums[right--] = nums1[firstNumRight--];
            } else {
                nums[right--] = nums2[secondNumRight--];
            }
        }

        //第一个数组仍存在数据
        while (firstNumLeft <= firstNumRight) {
            nums[left++] = nums1[firstNumLeft++];
        }

        //第二个数组仍存在数据
        while (secondNumLeft <= secondNumRight) {
            nums[left++] = nums2[secondNumLeft++];
        }

        return findMedianSortedArrays(nums);
    }

    public static double findMedianSortedArrays(int[] nums) {
        //偶数时返回中间两数相加/2,奇数时返回中间数
        int mid = nums.length / 2;
        if (nums.length % 2 == 0) {
            return (double)(nums[mid] + nums[mid - 1]) / 2;
        }
        return (double)nums[mid];
    }
上一篇下一篇

猜你喜欢

热点阅读