这道题的难度也是hard,通过率21%,但事实上这道题目并不难,估计也就中等难度吧,然而看到标签的我是崩溃的,标签是二分搜索,分治,数组。然而我就用了一个类似归并的东西,或者说就是暴力解出来的,但是我过了啊,气不气?我们只关心结果,不要在乎过程。
--------------------题目-----------------------
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------------------题解-------------------------
题目是不是很熟悉,两个已经排好序的数组,简直就是归并排序一模一样啊,所以我选择归并,不知道分治二分要怎么做,建一个向量,然后每次向向量中添加两个数组最小的一个数,然后把这个数删除,直到找到了中位数即可,是不是很简单,时间复杂度是O(n+m),其实最后提交后我这也不是最慢的,甚至还超过了27%的人。
#include<vector>
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int n=nums1.size();
int m=nums2.size();
int t=(m+n)/2;//计算中位数的位置
int k=1;
int index1=0;//
int index2=0;//相当于一个指针记录数组的首位
vector<int> sorted;
for(k=0;k<=t+1;k++)
{
if(index1==n)//给出的数组到了最后,下面一样
{
int temp=t+1-k;
while(temp--)
{
sorted.push_back(nums2[index2]);
index2++;
}
break;
}
else if(index2==m)
{
int temp=t+1-k;
while(temp--)
{
sorted.push_back(nums1[index1]);
index1++;
}
break;
}
else if(nums1[index1]<nums2[index2])//添加一个最小的数到向量中
{
sorted.push_back(nums1[index1]);
index1++;
}
else
{
sorted.push_back(nums2[index2]);
index2++;
}
}
if((m+n)%2==0)
return (double)(sorted[t]+sorted[t-1])/2;
else
return (double)sorted[t];
}
};
代码很简单,可能我并没有按照出题人的思路来,走了捷径,但我们老师说过,一切以程序员的效率为主,所以以最快的思路想出来就好啦,规则就是用来打破的嘛,毕竟他时间复杂度没有限制那么死就说明这种方法是可行的。大家可以研究一下出题人的思路,最近准备考试就没时间想那么多了,good luck。顺便分享一句今天看到的一句话吧:有一种人生是可以成功到让金钱跪下来。讲的是中国工程院首批院士刘先林院士为了做好一场报告,七十八岁高龄在高铁二等座上伏案专注画图纸。有图有真相,大家一起共勉吧。
------------------------------手动分割线-----------------------------
see you next illusion