思路1:
- 合并正序数组
- 根据合并后的数组判断返回中位数的位置
代码1:
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
vector<int> ans;
int i = 0, j = 0;
while (i<nums1.size()&&j<nums2.size()) {
if (nums1[i] < nums2[j])
ans.push_back(nums1[i++]);
else
ans.push_back(nums2[j++]);
}
if (i < nums1.size())
while(i<nums1.size())
ans.push_back(nums1[i++]);
else
while(j<nums.size())
ans.push_back(nums2[j++]);
if (ans.size() % 2)
return double(ans[ans.size() / 2]);
else
return (double(ans[ans.size() / 2-1] + double(ans[ans.size() / 2])) / 2);
}
};
思路2:
- 不创建新的数组向量,直接在原数组上扫描
- 考虑中位数只有一个和有两个的情况——利用额外一个temp记录第一个中位数
- 两个循环(第一个循环用于交叉扫描,第二个循环用于剩余扫描)的终止条件相同
代码2:
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int i = 0, j = 0;
int flag = 0;
int temp = 0;
while (i < nums1.size() && j < nums2.size()) {
flag = 0;
if (nums1[i] < nums2[j]) {flag = 1;i++;}
else j++;
if (double(i + j) == (double(nums1.size() + nums2.size()) / 2))
temp = flag == 1 ? nums1[i - 1] : temp = nums2[j - 1];
else if (i + j == ((nums1.size() + nums2.size()) / 2 + 1)) {
if (flag == 1)
return temp == 0 ? double(nums1[i - 1]) : double(nums1[i - 1] + temp) / 2;
else
return temp == 0 ? double(nums2[j - 1]) : double(nums2[j - 1] + temp) / 2;
}
}
while (1) {
flag = 0;
if (i < nums1.size()) {i++;flag = 1;}
else j++;
if (double(i + j) == (double(nums1.size() + nums2.size()) / 2))
temp=flag == 1? nums1[i - 1]: temp = nums2[j - 1];
else if (i + j == ((nums1.size() + nums2.size()) / 2 + 1)) {
if (flag == 1)
return temp == 0 ? double(nums1[i - 1]) : double(nums1[i - 1] + temp) / 2;
else
return temp == 0 ? double(nums2[j - 1]) : double(nums2[j - 1] + temp) / 2;
}
}
}
};