【看懂LeetCode】4. 寻找两个正序数组的中位数
一、绪
依旧是简单的思路,依旧是c语言写题解代码
本篇文章,主要是以c语言编程解决LeetCode题库第四题,如何寻找两个正序数组的中位数?
二、无重复字符的最长子串
链接: 寻找两个正序数组的中位数.
(一)题目描述
解释:
示例一:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例二:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
解题思路:
//将nums1Size + nums2Size得到总长numSize
//定义数组num[numSize],通过循环赋值和判断大小按正序(从小到大)将两个数组拼接成一个数组
//先判断两个数组谁的值先赋完。存在四种情况 1.都未赋值完 2.nums2已赋值完 3.nums1已赋完 4.都已赋值完,循环结束
//在都未赋完的情况下,需要对两个数组的值进行判断,谁小谁先赋值
//开始判断,获取中值
//如果numSize%2 == 0为真,则输出两个数组拼起来的第numSize/2个和第(numSize/2)+1个位置的数之和的1/2
//如果numSize%2 == 0为假,则输出两个数组拼起来的第(numSize/2)+1个位置的数
//注意:上述的第几个位置 转化为数组下标 都要再减一
(二)AC代码
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
int numSize = nums1Size + nums2Size; //将nums1Size + nums2Size得到总长numSize
int *s1 = nums1,*s2 = nums2; //用于遍历数组
int s1Index = 0,s2Index = 0; //用于判断指针遍历到的当前数组下标
double midNum; //用于记录结果值,即总数组的中间值
//定义数组num[numSize],通过循环赋值和判断大小按正序(从小到大)将两个数组拼接成一个数组
//先判断两个数组谁的值先赋完。存在四种情况 1.都未赋值完 2.nums2已赋值完 3.nums1已赋完 4.都已赋值完,循环结束
//在都未赋完的情况下,需要对两个数组的值进行判断,谁小谁先赋值
int num[numSize];
for(int i = 0;i<numSize;i++){
if(s1Index < nums1Size&&s2Index < nums2Size){
if(*(s1 + s1Index)<*(s2 + s2Index)){
num[i] = *(s1 + s1Index);
s1Index++; //当前位已赋值到新数组,下标值++,到下一位
}else{
num[i] = *(s2 + s2Index);
s2Index++;
}
}else if(s1Index < nums1Size){
num[i] = *(s1 + s1Index);
s1Index++;
}else if(s2Index < nums2Size){
num[i] = *(s2 + s2Index);
s2Index++;
}
}
//开始判断,取中值
//如果numSize%2 == 0为真,则输出两个数组拼起来的第numSize/2个和第(numSize/2)+1个位置的数之和的1/2
//如果numSize%2 == 0为假,则输出两个数组拼起来的第(numSize/2)+1个位置的数
if(numSize%2 == 0){
midNum = (num[(numSize/2)-1]+num[((numSize/2)+1)-1])/2.0;
}else{
midNum = num[((numSize/2)+1)-1];
}
return midNum;
}
三、后记
(一)一些遇到的问题
- 指针遍历数组时,只有数组内有空位置,才可以用 if(p!=’\0’) 来判断指针是否到了数组最后一位。若是数组内无空位置,需要先用 sizeof() 获取数组长度,遍历的时候记录下标值,这时可以用 if(下标值<数组长度) 来判断指针是否到了数组最后一位。