4.寻找两个正序数组的中位数

题目简介

给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。

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

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

寻找两个有序数组的第k个小值

示例 1:

nums1 = [1, 3]
nums2 = [2]

则中位数是 2.0
示例 2:

nums1 = [1, 2]
nums2 = [3, 4]

则中位数是 (2 + 3)/2 = 2.5

题目思路

1.因为时间复杂度为O log,用二分法
2.考虑一个数组太短,比索引k还小,中位值就按照顺序在另外一个数组找就可以了。
https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/xun-zhao-liang-ge-you-xu-shu-zu-de-zhong-wei-s-114/

具体程序

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int length1 = nums1.length,length2 = nums2.length;
        int totallength  = length1+length2;
        if(totallength % 2 == 1){
            double result = method(nums1,nums2,(totallength+1)/2);
            return result;
        }else {
            double result = (method(nums1,nums2,(totallength)/2) + method(nums1,nums2,(totallength+2)/2))/2.0;
            return result;
        }
    }
        public static int method(int[] nums1, int[] nums2, int k) {
        int length1 = nums1.length,length2 = nums2.length;
        int index1 = 0,index2 = 0;
        while (true){
            if (index1 == length1){
                return nums2[index2 + k - 1];
            }
            if (index2 == length2){
                return nums1[index1 + k -1];
            }
            if (k == 1){
                return Math.min(nums1[index1],nums2[index2]);
            }
            int half = k / 2;
            int newIndex1 = Math.min(index1+half-1,length1-1);
            int newIndex2 = Math.min(index2+half-1,length2-1);
            int pivot1 = nums1[newIndex1],pivot2 = nums2[newIndex2];
            if (pivot1 >= pivot2){
                k = k - (newIndex2 + 1 - index2);
                index2 = newIndex2 + 1;
            }else {
                k = k - (newIndex1 + 1 - index1);
                index1 = newIndex1 + 1;
            }
        }
    }
}

你可能感兴趣的:(4.寻找两个正序数组的中位数)