数组--寻找中位数

作者: 暮想sun | 来源:发表于2020-01-06 11:09 被阅读0次

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

    相关文章

      网友评论

        本文标题:数组--寻找中位数

        本文链接:https://www.haomeiwen.com/subject/eunhactx.html