leetcode_c++:Median_of _two_sorted_arrays(004)
来源:互联网 发布:mac中病毒了怎么办 编辑:程序博客网 时间:2024/05/21 20:30
题目
两个已经排序好的数组num1和num2,长度分别是m和n。找到两个有序数组的中位数(中间的那个数,若为偶数,则是中间的两个数的平均数)要求复杂度是O(lg(n+m))
- 算法1
Merge两个数组,然后取得中位数
复杂度:O(n+m)
#include <iostream>#include <algorithm>#include <vector>using namespace std;const int maxn=100;class Solution{public: double findMedianSortedArrays(int A[],int m,int B[],int n){ vector<int> C; int pa=0,pb=0; //pointer of A[] & B[] while (pa<m || pb<n) { if(pa==m){ C.push_back(B[pb++]); continue; } if(pb==n){ C.push_back(A[pa++]); continue; } if(A[pa]>B[pb]) C.push_back(B[pb++]); else C.push_back(A[pa++]); } if((n+m)&1) // 奇数,按位与 return C[(n+m)/2]; else return (C[(n+m)/2-1]+C[(n+m)/2])/2.0; }};int main(){ int n,m; int A[maxn],B[maxn]; Solution s; while(cin>>n){ for(int i=0;i<n;i++) cin>>A[i]; cin>>m; for(int i=0;i<m;i++) cin>>B[i]; cout<<s.findMedianSortedArrays(A,n, B, m)<<endl; } return 0;}
- 算法2
求两个数组中的第k大的数
若A[k/2-1]
#include <iostream>#include <algorithm>#include <vector>using namespace std;const int N = 0;class Solution { private: double findKthSortedArrays(int A[], int m, int B[], int n, int k) { if (m < n) { swap(n, m); swap(A, B); } if (n == 0) return A[k - 1]; if (k == 1) return min(A[0], B[0]); int pb = min(k / 2, n), pa = k - pb; if (A[pa - 1] > B[pb - 1]) return findKthSortedArrays(A, m, B + pb, n - pb, k - pb); else if (A[pa - 1] < B[pb - 1]) return findKthSortedArrays(A + pa, m - pa, B, n, k - pa); else return A[pa - 1]; } public: double findMedianSortedArrays(int A[], int m, int B[], int n) { if ((n + m)&1) return findKthSortedArrays(A, m, B, n, (n + m) / 2 + 1); else return (findKthSortedArrays(A, m, B, n, (n + m) / 2 + 1) + findKthSortedArrays(A, m, B, n, (n + m) / 2)) / 2.0; }};int main() { int n, m; int A[100], B[100]; Solution s; while (cin >> n) { for (int i = 0; i < n; i++) cin >> A[i]; cin >> m; for (int i = 0; i < m; i++) cin >> B[i]; cout << s.findMedianSortedArrays(A, n, B, m) << endl; } return 0;}
- vector版本
#include <iostream>#include <algorithm>#include <vector>using namespace std;const int N = 0;class Solution { public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int m = nums1.size(); int n = nums2.size(); int value1 = KthValue(nums1, m, nums1.begin(), nums2, n, nums2.begin(), (m+n+1)/2); double result = value1; if (((m+n) & 1) == 0) { int value2 = KthValue(nums1, m, nums1.begin(), nums2, n, nums2.begin(), (m+n)/2+1); result = ((double)value1 + (double)value2)/2; } return result; } private: int KthValue(vector<int> &nums1, int size1, vector<int>::iterator it1, vector<int> &nums2, int size2, vector<int>::iterator it2, int k) { /*if (size1 > size2) { return KthValue(nums2, size2, it2, nums1, size1, it1, k); } */ if(size1>size2) { swap(size1,size2); nums1.swap(nums2); } if (size1 == 0) { return *(it2+k-1); } if (k == 1) { return min(*it1, *it2); } int offset1 = min(k/2, size1); int offset2 = k - offset1; if (*(it1+offset1-1) <= *(it2+offset2-1)) { return KthValue(nums1, size1-offset1, it1+offset1, nums2, offset2, it2, k-offset1); } else { return KthValue(nums1, offset1, it1, nums2, size2-offset2, it2+offset2, k-offset2); } } }; int main() { int n, m,t; vector<int> A; vector<int> B; Solution s; while(cin>>n) { for(int i=0;i<n;i++) { cin>>t; A.push_back(t); } cin>>m; for(int i=0;i<m;i++) { cin>>t; B.push_back(t); } for(int i=0;i<n;i++) cout<<"A= "<<A[i]<<endl; for(int i=0;i<m;i++) cout<<"B= "<<B[i]<<endl; cout<<s.findMedianSortedArrays(A,B)<<endl; } return 0;}
0 0
- leetcode_c++:Median_of _two_sorted_arrays(004)
- leetcode_c++:Merge_Intervals(056)
- Leetcode_c++: Subsets (078)
- leetcode_c++:Combination Sum(039)
- leetcode_c++:Combination Sum_2(040)
- leetcode_c++:Rotate Image(048)
- leetcode_c++:Maximum Subarray(053)
- leetcode_c++:Spiral Matrix(054)
- leetcode_c++:Jump Game(055)
- leetcode_c++:Insert Intervals(057)
- leetcode_c++:Unique Paths(062)
- Leetcode_c++:Plus one(066)
- Leetcode_c++: Sort Colors (075)
- Leetcode_c++: Word Search (079)
- Leetcode_c++: Maximal Rectangle (085)
- Leetcode_c++: Subsets II (090)
- leetcode_c++:Majority Element(169)
- leetcode_c++:Missing Number(268)
- HEVC中的OPEN-GOP
- objective-C之NSTimer定时操作及CADisplayLink的异同
- cocos开发相关工具集合
- 按照谷歌浏览器执行 js 在html中meta属性设置
- Python 日期格式化
- leetcode_c++:Median_of _two_sorted_arrays(004)
- Android 完美自定义Dialog
- hdu3065 AC自动机
- PHP验证百家姓
- C++ cin被跳过
- 解决php5.6连接64位系统下mssql2008的错误问题
- 自定义View之绘图篇(一):基础图形的绘制
- contains 精确匹配
- 网页制作中PS图像处理的应用