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

两个排序数组的中位数

程序员文章站 2024-03-16 12:46:52
...

leetcode_Q004: 两个排序数组的中位数__java 实现

问题描述:

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。

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

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

解题思路

解题思想来源:”数据结构”中,对长度分别是m,n的两个有序链表进行合并,该算法的时间复杂度正好是 O(log (m+n))

public class question4 {
    public static void main(String[] args) {
        int[] nums1 = {1,3};
        int[] nums2 = {};
        System.out.println(question4.findMedianSortedArrays(nums1,nums2));

    }


    public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int nums1_len=0;
        int nums2_len=0;

        if (nums1!=null && nums1.length!=0)
            nums1_len=nums1.length;

        if (nums2!=null && nums2.length!=0)
            nums2_len=nums2.length;

        if (nums1_len==0&& nums2_len>0){
            if(nums2_len%2==0)
                return (nums2[nums2_len/2]+nums2[nums2_len/2-1])/2.0;
            else
                return nums2[(nums2_len-1)/2]+0.0;

        }else if(nums2_len==0&& nums1_len>0){
            if(nums1_len%2==0)
                return (nums1[nums1_len/2]+nums1[nums1_len/2-1])/2.0;
            else
                return nums1[(nums1_len-1)/2]+0.0;

        }
        int[] merge = new int[nums1_len+nums2_len];
        int merge_len=0;
        int i=0,j=0;
        while (i<nums1_len && j<nums2_len){
            if(nums1[i]<nums2[j])
                merge[merge_len++]=nums1[i++];
            else
                merge[merge_len++]=nums2[j++];
        }
        while (i<nums1_len)
                merge[merge_len++]=nums1[i++];

        while (j<nums2_len)
            merge[merge_len++]=nums2[j++];

        if(merge_len%2==0)
            return (merge[merge_len/2]+merge[merge_len/2-1])/2.0;
        else
            return merge[(merge_len-1)/2]+0.0;


    }
}