título Descripción
Dados dos matrices ordenadas de tamaño y nums1 m y n nums2.
Por favor encontrar tanto la mediana y la matriz ordenada, y requiere tiempo la complejidad del algoritmo es O (log (m + n)).
No se puede asumir nums1 y nums2 ambos vacíos.
pensamiento
- puntero doble, un puntero nums1, nums2 un punto, o si una pequeña nums2 nums1 el puntero al final, el nums1 presionados o presionados en nums2. El tiempo de complejidad de O (m + n)
- Para lograr log (m + n), es dicotomía es necesario, tales como análisis de la
código
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int len1 = nums1.size();
int len2 = nums2.size();
int len = len1 + len2;
vector<int> res;
if (len % 2 == 0) /*判断长度为偶数还是奇数*/
{
int i_nums1 = 0, i_nums2 = 0; /*双指针*/
while (i_nums1 + i_nums2 <= len / 2) /*判断是否到达中位数*/
{
if (i_nums2 == len2 || (i_nums1 < len1 && nums1[i_nums1] <= nums2[i_nums2]) )/*需要先判断i_nums2 是否到末尾,否则会报错,同时要取<=*/
{
res.push_back(nums1[i_nums1]);
i_nums1++;
}
else if (i_nums1 == len1 || (i_nums2 < len2 && nums2[i_nums2] < nums1[i_nums1]) )
{
res.push_back(nums2[i_nums2]);
i_nums2++;
}
}
return (res[res.size() - 1] + res[res.size() - 2]) / 2.0;
}
else
{
int i_nums1 = 0, i_nums2 = 0;
while (i_nums1 + i_nums2 <= (len - 1) / 2)
{
if (i_nums2 == len2 || (i_nums1 < len1 && nums1[i_nums1] <= nums2[i_nums2]))
{
res.push_back(nums1[i_nums1]);
i_nums1++;
}
else if (i_nums1 == len1 || (i_nums2 < len2 && nums2[i_nums2] < nums1[i_nums1]))
{
res.push_back(nums2[i_nums2]);
i_nums2++;
}
}
return res[res.size() - 1] * 1.0;
}
return 0.0;
}
};