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

这里是题目描述:LeetCode-4.寻找两个正序数组的中位数

本题参考了LeetCode官网题解

暂时不对题解进行详述

题解代码:

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        if((nums1.length+nums2.length)%2==1) //两数组总长度为奇数
        {
            int k=(nums1.length+nums2.length)/2+1;
            return findNumber(nums1,nums2,k);
        }
        else //两数组总长度为偶数
        {
            int k=(nums1.length+nums2.length)/2+1;
            return ((double)findNumber(nums1,nums2,k)+(double)findNumber(nums1,nums2,k-1))/2;
        }
    }
    int findNumber(int[] nums1,int[] nums2,int k) //从nums1和nums2中找到第k个数字
    {
        int p1=0,p2=0;
        while(p1<nums1.length && p2<nums2.length)
        {
            if(k==1)
            {
                return Math.min(nums1[p1],nums2[p2]);
            }
            int halfK=k/2;
            int t1=p1+halfK-1,t2=p2+halfK-1; //在nums1和nums2上向前寻找k/2个数字
            t1=Math.min(t1,nums1.length-1); //如果向前寻找k/2个数字超出数组的最大长度,则指向最大长度处的元素即可
            t2=Math.min(t2,nums2.length-1);
            if(nums1[t1]<nums2[t2])
            {
                k-=(t1-p1+1);
                p1=t1+1;
            }
            else
            {
                k-=(t2-p2+1);
                p2=t2+1;
            }
        }
        if(p1>=nums1.length)
        {
            return nums2[p2+k-1];
        }
        else //p2>=nums2.length
        {
            return nums1[p1+k-1];
        }
    }
}

时间复杂度:O(logn)
空间复杂度:O(1)

你可能感兴趣的:(leetcode)