题目
Leetcode 4. 寻找两个正序数组的中位数
代码(首刷自解,复杂度m+n)
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int p1 = nums1.size(), p2 = nums2.size();
int i = 0, j = 0;
vector<int> nums3(p1+p2+2);
int k3 = 0;
while(i < p1 && j < p2) {
nums3[k3++] = nums1[i] < nums2[j] ? nums1[i++] : nums2[j++];
}
while(i < p1) {
nums3[k3++] = nums1[i++];
}
while(j < p2) {
nums3[k3++] = nums2[j++];
}
return k3 % 2 ? nums3[k3/2] : (nums3[k3/2-1] + nums3[k3/2]) / 2.0;
}
};
代码(首刷看解析,复杂度log(m+n))
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int total = nums1.size() + nums2.size();
if(total % 2) {
return getKthElement(nums1, nums2, (total + 1) / 2);
} else {
return (getKthElement(nums1, nums2, total / 2) + getKthElement(nums1, nums2, total / 2 + 1)) / 2.0;
}
}
int getKthElement(vector<int>& nums1, vector<int>& nums2, int k) {
int m = nums1.size(), n = nums2.size();
int i = 0, j = 0;
while(1) {
if(i == m)
return nums2[j+k-1];
if(j == n)
return nums1[i+k-1];
if(k == 1)
return min(nums1[i], nums2[j]);
int newIndex1 = min(i + k / 2 - 1, m - 1);
int newIndex2 = min(j + k / 2 - 1, n - 1);
int pivot1 = nums1[newIndex1];
int pivot2 = nums2[newIndex2];
if(pivot1 <= pivot2) {
k -= newIndex1 - i + 1;
i = newIndex1 + 1;
} else {
k -= newIndex2 - j + 1;
j = newIndex2 + 1;
}
}
}
};
代码(9.4 二刷看解析)
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int m = nums1.size(), n = nums2.size();
int k = m+n;
if(k%2) {
return getKthElement(nums1, nums2, (k+1)/2);
}
return (getKthElement(nums1, nums2, k/2) + getKthElement(nums1, nums2, k/2+1)) / 2.0;
}
int getKthElement(vector<int>& nums1, vector<int>& nums2, int k) {
int m = nums1.size(), n = nums2.size();
int i = 0, j = 0;
while(1) {
if(i == m)
return nums2[j+k-1];
if(j == n)
return nums1[i+k-1];
if(k == 1)
return min(nums1[i], nums2[j]);
int next1Key = min(m-1, i+k/2-1);
int next2Key = min(n-1, j+k/2-1);
int pivot1 = nums1[next1Key];
int pivot2 = nums2[next2Key];
if(pivot1 <= pivot2) {
k -= next1Key - i + 1;
i = next1Key + 1;
} else {
k -= next2Key - j + 1;
j = next2Key + 1;
}
}
}
};