给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
示例 1:
nums1 = [1, 3] nums2 = [2]
则中位数是 2.0 示例 2:
nums1 = [1, 2] nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5
我写的是一个讨巧的方法,时间复杂度其实是m+n,但还是过了,就很开心 C++ 思路就是找一个vector然后将两个有序列表的值进行有序的添加到新列表中
class Solution { public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { //改良版的插入排序 if(nums1.size()==0){ if(nums2.size() % 2){ return nums2[int(nums2.size()/2)]; }else{ return (double(nums2[int(nums2.size()/2)])+double(nums2[int(nums2.size()/2)-1]))/2; } } if(nums2.size()==0){ if(nums1.size() % 2){ return nums1[int(nums1.size()/2)]; }else{ return (double(nums1[int(nums1.size()/2)])+double(nums1[int(nums1.size()/2)-1]))/2; } } vector<int> nums; int len1 = nums1.size(); int len2 = nums2.size(); int i=0,j=0; while(i<len1||j<len2){ if(i<len1&&j<len2){ if(nums1[i]<nums2[j]){ nums.push_back(nums1[i]); i++; }else{ nums.push_back(nums2[j]); j++; } } else if(i<len1){ nums.push_back(nums1[i]); i++; }else if(j<len2){ nums.push_back(nums2[j]); j++; } } int len3 = nums.size(); // cout<<len3<<endl; // cout<<nums[int(len3/2)-1]<<endl; // cout<<nums[int(len3/2)]<<endl; int k = len3 % 2; // cout<<k<<endl; // cout<<3/2<<endl; if(k){ return nums[int(len3/2)]; }else{ return (double(nums[int(len3/2)])+double(nums[int(len3/2)-1]))/2; } } };