publicdoublefindMedianSortedArrays(int[] A,int[] B){int m = A.length;int n = B.length;int len = m + n;int left =-1, right =-1;int aStart =0, bStart =0;for(int i =0; i <= len /2; i++){left = right;if(aStart < m &&(bStart >= n || A[aStart]< B[bStart])){right = A[aStart++];}else{right = B[bStart++];}}if((len &1)==0)return(left + right)/2.0;elsereturn right;}
3. 求第 k 小數(shù) k/2
時(shí)間復(fù)雜度:O(log(m+n) 空間復(fù)雜度:O(1)
publicdoublefindMedianSortedArrays(int[] nums1,int[] nums2){int n = nums1.length;int m = nums2.length;int left =(n + m +1)/2;int right =(n + m +2)/2;//將偶數(shù)和奇數(shù)的情況合并,如果是奇數(shù),會(huì)求兩次同樣的 k 。return(getKth(nums1,0, n -1, nums2,0, m -1, left)+getKth(nums1,0, n -1, nums2,0, m -1, right))*0.5;}privateintgetKth(int[] nums1,int start1,int end1,int[] nums2,int start2,int end2,int k){int len1 = end1 - start1 +1;int len2 = end2 - start2 +1;//讓 len1 的長度小于 len2,這樣就能保證如果有數(shù)組空了,一定是 len1 if(len1 > len2)returngetKth(nums2, start2, end2, nums1, start1, end1, k);if(len1 ==0)return nums2[start2 + k -1];if(k ==1)return Math.min(nums1[start1], nums2[start2]);int i = start1 + Math.min(len1, k /2)-1;int j = start2 + Math.min(len2, k /2)-1;if(nums1[i]> nums2[j]){returngetKth(nums1, start1, end1, nums2, j +1, end2, k -(j - start2 +1));}else{returngetKth(nums1, i +1, end1, nums2, start2, end2, k -(i - start1 +1));}}