力扣 leetcode 4. 寻找两个正序数组的中位数
问题描述
给定两个大小分别为 m
和 n
的正序(从小到大)数组 nums1
和 nums2
。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n))
。
提示:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-10^6 <= nums1[i], nums2[i] <= 10^6
示例
示例 1:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
解题思路
本题比较简单,因为给出的两个数组都是有序的,因此,只需记录nums1
和nums2
中各个元素分别在合并后数组的位置,即可找出中位数。
其中一种方法是将nums1
和nums2
放入一个新的数组,使新的数组满足正序,就可以很快找出其中的中位数。
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int i = 0;
int j = 0;
vector<int> num((nums1.size() + nums2.size()) / 2 + 1);
for(int k = 0; k < num.size(); k++){
if(i < nums1.size()){
if(j < nums2.size()){
num[k] = nums1[i] < nums2[j] ? nums1[i++] : nums2[j++];
}
else{
num[k] = nums1[i++];
}
}
else{
num[k] = nums2[j++];
}
}
for(int i = 0; i < num.size(); i++){
cout << num[i] << ' ';
}
if((nums1.size() + nums2.size()) % 2){
return static_cast<double> (num[num.size() - 1]);
}
return (num[num.size() - 1] + num[num.size() - 2]) / 2.0;
}
};
另一种方法是不保存新的数组,但是记录现在总共遍历了k
个元素,如果k == (nums1.size() + nums2.size()) / 2
,则可以k
就是中位数的点。注意,这里考虑的是总长度为奇数时的情况,偶数也是一样的。
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int i = 0;
int j = 0;
int k = -1;
int half;
double result;
if((nums1.size() + nums2.size()) % 2){ // 奇数情况
half = (nums1.size() + nums2.size()) / 2;
while(1){
if(i < nums1.size()){
if(j < nums2.size()){
if(nums1[i] < nums2[j]){
if(++k == half){
return static_cast<double>(nums1[i]);
}
i++;
}
else{
if(++k == half){
return static_cast<double>(nums2[j]);
}
j++;
}
}
else{
if(++k == half){
return static_cast<double>(nums1[i]);
}
i++;
}
}
else{
if(++k == half){
return static_cast<double>(nums2[j]);
}
j++;
}
}
}
else{ // 偶数情况
half = (nums1.size() + nums2.size()) / 2;
while(1){
if(i < nums1.size()){
if(j < nums2.size()){
if(nums1[i] < nums2[j]){
if(++k == half){
return (nums1[i] + result) / 2.0;
}
else if(k == half - 1){
result = nums1[i];
}
i++;
}
else{
if(++k == half){
return (nums2[j] + result) / 2.0;
}
else if(k == half - 1){
result = nums2[j];
}
j++;
}
}
else{
if(++k == half){
return (nums1[i] + result) / 2.0;
}
else if(k == half - 1){
result = nums1[i];
}
i++;
}
}
else{
if(++k == half){
return (nums2[j] + result) / 2.0;
}
else if(k == half - 1){
result = nums2[j];
}
j++;
}
}
}
return result;
}
};
本文来自博客园,作者:greatestchen},转载请注明原文链接:https://www.cnblogs.com/greatestchen/p/16929705.html