Leetcode—4.寻找两个正序数组的中位数【困难】

news2024/12/23 15:18:52

2023每日刷题(二十九)

Leetcode—4.寻找两个正序数组的中位数

在这里插入图片描述

直接法实现代码

int mid, mid1, mid2;
bool findmid(int n, int k, int x) {
    if(n % 2 == 1) {
        if(k == n / 2) {
            mid = x;
            return true;
        }
    } else {
        if(k == n / 2 - 1) {
            mid1 = x;
        } else if(k == n / 2) {
            mid2 = x;
            return true;
        }
    }
    return false;
}

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
    int n = nums1Size + nums2Size;
    int i = 0, j = 0, k = 0;
    bool flag = false;
    while(i < nums1Size && j < nums2Size) {
        if(nums1[i] < nums2[j]) {
            flag = findmid(n, k, nums1[i]);
            if(flag) {
                break;
            }
            i++;
        } else {
            flag = findmid(n, k, nums2[j]);
            if(flag) {
                break;
            }
            j++;
        }
        k++;
    }
    while(i < nums1Size && !flag) {
        flag = findmid(n, k, nums1[i]);
        k++;
        i++;
    }
    while(j < nums2Size && !flag) {
        flag = findmid(n, k, nums2[j]);
        k++;
        j++;
    }
    if(n % 2 == 1) {
        return mid;
    } else {
        return (mid1 + mid2) / 2.0;
    }
}

运行结果

在这里插入图片描述

优化代码

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
    int n = nums1Size + nums2Size;
    int mid1 = 0, mid2 = 0;
    int i = 0, j = 0, k = 0;
    while((i < nums1Size || j < nums2Size) && k <= n / 2) {
        if((j >= nums2Size) || (i < nums1Size && nums1[i] <= nums2[j])) {
            if(k == n / 2) {
                mid1 = nums1[i];
            } else if(k == n / 2 - 1) {
                mid2 = nums1[i];
            }
            i++;
        }
        else {
            if(k == n / 2) {
                mid1 = nums2[j];
            } else if(k == n / 2 - 1) {
                mid2 = nums2[j];
            }
            j++;
        }
        k++;
    }
    if(n % 2 == 1) {
        return mid1;
    } else {
        return (mid1 + mid2) / 2.0;
    }
}

运行结果

在这里插入图片描述

二分法算法思想——降低时间复杂度到题目要求的 O ( l o g ( m + n ) ) O(log(m + n)) O(log(m+n))

其实就是第 k 小数解法,详情参考这篇文章
在这里插入图片描述

二分法实现代码

#define MIN(a, b) ((a < b) ? (a): (b))
int binaryKth(int* nums1, int nums1Size, int* nums2, int nums2Size, int k) {
    int idx1 = 0, idx2 = 0;
    int newIdx1 = 0, newIdx2 = 0;
    int n1 = 0, n2 = 0;
    while(1) {
        if(idx1 == nums1Size) {
            return nums2[idx2 + k - 1];
        }
        if(idx2 == nums2Size) {
            return nums1[idx1 + k - 1];
        }
        if(k == 1) {
            return MIN(nums1[idx1], nums2[idx2]);
        }
        newIdx1 = MIN(idx1 + k / 2 - 1, nums1Size - 1);
        newIdx2 = MIN(idx2 + k / 2 - 1, nums2Size - 1);
        n1 = nums1[newIdx1];
        n2 = nums2[newIdx2];
        if(n1 <= n2) {
            k -= newIdx1 - idx1 + 1;
            idx1 = newIdx1 + 1;
        } else {
            k -= newIdx2 - idx2 + 1;
            idx2 = newIdx2 + 1;
        }
    }
}

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
    int n = nums1Size + nums2Size;
    if(n % 2 == 1) {
        return binaryKth(nums1, nums1Size, nums2, nums2Size, (n + 1) / 2);
    } else {
        int a = binaryKth(nums1, nums1Size, nums2, nums2Size, n / 2);
        int b = binaryKth(nums1, nums1Size, nums2, nums2Size, n / 2 + 1);
        return (a + b) / 2.0;
    }
}

运行结果

在这里插入图片描述
之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

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

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

相关文章

程序员,你的护城河挖好了吗?

程序员的护城河 在遥远的古代&#xff0c;护城河是一种防御工事&#xff0c;通常用于保护城市或城堡免受外部攻击。它是由人工挖掘或天然形成的河流、壕沟或城墙等&#xff0c;可以作为防御屏障&#xff0c;阻止敌人的进入。 而对于程序员而言&#xff0c;“护城河”是一种比喻…

Java之SpringCloud Alibaba【九】【Spring Cloud微服务Skywalking】

Java之SpringCloud Alibaba【一】【Nacos一篇文章精通系列】跳转Java之SpringCloud Alibaba【二】【微服务调用组件Feign】跳转Java之SpringCloud Alibaba【三】【微服务Nacos-config配置中心】跳转Java之SpringCloud Alibaba【四】【微服务 Sentinel服务熔断】跳转Java之Sprin…

【milkv】2、mpu6050驱动添加及测试

前言 本章介绍mpu6050的驱动添加以及测试。 其中驱动没有采用sdk提供的驱动&#xff0c;一方面需要配置irq&#xff0c;另一方面可以学习下如何通过ko方式添加驱动。 一、参考文章 驱动及测试文件编译流程&#xff1a; https://community.milkv.io/t/risc-v-milk-v-lsm6ds…

Semantic Kernel 学习笔记2

本来想白瞟免费Bing Search API如下&#xff0c;但是报错无法链接利用免费的必应 Bing 自定义搜索打造站内全文搜索_bing_subscription_key-CSDN博客 改成按照官方推荐申请&#xff0c;并在.env文件中添加BING_API_KEY""字段。 1. 打开https://www.microsoft.com/en-…

Quarkus 替代 SpringBoot

1 概述2 SpringBoot3 Quarkus4 比较5 调查结果6 从 Spring 转换到 Quarkus7 我是 Spring 开发者&#xff0c;为什么要选Quarkus&#xff1f;8 Spring 开发者可以活用哪些现有知识&#xff1f;9 对Spring开发者有额外的好处吗&#xff1f;10 Spring开发者如何开始学习Quarkus&am…

mp4视频批量截取!!!

mp4视频批量截取&#xff01;&#xff01;&#xff01; 问题&#xff1a;如果我们想截取一个mp4视频中的多个片段&#xff0c;一个一个截会很麻烦&#xff01; 可以将想要截取的开始时间和结束时间保存到 excel表 中&#xff0c;进行批量截取。 1、对一个视频&#xff0c;记…

临床决策分析(DCA)演示APP:理解DCA分析

临床决策分析&#xff08;DCA&#xff09;演示APP&#xff1a;理解DCA分析 之前讨论了DCA分析的分析过程和作用&#xff0c;认为其最主要的作用是确定预测模型的决策阈值&#xff0c;从而促进预测模型与临床的结合。DCA的影响不止于此&#xff0c;在DCA分析中&#xff0c;预测…

C++模拟实现——红黑树

一、介绍 红黑树也是对一般的搜索二叉树不能保证平衡的一个改进&#xff0c;和AVL树采用的思路不同&#xff0c;但同样需要旋转&#xff0c;其本质也是一颗平衡搜索二叉树&#xff0c;其节点有颜色的区分&#xff0c;并且被一些规则束缚&#xff0c;在这些规则下&#xff0c;能…

远勤山丨于无声处听惊雷——写在远航汽车投产下线之际

“只要未来有前途的产业必然竞争激烈。新能源汽车目前还有很多新进入者&#xff0c;证明还有很大的成长空间。对于远航汽车&#xff0c;我们非常有信心坐上最后的牌桌。” 2023年11月8日&#xff0c;在山西运城大运新能源生产基地举办的“远航汽车下线仪式”上&#xff0c;大运…

举报“将我的电脑控作己用者”!

既然“麻辣800727”都说是“街子电信”干的&#xff0c;那么&#xff0c;我现在就正式举报&#xff1a;请依法管理宽带网&#xff0c;你国营的也不可以随意侵犯用户的人权&#xff0c;更不可以将自己变成法外之地&#xff01; 请公开答复&#xff0c;并改正&#xff0c;否则把…

Web实验(总)

目录 网站需求&#xff1a; 思路&#xff1a; 实验步骤&#xff1a; 第一步&#xff1a;准备工作 第二步&#xff1a;新建一个存储网页的目录 第三步&#xff1a;修改本地hosts映射 第四步&#xff1a;修改配置文件&#xff0c;建立基于http服务的网站 1)创建用户song和…

都快2024年了,别只使用React,需要学习一下Vue,不然没出路了

最近&#xff0c;我的朋友因为不熟悉 Vue.js 而未能通过面试。 她平时工作中大部分时间都在使用React&#xff0c;所以也懒得去了解其他前端框架。 世界上所有的前端框架我们都应该熟悉吗&#xff1f; 不&#xff0c;这是极其不合理的。 但为了生存&#xff0c;朋友还是要学…

Vue事件绑定

目录 前言 Vue事件处理 指令的语法格式 事件绑定指令—v-on 回调函数 前言 我们知道如何在原生js中实现事件绑定&#xff0c;那在vue中如何实现呢&#xff1f; Vue事件处理 指令的语法格式 <标签 v-指令名&#xff1a;参数名"表达式">{{插值语法}}</…

2D 3D 工业组态技术 meta2d JavaScript

本心、输入输出、结果 文章目录 2D 3D 工业组态技术 meta2d JavaScript前言2D 3D 工业组态技术 meta2d JavaScript 简介2D 3D 工业组态技术 meta2d JavaScript 特性丰富的组态能力0代码数据通信组态的应用多端适配能力强大的扩展能力追求卓越性能丰富的组件库资源广泛的应用场景…

React Virtual DOM及Diff算法

JSX到底是什么 使用React就一定会写JSX&#xff0c;JSX到底是什么呢&#xff1f;它是一种JavaScript语法的扩展&#xff0c;React使用它来描述用户界面长成什么样子&#xff0c;虽然它看起来非常像HTML&#xff0c;但他确实是javaScript&#xff0c;在React代码执行之前&#…

介绍几种Go语言开发的IDE

文章目录 1.前言2.几种ide2.1 Goland2.2 VsCode示例 2.3 LiteIDE2.4 Eclipse插件GoClipse2.5 Atom2.6 Vim2.7 Sublime Text 3.总结写在最后 1.前言 Go语言作为一种新兴的编程语言&#xff0c;近年来受到了越来越多的关注。 它以其简洁、高效和并发性能而闻名&#xff0c;被广…

基于STC12C5A60S2系列1T 8051单片机的数模芯片DAC0832实现数模转换应用

基于STC12C5A60S2系列1T 8051单片机定时器/计数器应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍数模芯片DAC0832介绍通过按键调节数模芯片DAC0832输出模拟量控制…

ThreadLocal原理及使用场景

ThreadLocal意为线程本地变量&#xff0c;用于解决多线程并发时访问共享变量的问题 明显&#xff0c;在多线程的场景下&#xff0c;当有多个线程对共享变量进行修改的时候&#xff0c;就会出现线程安全问题&#xff0c;即数据不一致问题。常用的解决方法是对访问共享变量的代码…

dll文件【C#】

加载方法&#xff1a; [DllImport("controlcan.dll")] public static extern UInt32 VCI_OpenDevice(UInt32 DeviceType, UInt32 DeviceInd, UInt32 Reserved); 文件存放位置&#xff1a; 一般放Debug文件夹下。 运行错误&#xff1a; 原因是CPU位数选择不对&…

F8652X 984865265 F8652E 984865264

F8652X 984865265 F8652E 984865264 亚历克能够满足最严格的建筑规范开箱-不需要大量的定制&#xff0c;设计时间或劳动力&#xff0c;或专门的布线系统。 模块化ALEC系统包括三个简单的硬件组件——区域控制器(ZC001)、标准按钮墙板和物联网(IoT)网关。该系统可以无限扩展&…