【Leetcode 4】Median of Two Sorted Arrays
来源:互联网 发布:吉林大学网络教育电话 编辑:程序博客网 时间:2024/06/05 18:21
题意:给定两个有序的数组,求出中位数。
提供两种思路:
第一种思路理解起来比较简单效率为O(logn+logm):
不过两种思路提交上去时间差不多,最好都为32ms
思路一 O(logn+logm):按照求解第k大算法的思想。具体如下:
假设有两个数组 A,B 现要求两数组中所有数字的第k大,那么我们可以比较 A[k/2]和B[k/2] 假设 A[k/2]<B[k/2]那么A数组中 从[1,k/2-1]的所有数字都不可能是第k大,可以直接去掉。以此递归求解即可。效率为O(logn+logm)
注意:
1 注意数组边界
2总数为偶数时要注意判断
class Solution {public:double getkth(vector<int> A, vector<int> B,int la,int ra,int lb,int rb,int k,int flag){if(ra<la){if(flag==0)return B[lb+k-1];elsereturn (B[lb+k-1]+B[lb+k])*0.5;//总个数为偶数}if(rb<lb){if(flag==0)return A[la+k-1];elsereturn (A[la+k-1]+A[la+k])*0.5;//总个数为偶数}if(k==1){if(flag==0)return min(A[la],B[lb]);else{//总个数为偶数if(A[la]<B[lb]){if(la+1>ra)return (A[la]+B[lb])*0.5;elsereturn (A[la]+min(A[la+1],B[lb]))*0.5;}else{if(lb+1>rb)return (A[la]+B[lb])*0.5;else{return (B[lb]+min(A[la],B[lb+1]))*0.5;}}}}int mid1=min(ra,k/2+la-1);//注意边界不能超出int mid2=min(rb,k/2+lb-1);if(A[mid1]<=B[mid2]){return getkth(A,B,mid1+1,ra,lb,rb,k-(mid1-la+1),flag);//小的那一半无用}else{return getkth(A,B,la,ra,mid2+1,rb,k-(mid2-lb+1),flag);}} double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {int n=nums1.size();int m=nums2.size();if((n+m)&1){return getkth(nums1,nums2,0,n-1,0,m-1,(n+m+1)/2,0);}else{return getkth(nums1,nums2,0,n-1,0,m-1,(n+m)/2,1);} }};
提交结果:
思路二 O(log(min(n,m))):对较短的数组进行二分,假设第一个数组A下标为x 求解第k大的话,那么比较B[k-x]与 A[x] 找出 A[x]<B[k-x] &&A[x+1]>B[k-x-1]的分界线,然后再判断即可。(边界比较烦)效率为O(log(min(n,m)))
class Solution {public:double gao(vector<int>& A, vector<int>& B,int n,int m){int l=0,r=n-1;int k=(n+m+1)>>1;int flag=((n+m)&1);if(n==0){if(flag)return B[k-1];elsereturn (B[k]+B[k-1])*0.5;}while(r-l>1){int mid=(l+r)>>1;int x=k-mid-2;if(B[x]>A[mid])l=mid;elser=mid;}if(B[k-r-2]>A[r])l=r;int x=k-l-2;if(B[x]<A[l]){if(flag)return min(B[x+1],A[l]);else{if(B[x+1]<A[l]){if(x+2<m)return (B[x+1]+min(A[l],B[x+2]))*0.5;elsereturn (B[x+1]+A[l])*0.5;}else{if(l+1<n)return (A[l]+min(A[l+1],B[x+1]))*0.5;elsereturn (A[l]+B[x+1])*0.5;}}}else{if(l+1>=n){if(flag)return B[x];else{return (B[x]+B[x+1])*0.5;}}if(flag){return min(B[x],A[l+1]);}else{if(B[x]<A[l+1]){if(x+1<m)return (B[x]+min(B[x+1],A[l+1]))*0.5;elsereturn (B[x]+A[l+1])*0.5;}else{if(l+2<n)return (A[l+1]+min(B[x],A[l+2]))*0.5;elsereturn (A[l+1]+B[x])*0.5;}}}} double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {int n=nums1.size();int m=nums2.size();if(n>m)return gao(nums2,nums1,m,n);elsereturn gao(nums1,nums2,n,m); }};
0 0
- Leetcode 4 Median of Two Sorted Arrays
- LeetCode 4 - Median of Two Sorted Arrays
- Leetcode 4 Median of Two Sorted Arrays
- Leetcode 4 Median of Two Sorted Arrays
- [leetcode 4] Median of Two Sorted Arrays
- LeetCode 4:《Median of Two Sorted Arrays》
- [Leetcode] 4 - Median of Two Sorted Arrays
- leetcode|4|Median of Two Sorted Arrays
- [Leetcode]4Median of Two Sorted Arrays
- leetcode 4 Median of Two Sorted Arrays
- LeetCode #4 Median of Two Sorted Arrays
- LeetCode-4-Median of Two Sorted Arrays
- LeetCode 4 Median of Two Sorted Arrays
- leetcode 4 Median of Two Sorted Arrays
- LeetCode 4 Median of Two Sorted Arrays
- Leetcode[4] Median of Two Sorted Arrays
- LeetCode 4 - Median of Two Sorted Arrays
- leetcode 4 -- Median of Two Sorted Arrays
- Android学习之自定义View详解
- 基于 Django1.10 文档的深入学习(26)—— Creating forms from models 之 基础
- 常用统计指标
- 判断互质的五种方法
- OpenCV 利用getTickCount()与getTickFrequency()计算执行时间
- 【Leetcode 4】Median of Two Sorted Arrays
- Python爬虫学习之常用技巧详解
- 判断用户终端类型(php程序)
- Linux学习之sed的使用
- JSP中文件的上传与下载示例
- LeetCode——17. Letter Combinations of a Phone Number
- Java IO流之打印流与标准流
- lasync命令模块实用工具cmdutils
- iOS中如何清除缓存?