1.问题描述
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
示例 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
2.实现代码
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int len1=nums1.size();
int len2=nums2.size();
int len = len1 + len2;
int i=0,j=0,m=0;
double result;
vector<int> nums(len);
if(len == 0) {
return 0;
}
else{
if(nums1.empty()){
nums =nums2;
}
else{
if(nums2.empty()){
nums = nums1;
}
else{
while( m< len){
if(nums1[i] >= nums2[j]){
nums.push_back(nums1[i]);
i++;
}
else{
nums.push_back(nums2[j]);
j++;
}
m++;
break;
}
}
}
}
result = media(nums);
return result;
}
public:
//获取中位数
double media(vector<int>& nums){
//获取中位数并返回取值
int len = nums.size();
double result;
if(len%2==0){
result = nums[len/2]+nums[len/2+1];
return result/2.0;
}
else{
result = nums[len/2];
}
return result;
}
};
上面那段代码是错的,下面这段是正确的!!!!!!
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
// 合并数组
int index_1 = 0;
int index_2 = 0;
int add_length = 0;
int length_1 = nums1.size();
while(index_1 != (length_1 + add_length) && index_2 != nums2.size()){
if(nums1[index_1] >= nums2[index_2]){
nums1.insert(nums1.begin() + index_1,nums2[index_2]);
add_length++; // sum1数组添加了一个
index_1++; // sum1数组索引位置要变化一位
index_2++; // 调整sum2索引
}else{
index_1++;
}
}
if(index_1 == (length_1 + add_length)){
// nums1中已完,将nums2中的元素加在1后
for(int i = index_2;i < nums2.size();i++){
nums1.push_back(nums2[i]);
}
}else{
// nums2中已完
}
/*
for(int i = 0;i < nums1.size();i++){
cout<<nums1[i]<<"\t";
}
*/
// 从合并的数组中找中位数
if(nums1.size() % 2 == 0){
return (nums1[nums1.size()/2 - 1] + nums1[nums1.size()/2])/2.0;
}else{
return nums1[nums1.size() / 2];
}
}
};