题目链接:leetcode.
这个题也做过的,印象中是用递归,每次减去小的那个数组的前m个,详见题解
/*
执行用时:40 ms, 在所有 C++ 提交中击败了68.50%的用户
内存消耗:86.9 MB, 在所有 C++ 提交中击败了65.08%的用户
*/
class Solution {
//不递归,用循环就可以的
int getMSA(vector<int>& nums1, vector<int>& nums2, int k)
{
int M = nums1.size(), N = nums2.size();
int index1 = 0, index2 = 0;
while(true)
{
//先判断特殊情况
if(index1 == M)
{
return nums2[index2 + k - 1];
}
if(index2 == N)
{
return nums1[index1 + k - 1];
}
//要记得先判断越界,再判断特殊情况
if(k == 1)
{
return nums1[index1] < nums2[index2] ? nums1[index1] : nums2[index2];
}
//再判断正常情况
int t = k / 2 - 1;//减1是因为要确保index指向的数不会是中位数
int i = min(index1 + t, M - 1);//防止超出范围
int j = min(index2 + t, N - 1);
if(nums1[i] < nums2[j])
{
//抛掉nums1的前面部分
k -= (i - index1 + 1);
index1 = i + 1;
}
else
{
//抛掉nums2的前面部分
k -= (j - index2 + 1);
index2 = j + 1;
}
}
}
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int M = nums1.size(), N = nums2.size();
int k = (M + N) / 2;
if((M + N) % 2 == 0)
{
return (getMSA(nums1, nums2, k) + getMSA(nums1, nums2, k+1)) / 2.0;
}
else
{
return getMSA(nums1, nums2, k + 1);
}
}
};
本文分享了一种使用双指针技巧在LeetCode中求解两个有序数组合并后的中位数的C++解决方案,通过递归与循环实现,适用于查找第k小的元素。
2296

被折叠的 条评论
为什么被折叠?



