题目描述:
示例:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
输入:nums1 = [2], nums2 = []
输出:2.00000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
解题思路:
根据两个数组长度的总和找到中位数的essentIndex,长度为奇数找到essentIndex对应的那个值就好,长度为偶数为essentIndex与essentIndex+1对应值和/2.初始化指向数组1与2的位置的标志p_now_n1、p_now_n2,初始化指向数组1与2的位置的之前标志p_before_n1 = -1,p_before_n2 = -1。在0 —— essentIndex的for循环里,判断p_now_n1、p_now_n2的位置,它们其中之一指向目标数组最后一个位置时,就移动另一数组的的指向,若不为上述情况,就判断p_now_n1+1与p_now_n2+1指向元素的大小,移动小的那个。
最后,再根据两个数组长度的奇偶性输出对应值。
代码:
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
int p_now_n1 = -1,p_now_n2 = -1,i = 0,p_before_n1 = -1,p_before_n2 = -1;
int sum = nums1Size + nums2Size;
int essentIndex = sum / 2 + sum % 2;
int doubleflag = sum % 2;
double essentvalue = 0.0;
//printf("essentIndex = %d\n",essentIndex);
for(i = 0;i<essentIndex;++i)
{
p_before_n1 = p_now_n1;
p_before_n2 = p_now_n2;
if(p_now_n1 == nums1Size - 1)
{
p_now_n2++;
}
else if(p_now_n2 == nums2Size - 1)
{
p_now_n1++;
}
else
{
(nums1[p_now_n1 + 1]>nums2[p_now_n2 + 1])?nums2[++p_now_n2]:nums1[++p_now_n1];
}
}
essentvalue = (p_now_n2 - p_before_n2 == 0)?(double)nums1[p_now_n1]:(double)nums2[p_now_n2];
if (doubleflag == 1)
{
return essentvalue;
}
else
{
p_before_n1 = p_now_n1;
p_before_n2 = p_now_n2;
if(p_now_n1 == nums1Size - 1)
{
p_now_n2++;
}
else if(p_now_n2 == nums2Size - 1)
{
p_now_n1++;
}
else
{
(nums1[p_now_n1 + 1]>nums2[p_now_n2 + 1])?nums2[++p_now_n2]:nums1[++p_now_n1];
}
return (essentvalue + (p_now_n2 - p_before_n2 == 0?(double)nums1[p_now_n1]:(double)nums2[p_now_n2]))/2;
}
}
结果: