寻找两个正序数的中位数(C)

最近面试,发现要手撕算法加上机试,被完败,索性给自己立一个目标,一周训练2次。

第一题。

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

算法的时间复杂度应该为 O(log (m+n)) 。

示例 1:

复制代码
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2

示例 2:

复制代码
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5

提示:

  • nums1.length == m
  • nums2.length == n
  • 0 <= m <= 1000
  • 0 <= n <= 1000
  • 1 <= m + n <= 2000
  • -10^6 <= nums1[i], nums2[i] <= 10^6

这题力扣第四题,我看着简单,内容还可以一下子接受.想了快三个小时。

cpp 复制代码
double get_mid(int* nums,int numsSize)
{
    if(numsSize%2)
     {
        return nums[numsSize/2];
     }
     else
     {
        return (nums[numsSize/2]+nums[(numsSize)/2-1])*1.0/2;
     }
}

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {

   if((nums1Size==0)&&(nums2Size==0)) return 0;
   else if((nums1Size==0)&&(nums2Size!=0))
   {
      return get_mid(nums2,nums2Size);
   }
   else if((nums2Size==0)&&(nums1Size!=0))
   {
      return get_mid(nums1,nums1Size);
   }
    else
    {
        if(nums1[nums1Size-1] <=nums2[0])
        {
            int len = nums1Size+nums2Size ;int mid_index = len /2;
            if(len % 2 ) // 长度是奇数
            {
               if(mid_index >= nums1Size)
               {
                    return nums2[nums2Size-mid_index-1];
               }
               else
               {
                     return nums1[mid_index]*1.0;
               }
            }
            else  //长度是偶数
            {
               if(mid_index < nums1Size)
               {
                    return (nums1[mid_index]+nums1[mid_index-1])*1.0/2;
               }
               else if((mid_index) == nums1Size)
               {
                    return (nums1[nums1Size-1]+nums2[0])*1.0/2;
               }
               else
               {
                    return (nums2[nums2Size-mid_index-1]+nums2[nums2Size-mid_index])*1.0/2;
               }

            }
        }
        else if(nums2[nums2Size-1] <=nums1[0])
        {
            int len = nums1Size+nums2Size ;int mid_index = len /2;
            if(len % 2 ) //长度是奇数
            {
               if(mid_index >= nums2Size)
               {
                    return nums1[nums1Size-mid_index-1];
               }
               else
               {
                     return nums2[mid_index];
               }
            }
            else //长度是偶数
            {
                
               if(mid_index < nums2Size)
               {
                    return (nums2[mid_index]+nums2[mid_index-1])*1.0/2;
               }
               else if((mid_index) == nums2Size)
               {
                    return (nums1[0]+nums2[nums2Size-1])*1.0/2;
               }
               else
               {
                    return (nums1[nums1Size-mid_index-1]+nums1[nums1Size-mid_index])*1.0/2;
               }
            }
        }
        else
        {
            int len = nums1Size+nums2Size ;int mid_index = len /2;int count =0;
            int _n1 = 0,_n2=0;int last=0,midv=0;
                while(true)
                {
                    if(_n1 == nums1Size) 
                    {
                        midv=nums2[_n2];
                        count++;
                        if(count == mid_index+1)
                        {
                             if(len%2)
                            {
                                return midv*1.0;
                            }
                            else
                            {
                                return (last+midv)*1.0/2;
                            } 
                        }
                        _n2++;
                         last = midv;
                    }
                    else if(_n2 == nums2Size) 
                    {
                        midv=nums1[_n1];
                        count++;
                         if(count == mid_index+1)
                        {
                             if(len%2)
                            {
                                return midv*1.0;
                            }
                            else
                            {
                                return (last+midv)*1.0/2;
                            } 
                        }
                        _n1++;
                         last = midv;
                    }
                    else
                    {
                         if(nums1[_n1] >= nums2[_n2])
                    {
                        midv = nums2[_n2];
                       count++;
                      if(count == mid_index+1)
                      {
                        if(len%2)
                        {
                            return midv*1.0;
                        }
                        else
                        {
                            return (last+midv)*1.0/2;
                        }
                      }
                      _n2++;
                      last = midv;
                    }
                    else
                    {
                        midv = nums1[_n1];
                        count++;
                        if(count == mid_index+1)
                        {
                             if(len%2)
                             {
                                return midv;
                             }
                             else
                             {
                                 return (last+midv)*1.0/2;
                             }
                           
                        }
                        _n1++;
                        last = midv;
                    }
                    }
                }
           
        }

    }


}

写的很烂很长,就是没有做过算法题目的人的思维,用了很多特殊情况来提高运算速度,其实把最后一个else提取出来也可以进行运算。但不知道为什么内存消耗很高。

相关推荐
怕浪猫8 小时前
GEO 优化到底是什么?AI时代内容创作者必须懂的新技能
算法·面试·github
朝朝辞暮i9 小时前
C++ 第 23 课:class —— 开始真正进入面向对象
开发语言·c++·算法
Evand J9 小时前
【MATLAB例程】三维RRT+APF避障路径规划与到达角(AOA)定位算法|三维路径优化与定位仿真例程
算法·matlab·路径规划·代码·定位·rrt·aoa
weixin_3077791311 小时前
有限产能智能排产与动态重排智能体:从需求解构到技术实现
开发语言·人工智能·算法·架构
朝朝辞暮i11 小时前
C++ 第 27 课:智能指针 shared_ptr
开发语言·c++·算法
朝朝辞暮i11 小时前
C++ 第 29 课:回调函数 Callback
开发语言·c++·算法
Godspeed Zhao12 小时前
现代智能雷达技术14——算法(0)
线性代数·算法·雷达
可乐ea12 小时前
Agent 模型分级升级路由:用置信度阈值把贵模型省下来
人工智能·算法·机器学习·结构化输出·置信度路由·模型升级路由·大模型成本优化
Navigator_Z12 小时前
LeetCode //C - 1278. Palindrome Partitioning III
c语言·算法·leetcode
Godspeed Zhao12 小时前
现代智能雷达技术18——算法(4)
算法