题目
直观思路
想的是如何将两个数组组合起来,也就是将两个有序的数组组合成为一个数组,然后直接计算中位数,将两个数组组合成为一个数组的逻辑上的时间复杂度是(O(N+M)),在此基础上我阐释实现了一个算法,但是时间超时了,AC不了,所以需要更加有效的算法,另外需要注意,在程序测试的时候,不能存在数组越界的情况,尤其是条件判断的时候很容易在极端情况之下忽略该条件,使得我们程序变得很难发现错误,所以我们需要做的是,细致再细致。而且本地PC在数组越界处在循环语句的时候,会自动跳过最后的越界情况,导致不能及时发现可能出现的错误,这一点在写题的时候出现了部分错误,需要注意。
综上来看,上面的思路不可取。
本地AC代码
#include<vector>
#include<iostream>
using namespace std;
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int len1 = nums1.size();
int len2 = nums2.size();
vector<int> num;
int i = 0,j = 0;
while(1){
if(nums1[i]<nums2[j]){
num.push_back(nums1[i]);
i++;
}
if(i == len1){
while(j< len2){
num.push_back(nums2[j]);
j++;
}
}
if(i+j == len1+len2) break;
if(nums1[i]>nums2[j]){
num.push_back(nums2[j]);
j++;
}
if(j == len2){
while(i< len1){
num.push_back(nums1[i]);
i++;
}
}
if(i+j == len1+len2) break;
}
int f_len = num.size();
int len_f = f_len/2;
float res = 0;
if(f_len%2){
res = (double)num[len_f];
}
else{
res = (double)(num[f_len/2]+num[len_f-1])/2;
}
return res;
}
};
int main(){
double res;
vector<int> nums1,nums2;
Solution solution;
for(int i = 0; i < 10; i++){
nums1.push_back(i);
}
for(int i = 10; i< 15; i++){
nums2.push_back(i);
}
res = solution.findMedianSortedArrays(nums1,nums2);
printf("%lf",res);
return 0;
}
正确思路和题解
采用二分搜索的方法实现的搜索,有点难。。。。
二分思想