题目:
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
合并两个数组,排序,然后寻找中位数,很简单很自然的思路;
算法:
class Solution { public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { nums1.insert(nums1.end(),nums2.begin(),nums2.end()); sort(nums1.begin(),nums1.end()); if(nums1.size()%2==0){ return (double)(nums1[nums1.size()/2-1]+nums1[nums1.size()/2])/2; } else return (double)(nums1[nums1.size()/2]); } };
运行结果:
执行用时:12 ms, 在所有 C++ 提交中击败了99.27%的用户 内存消耗:87.2 MB, 在所有 C++ 提交中击败了29.01%的用户 通过测试用例:2094 / 2094 方法二:双指针法 思路: 我并不需要合并数组,只需要找到(m+n)/2这个数,为奇数的话,便直接为偶数。值为偶数的话,还需要找到(m+n)/2+1,去平均值即为中位数。 算法:
class Solution { public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int n1=0;// nuns1指针 int n2=0; // nums2指针 int m=nums1.size(); int n=nums2.size(); double mid=0;// 存储最终值 for(int i=0;i<(m+n)/2;i++){ //寻找第(m+n)/2个数 if((n1)<m&&(n2<n)) //防止数组越界 mid=(nums1[n1]<=nums2[n2])?nums1[n1++]:nums2[n2++]; else if(n1==m) mid=nums2[n2++]; else mid=nums1[n1++]; } //判断总数,计算中位数; if((n+m)%2==0){ //若为偶数,还需计算找出下个数,并与mid计算中位数; /*if(nums1[n1]<=nums2[n2]) return (mid+nums1[n1])/2; else return (mid+nums2[n2])/2;*/ if(n1==m) return (mid+nums2[n2])/2; else if(n2==n) return (mid+nums1[n1])/2; else return (nums1[n1]<=nums2[n2])?(mid+nums1[n1])/2:(mid+nums2[n2])/2; } //为奇数个,中位值直接为第(m+m)/2+1个数; else { /* if(nums1[n1]<=nums2[n2]) return nums1[n1]; else return nums2[n2];*/ if(n1==m) return nums2[n2]; else if(n2==n) return nums1[n1]; else return (nums1[n1]<=nums2[n2])?nums1[n1]:nums2[n2]; } return 0; } };
程序做出了很多判断,主要是防止数组越界,对部分判断语句做了优化改为三目运算符 ? : 但是依旧有很多判断,好处是没有运用库,用基本的运算符实现了算法,切仅有一个循环。时间复杂度为(m+n)/2
执行用时:32 ms, 在所有 C++ 提交中击败了43.51%的用户 // 多次运行时间变化很大,不作参考 内存消耗:86.8 MB, 在所有 C++ 提交中击败了76.96%的用户 通过测试用例:2094 / 2094