今天这道题在Leetcode标注的是hard,但是我觉得超级简单。很可能是自己的思路还有问题,或者复杂度还有问题吧。不过目前是满足题目要求了。后续还需要思考一下,怎么样继续优化它。加油。
题目内容:
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)).
题目描述:
找出两个已经排好序的vector的中位数。所谓的中位数是指:如果数组数目是奇数的话,就是中间的那个;如果是偶数的话,就是中间两个的平均值。
坑(自己私下认为的)
1,返回值是double型的,处理时要注意;
2,时间复杂度题目上有要求哈。所以不要连接两个vector,再排序。那样的话,就不符合题目要求啦。
3,边界条件需要注意。
自己的思路:
合并两个有序的vector到一个,然后依据奇偶特性取中位数。这个复杂度主要花在合并上,时间和空间的复杂度都为O(m+n)。
代码如下所示,在Leetcode上AC了的。
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
vector<int> total_nums;
int nums1_size = nums1.size();
int nums2_size = nums2.size();
if((nums1_size <= 0) && (nums2_size <= 0))
return 0;
int p = 0;//nums1的index
int q = 0;//nums2的index
int i = 0;//total_nums的index
//以下,完成有序数组的合并
for(; i < nums1_size + nums2_size;i++)
{
if((p >= nums1_size)||(q >= nums2_size))
break;
if(nums1[p] <= nums2[q])
{
total_nums.push_back(nums1[p]);
p++;
}
else
{
total_nums.push_back(nums2[q]);
q++;
}
}
if(p >= nums1_size)
{
while(q < nums2_size)
{
total_nums.push_back(nums2[q]);
q++;
}
}
else if(q >= nums2_size)
{
while(p < nums1_size)
{
total_nums.push_back(nums1[p]);
p++;
}
}
int total_nums_size = total_nums.size();
//判断是奇还是偶
if(total_nums_size%2 == 0)
{
return (double)(total_nums[total_nums_size / 2 - 1] + total_nums[total_nums_size / 2]) / 2.0;
}
else
{
return total_nums[total_nums_size / 2];
}
}
};