LeetCode 4:寻找两个有序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5
第一次做困难级别的题,真的看题解都看半天看不懂。/(ㄒoㄒ)/~~
力扣Leetcode 4官方题解
看了几遍,总结起来就2点:
- 理解中位数的意思,两个有序数组懂得如何切分得到中位数。
- 看见
log
使用二分法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| class Solution { public double findMedianSortedArrays(int[] nums1, int[] nums2) { int m = nums1.length; int n = nums2.length; if(m>n){ return findMedianSortedArrays(nums2,nums1); } int iMin = 0,iMax = m; while(iMin <= iMax){ int i = (iMin + iMax)/2; int j = (m+n+1)/2 - i; //二分位置 if(j != 0 && i != m && nums2[j-1] > nums1[i]){ //i需要增大 iMin = i+1; } else if(i!=0 && j!=n && nums1[i-1]>nums2[j]){ iMax = i-1; } else{ int maxLeft = 0; if(i == 0) { //边界条件单独考虑 maxLeft = nums2[j-1]; } else if(j==0){ maxLeft = nums1[i-1]; } else{ maxLeft = Math.max(nums1[i-1],nums2[j-1]); } if(1 == (m+n)%2){ //奇数的情况不用考虑右半部分 return maxLeft; }
int minRight=0; if(i == m){ minRight = nums2[j]; } else if(j==n){ minRight = nums1[i]; } else{ minRight = Math.min(nums1[i],nums2[j]); }
return (maxLeft + minRight)/2.0; } } return 0.0; } }
|