4. Median of Two Sorted Arrays
题目链接:https://leetcode.com/problems/median-of-two-sorted-arrays/
Description:
There are two sorted arrays nums1 and nums2 of size m and n respectively.
Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
You may assume nums1 and nums2 cannot be both empty.
Example 1:
nums1 = [1, 3] nums2 = [2] The median is 2.0
Example 2:
nums1 = [1, 2] nums2 = [3, 4] The median is (2 + 3)/2 = 2.5
题意:
给出两个数组nums1,nums2,数组里面的数都是单增的,要求在log(n+m)的时间内,找出两个数组合并后的中位数。
题解:
最近看了看leetcode的题,感觉还是挺有意思的。
这个题就要充分利用中位数的性质来解,中位数,我们首先最容易想到的就是中间位置的数。
其实还有的性质就是:中位数将数列划分为左右两边数量相等且max(left)<=min(right)。
对于长度为偶数,那么左右两边数量可以相等,对于奇数,那么我们这里假定左边的数量比右边大于1。
根据数组单调的这一特征,我们可以二分来划分数组,二分数组nums1在左边的个数i,那么nums2在左边的个数就可以算出来为(n+m+1)/2-i。
最后判断一下nums1[i-1]和nums2[j]以及nums1[j-1]和nums2[i]就ok了。
这里注意一下边界情况:即i=0,i=n,j=0,j=m时的情况,由于我们的算法,i=0,j=0不会同时出现,i=n,j=m也不会同时出现,所以左边部分和右边部分至少有一个数组。最后判断一下就好了。
建议自己去实现代码~还是有细节的。
代码如下:
class Solution { public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int n=nums1.size(),m=nums2.size(); if(n>m) swap(nums1,nums2),swap(n,m); int l=0,r=n+1; while(l<r){ int i = l+r>>1;//0~i-1 int j = (n+m+1>>1)-i;//0~j-1 if(j<m && i>=1 && nums1[i-1]>nums2[j]) r=i; else if(i<n && j>=1 && nums2[j-1]>nums1[i]) l=i+1; else{ int max_left,min_right; if(i==0) max_left = nums2[j-1]; else if(j==0) max_left = nums1[i-1]; else max_left=max(nums1[i-1],nums2[j-1]); if(n+m&1) return max_left; if(i==n) min_right = nums2[j]; else if(j==m) min_right = nums1[i]; else min_right = min(nums1[i],nums2[j]); return (max_left+min_right)/2.0; } } return 0; } };