LeetCode4. 两个排序数组的中位数

题目

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

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

示例 1:

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

中位数是 2.0

示例 2:

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

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


分析

两个有序数组,找中位数,要求时间复杂度位log(m+n),我写出来的是(m+n)/2。

类似于将两个有序数组重新排列成一个新的有序数组,只不过排列到一半的时候就可以停止了。

还有数组长度之和m+n的是奇是偶要分开来讨论,因为偶数位的中位数是两个相加/2。

用了不少变量做中间存储,空间复杂度o(1)。

要注意nums1数组遍历完之后,nums2数组还有数字没有遍历的情况。

代码量有些多,代码也有些乱,一心光想着睡觉了。不过思路还是比较简单哒。

代码

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int len1 = nums1.length;
        int len2 = nums2.length;
        double temp = 0;

        if ((len1 + len2) % 2 == 0){
            int mid = (len1 + len2) / 2;
            int mid2= mid+1;

            int i = 0; int j = 0;
            for (; i < len1 && j < len2; ) {
                int num = 0;
                if (nums1[i] <= nums2[j]){
                    num = nums1[i];
                    i ++;
                }else{
                    num = nums2[j];
                    j++;
                }
                mid --; mid2 --;
               if ( 0 == mid || 0 == mid2){ 
                    temp += num;
                    if (mid2==0)break;
                }
                
            }


            if (mid > 0 || mid2 > 0){
                while (i < len1){
                    mid --; mid2 --;
                    if (mid == 0 || mid2 == 0) temp += nums1[i];
                    i ++;
                }
                while (j < len2){
                    mid --; mid2 --;
                    if (mid == 0 || mid2 == 0) temp += nums2[j];
                    j ++;
                }
            }

            return temp/2;

        }else{
            int mid = (len1+len2) /2 + 1;
            int i = 0; int j = 0;
            for (; i < len1 && j < len2;) {
                int num = 0;
                if (nums1[i] <= nums2[j]){
                    num = nums1[i];
                    i ++;
                }else{
                    num = nums2[j];
                    j++;
                }
                mid --;
                if ( 0 == mid ){
                    temp = num;
                    break;
                }
            }

            if (mid > 0){
                while (i < len1){
                    mid --;
                    if (mid == 0 ){
                        temp = nums1[i];
                        break;
                    }
                    i ++;
                }
                while (j < len2){
                    mid --;
                    if (mid == 0){
                        temp = nums2[j];
                        break;
                    }
                    j ++;

                }
            }
            return temp;
        }
    }
}
好了 去睡觉啦 晚安。

猜你喜欢

转载自blog.csdn.net/qq_38595487/article/details/81057878