题目大意:
给两个有序数组,求出合并以后的中位数。
要求时间复杂度:O(m+n)
思路:
思路1:分别标记两个数组的移动位置,移动两个数组当前小的那个数字所在位置,直到移动到中位数所在位置。时间复杂度 O(n)。
思路2:二分。问题转化为求所有数字的第k小数,每次比较a[k/2-1]和b[k/2-1],如果两个数字相等,则找到第k小数。否则可以排除掉k/2个数字。时间复杂度 O(log(m+n))。这种思路的非递归版没看明白,递归版…比思路1时间花费还多。可能因为我的vector传参时每次都重新开辟。但是不知道怎么优化…
代码1:
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int len1 = nums1.size();
int len2 = nums2.size();
int totlen = len1 + len2;
int m1 = 0, m2 = 0;
if (totlen % 2) {
m1 = totlen / 2;
m2 = m1;
}
else {
m1 = totlen / 2;
m2 = m1 - 1;
}
int cnt = -1;
int ans = 0;
int i, j;
for (i=0, j=0; i<len1 && j<len2; ) {
int temp;
if (nums1[i] < nums2[j]) {
temp = nums1[i];
i++;
cnt++;
}else {
temp = nums2[j];
j++;
cnt++;
}
if (cnt == m1) {
ans += temp;
}
if (cnt == m2) {
ans += temp;
}
}
if (cnt < m2 || cnt < m1) {
while (i < len1) {
cnt++;
if (cnt == m2) {
ans += nums1[i];
}
if (cnt == m1) {
ans += nums1[i];
}
i++;
}
while (j < len2) {
cnt++;
if (cnt == m2) {
ans += nums2[j];
}
if (cnt == m1) {
ans += nums2[j];
}
j++;
}
}
return ans * 1.0 / 2;
}
};
代码2:
class Solution {
public:
int dfs(vector<int> nums1, int len1, vector<int> nums2, int len2, int k) {
if (len1 > len2) return dfs(nums2, len2, nums1, len1, k);
if (len1 == 0) return nums2[k-1];
if (len2 == 0) return nums1[k-1];
if (k == 1) return min(nums1[0], nums2[0]);
int ind1 = min(len1, k/2);
int ind2 = k - ind1;
if (nums1[ind1-1] < nums2[ind2-1]) return dfs(vector<int>(nums1.begin()+ind1, nums1.end()), len1-ind1, nums2, len2, k-ind1);
else if (nums1[ind1-1] > nums2[ind2-1]) return dfs(nums1, len1, vector<int>(nums2.begin()+ind2, nums2.end()), len2-ind2, k-ind2);
else return nums1[ind1-1];
}
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int len1 = nums1.size();
int len2 = nums2.size();
int totlen = len1 + len2;
if (totlen % 2) return dfs(nums1, len1, nums2, len2, totlen/2 + 1);
else return (dfs(nums1, len1, nums2, len2, totlen/2) + dfs(nums1, len1, nums2, len2, totlen/2+1)) * 1.0 / 2;
}
};
一上午又只做了一道题。然后吃饭睡午觉就到了下午两点了…哎。
今天毕业生离校,好羡慕他们鸭。
虽然可能以后的我会怀念现在的日子。会吗?