寻找两个正序数组的中位数
/*
* @lc app=leetcode.cn id=4 lang=cpp
* @lcpr version=21917
*
* [4] 寻找两个正序数组的中位数
*/
// @lc code=start
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
if (nums1.size() == 0)
{
return (nums2[(nums2.size()-1)/2]/1.0f + nums2[nums2.size()/2]/1.0f)/2;
}
if (nums2.size() == 0)
{
return (nums1[(nums1.size()-1)/2]/1.0f + nums1[nums1.size()/2]/1.0f)/2;
}
bool bSingle = (nums1.size() + nums2.size())%2;
int mid = (nums1.size() + nums2.size())/2;
if (!bSingle)
mid -= 1;
int i=0,j=0;
int mid1, mid2;
while(i < nums1.size() && j < nums2.size())
{
if (nums1[i] > nums2[j])
{
if (bSingle)
{
if (i+j == mid)
return nums2[j];
}
else
{
if (i+j == mid)
mid1 = nums2[j];
else if (i+j == mid+1)
return (mid1+nums2[j])/2.0f;
}
j++;
}
else
{
if (bSingle)
{
if (i+j == mid)
return nums1[i];
}
else
{
if (i+j == mid)
mid1 = nums1[i];
else if (i+j == mid+1)
return (mid1+nums1[i])/2.0f;
}
i++;
}
}
if (i >= nums1.size())
{
for(; j < nums2.size(); j++)
{
if (bSingle)
{
if (i+j == mid)
return nums2[j];
}
else
{
if (i+j == mid)
mid1 = nums2[j];
else if (i+j == mid+1)
return (mid1+nums2[j])/2.0f;
}
}
}
if (j >= nums2.size())
{
for(; i < nums1.size(); i++)
{
if (bSingle)
{
if (i+j == mid)
return nums1[i];
}
else
{
if (i+j == mid)
mid1 = nums1[i];
else if (i+j == mid+1)
return (mid1+nums1[i])/2.0f;
}
}
}
return 0;
}
};
// @lc code=end
/*
// @lcpr case=start
// [1,3]\n[2]\n
// @lcpr case=end
// @lcpr case=start
// [1,2]\n[3,4]\n
// @lcpr case=end
*/
1 class Solution { 2 public: 3 double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { 4 int len1 = nums1.size(); 5 int len2 = nums2.size(); 6 int total = len1 + len2; 7 if (total%2) 8 { 9 int index = total/2; 10 return findMid(nums1, nums2, index+1); 11 } 12 else 13 { 14 int index1 = total/2-1; 15 int index2 = index1+1; 16 return (findMid(nums1, nums2, index1+1) + findMid(nums1, nums2, index2+1))/2; 17 } 18 } 19 20 double findMid(vector<int>& nums1, vector<int>& nums2, int index) 21 { 22 int t = index; 23 int l = 0; 24 int r = 0; 25 int len1 = nums1.size(); 26 int len2 = nums2.size(); 27 while(true) 28 { 29 if (l == len1) 30 { 31 return nums2[r+t-1]; 32 } 33 if (r == len2) 34 { 35 return nums1[l+t-1]; 36 } 37 if (t == 1) 38 { 39 if (nums1[l] < nums2[r]) 40 return nums1[l]; 41 else 42 return nums2[r]; 43 } 44 int mid = t/2; 45 int index1 = min(l+mid-1, nums1.size()-1); 46 int index2 = min(r+mid-1, nums2.size()-1); 47 if (nums1[index1] <= nums2[index2]) 48 { 49 t -= (index1-l+1); 50 l = index1+1; 51 } 52 else 53 { 54 t -= (index2-r+1); 55 r = index2+1; 56 } 57 } 58 } 59 60 int min(int a, int b) 61 { 62 if (a < b) 63 return a; 64 else 65 return b; 66 } 67 };