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

news2024/9/30 17:33:11

最近面试,发现要手撕算法加上机试,被完败,索性给自己立一个目标,一周训练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

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

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提取出来也可以进行运算。但不知道为什么内存消耗很高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2180242.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

优化Mysql

目录 Mysql优化就四种&#xff1a;定位慢查询/sql执行计划/索引/Sql优化经验... 2 1Mysql如何定位慢查询&#xff1f;... 2 2Sql语句执行很慢&#xff0c;如何分析呢&#xff1f;... 3 2.1那这个SQL语句执行很慢,如何分析呢?. 3 3&#xff0e;了解过索引吗?(什么是索引)…

DC00018基于java swing+MySQL花卉信息管理系统

1、项目功能演示 DC00018基于java swingMySQL花卉信息管理系统java项目信息管理系统 2、项目功能描述 基于java swingMySQL花卉信息管理系统 系统包括用户信息管理以及花卉信息管理等功能。 3、项目运行截图 4、项目核心代码 4.1 日期格式化 package utils;import java.t…

C++ STL容器(四) —— vector底层剖析

这篇讲解vector&#xff0c;不说废话&#xff0c;直接开始&#xff01; 文章目录 原理UML类图代码实现构造函数插入元素删除元素清空容器析构函数赋值运算符 案例分析 原理 这里简单说一下 vector 的大致思想&#xff0c;动态数组&#xff0c;即它的长度会随着我们插入元素而产…

【YOLO目标检测二维码数据集】共3112张、已标注txt格式、有训练好的yolov5的模型

目录 说明图片示例 说明 数据集格式&#xff1a;YOLO格式 图片数量&#xff1a;3112 标注数量(txt文件个数)&#xff1a;3112 标注类别数&#xff1a;1 标注类别名称&#xff1a;qrcode 数据集下载&#xff1a;二维码数据集 图片示例 数据集图片&#xff1a; 数据集…

【开源免费】基于SpringBoot+Vue.JS微服务在线教育系统(JAVA毕业设计)

本文项目编号 T 060 &#xff0c;文末自助获取源码 \color{red}{T060&#xff0c;文末自助获取源码} T060&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

【hot100-java】【合并两个有序链表】

记忆中&#xff0c;两个指针合并即可。 建立哨兵节点dum /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { t…

idea启动项目报错Command line is too long

idea启动项目报错 Command line is too long. Shorten command line for Idmap5CoreApplication or also for Spring Boot default configuration? 选择出问题的项目&#xff0c;shorten command line 选项选择 JAR manifest 或者 classpath file 选项

用责任链模式改造 if else

我的上一篇文章&#xff0c;因为if else 多了&#xff0c;捣鼓很久&#xff0c;今天用责任链模式改造一下。 代码写着写着&#xff0c;if else if 逻辑忘记了&#xff0c;哎。。。-CSDN博客 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09; 1. 什么是责任…

SpringBoot之Profile的两种使用方式

0. 需求 通常项目开发过程中&#xff0c;会经历多种环境转换&#xff0c;典型的如开发环境(dev)、测试环境(test)和生产环境(prod)。在这三种不同的环境下&#xff0c;连接数据库时使用的配置信息是不同的&#xff0c;即三个不同环境对应三个不同的数据库。 现在的需求是&#…

【论文导读】Graphusion (LLM + KGC)

序言 第一次论文出现在 《Leveraging Large Language Models for Concept Graph Recovery and Question Answering in NLP Education》 论文地址&#xff1a;https://arxiv.org/abs/2402.14293 七月份的时候应该是又改进了一次。但是又发了一篇新的地址&#xff1a;《Graphu…

css 中 ~ 符号、text-indent、ellipsis、ellipsis-2、text-overflow: ellipsis、::before的使用

1、~的使用直接看代码 <script setup> </script><template><div class"container"><p><a href"javascript:;">纪检委</a><a href"javascript:;">中介为</a><a href"javascript:…

SpringAOP实现的两种方式-JDK动态代理和CGLIB动态代理

前言 想要了解SpringAOP的实现方式&#xff0c;需要先了解什么是AOP OOP和AOP的区别 OOP 面向对象&#xff0c;允许开发者定义纵向的关系&#xff0c;但并适用于定义横向的关系&#xff0c;导致了大量代码的重复&#xff0c;而不利于各个模块的重用。 AOP&#xff0c;一般称为…

让小脚本成为自己高效测试的工具

测试中会遇到的工具 软件测试如果仅仅靠手工去执行会发现在很多地方力不从心&#xff0c;虽然市面上已经有大牛开源了一些测试工具可以供我们使用但是在一些公司特有的业务方面则需要我们借助开源或重新做一个自己的测试工具。 测试常用的开源工具 死链接检测工具 Xenu home…

如何使用便签高效管理自己的工作和时间?

在快节奏的现代生活中&#xff0c;我们每天都要面对众多工作任务&#xff0c;而时间却是有限的。如何在有限的时间内高效地完成工作&#xff0c;成为了每个职场人士必须面对的挑战。为了更好地管理时间&#xff0c;提高工作效率&#xff0c;我们往往需要借助一些工具来帮助我们…

Linux上Java项目环境安装

java环境 一.免费的管理Linux软件 家庭/学校免费 - NetSarang Website (xshell.com) 二.安装jdk // 检查以前是否安装过jdk java -version // 我们还可以通过以下指令来看我们安装了多少openJDK apt list --installed | grep openjdk// 如果你想卸载某个apt安装的java版本&am…

CMOS Sensor调试笔记

最近在调CMOS Sensor&#xff1b;基于无ISP的芯片。 第一步&#xff0c;找模组厂要到对应Sensor对应分辨率&#xff0c;YUV信息的驱动。 第二步&#xff0c;确认信号的极性&#xff0c;VSYNC&#xff0c;SYNC, PCLK。 第三步&#xff0c;开始测试。 问题解决&#xff1a; 1&am…

覆盖生活中各方面的5款软件,非常好用

​ 在现代生活中&#xff0c;各类工具软件为我们提供了便捷的解决方案&#xff0c;从日程管理到系统优化&#xff0c;再到文件传输与多媒体编辑&#xff0c;各类软件的功能多样&#xff0c;极大地提升了我们的工作与生活效率。 1.日历清单——日历清单 ​ 日历清单是一款集日…

运营计划管理——电商运营(案例分享)

运营计划&#xff0c;作为运营管理的重要组成部分&#xff0c;通过科学规划与有效执行&#xff0c;对确保企业目标实现起着至关重要的作用。 运营计划是指通过制定、执行、监控和调整运营计划&#xff0c;以确保企业资源得到合理配置&#xff0c;业务活动有序进行&#xff0c;最…

学习threejs,添加户外光照光源

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言二、&#x1f340;绘制任意字体模型…