龙空技术网

每日一练——寻找两个正序数组的中位数

农民工屈原 139

前言:

此时同学们对“求数组的中位数”大致比较注意,咱们都想要学习一些“求数组的中位数”的相关内容。那么小编也在网络上汇集了一些对于“求数组的中位数””的相关内容,希望同学们能喜欢,同学们一起来了解一下吧!

思路:二分查找,分为合并数组与不合并数组两种方式,合并数组较为简单,但是其空间复杂度较高,为O(m+n),这里不介绍,此时介绍不合并数组的方案。

class Solution {    public double findMedianSortedArrays(int[] nums1, int[] nums2) {        int len1 = nums1.length, len2 = nums2.length;        int len = len1 + len2;        if(len % 2 == 1){            int m = len / 2;            double res = getK(nums1, nums2, m + 1);            return res;        }else{            int m1 = len / 2 - 1, m2 = len / 2;            double res = (getK(nums1, nums2, m1 + 1) + getK(nums1, nums2, m2 + 1)) / 2.0;            return res;        }    }    public double getK(int[] nums1, int[] nums2, int k){        int len1 = nums1.length, len2 = nums2.length;        int index1 = 0, index2 = 0;        int KthElement = 0;        while(true){          	//边界            if(index1 == len1){                return nums2[index2 + k - 1];            }            if(index2 == len2){                return nums1[index1 + k - 1];            }            if(k == 1){                return Math.min(nums1[index1], nums2[index2]);            }          	//正常            int m = k / 2;            int newIndex1 = Math.min(index1 + m, len1) - 1;            int newIndex2 = Math.min(index2 + m, len2) - 1;            int pivot1 = nums1[newIndex1], pivot2 = nums2[newIndex2];            if(pivot1 <= pivot2){              	//排除小的一部分,保留剩下的,指针移动                k -= (newIndex1 - index1 + 1);                index1 = newIndex1 + 1;            }else{                k -= (newIndex2 - index2 + 1);                index2 = newIndex2 + 1;            }        }    }}

标签: #求数组的中位数 #数组中位数计算例题