题目
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)).
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
解题思路
这道题是求 2 个有序数组的中间值,那么就先合并数组,然后取中间值。
- 判断有没有数组为空,若是有一个数组为空,那么直接操作另一个数组就可以了。
- 合并数组过程中,需要留意数组边界问题。
- 由于是取合并数组的中间值,那么并不需要将 2 个数组完全合并,只要合并后的数组长度为两个数组长度之和的 1/2 即可。
- 若是2个数组长度之和为偶数,那么中间值是需要从合并后数组的 2 个值中取平均数。若为奇数,那么直接从合并后数组取值即可。
解题代码
double medianSortedArrays(vector<int>& nums){
int mid = nums.size() / 2;
if (nums.size() % 2) {
// 偶数
return (nums[mid]);
}else{
// 奇数
return (nums[mid] + nums[mid-1])/2.0;
}
return 0;
}
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
if (nums1.size() == 0) {
return medianSortedArrays(nums2);
}
if (nums2.size() == 0) {
return medianSortedArrays(nums1);
}
vector<int> nums3 ;
int size = (nums1.size() + nums2.size());
int mid = size / 2;
int nums1Value = 0,nums2Value = 0;
int nums1Index ,nums2Index,i;
for (i = nums1Index = nums2Index = 0; i < size; i++) {
//边界处理
if(nums1Index < nums1.size())
{
nums1Value = nums1[nums1Index];
}else{
nums1Value = INT_MAX;
}
//边界处理
if(nums2Index < nums2.size())
{
nums2Value = nums2[nums2Index];
}else{
nums2Value = INT_MAX;
}
if (nums1Value < nums2Value) {
nums3.push_back(nums1Value);
nums1Index ++;
}else{
nums3.push_back(nums2Value);
nums2Index ++;
}
if(i == mid){
break;
}
}
if (size % 2) {
// 奇数
return (nums3[mid]);
}else{
// 偶数
return (nums3[mid] + nums3[mid-1])/2.0;
}
return 0;
}