首页 > 其他分享 >力扣-4-寻找两个正序数组的中位数

力扣-4-寻找两个正序数组的中位数

时间:2023-08-20 14:22:39浏览次数:35  
标签:二分 排除 正序 元素 中位数 力扣 查找 数组

题目要求O(log (m+n))的时间复杂度

知道了两个数组的长度,那么中位数的下标以及如何计算是可以确定的,给出的是两个正序数组,如果使用双指针,从两个数组头开始扫描并比较,找出合并后第 K 小的数字,时间复杂度是多少?

时间复杂度是O((M+N)/2),这个目标还不及题目的要求,看到logN就会想到二分,但是以往的二分是在有序数组中查找指定元素,这里是查找合并后的中位元素,或者说查找合并后第 K 小的元素,似乎不太一样

官方二分

这种思路的精髓在于:每一次循环都能排除掉当前比较中较小的那部分元素,从而在不断缩小的范围内寻找到中位数,而不需要对整个数组进行排序

这个二分思路中 k 的更新规则是什么,以及循环退出条件是什么?

k 的更新规则是每次循环结束后减去排除掉的元素数量,以更新我们在剩下的数组中查找新的第k小的元素

为什么这么做是正确的呢?

因为我们只会从数组头排除,也就是排除小的那一部分;结束条件是k=1,即我们需要第一小的元素,就是当前指针指向的两个元素。
但是很明显就算当k=1时,也有两个指针指向了两个数字,我们选哪一个呢?为什么选较小的那个作为中位数是正确的?
因为我们需要第一小的元素,就是更小的那一个

这个二分思路跟常规二分不一样的地方在于:首先它只会排除左边的部分,但是是两个数组中的某一个左半部分,用两个指针来实现。

我想这个思路可能更像是:查找合并数组后第 k 小的元素,更像是转化为 -> 排除掉合并后数组中最小的 k-1 个元素,并且每次排除 k/2 个元素,我觉得这样解释这个思路更能让人理解

如果能够理解这个思路了,那么就可以尝试自己写

标签:二分,排除,正序,元素,中位数,力扣,查找,数组
From: https://www.cnblogs.com/yaocy/p/17643853.html

相关文章

  • 力扣101. 对称二叉树
    给你一个二叉树的根节点 root ,检查它是否轴对称。 示例1:输入:root=[1,2,2,3,4,4,3]输出:true 示例2:输入:root=[1,2,2,null,3,null,3]输出:false  提示:树中节点数目在范围 [1,1000] 内-100<=Node.val<=100 康复训练1/*2*@lcapp=......
  • 力扣-搜索插入元素
    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(logn) 的算法。 示例1:输入:nums=[1,3,5,6],target=5输出:2示例 2:输入:nums=[1,3,5,6],target=2输出:1示......
  • 力扣-移除元素
    给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 说明:为什么返回数值是......
  • 第 358 场周赛 - 力扣(LeetCode)
    第358场周赛-力扣(LeetCode)2815.数组中的最大数对和-力扣(LeetCode)双for遍历即可classSolution{public:intmaxSum(vector<int>&nums){autore=[](intx){intma=0;while(x){if(x%10>ma)......
  • 代码随想录算法训练营第十三天|单调数列:滑动窗口最大值(力扣239.)、优先级队列:前k个高
    单调数列:滑动窗口最大值(力扣239.)给定滑动窗口的范围,求每个滑动窗口范围内的最大值使用单调队列实现对于最大值数字前面的数字不存入数列,对于最大值数字后面的数字存入数列中单调队列中数字的大小呈递减顺序pop(value):如果窗口移除的元素等于单调队列的队口元素,则pop;否则什......
  • 力扣---833. 字符串中的查找与替换
    你会得到一个字符串 s (索引从0开始),你必须对它执行 k 个替换操作。替换操作以三个长度均为 k 的并行数组给出:indices, sources,  targets。要完成第 i 个替换操作:检查 子字符串  sources[i] 是否出现在 原字符串 s 的索引 indices[i] 处。如果没有出......
  • 【LeetCode 571. 给定数字的频率查询中位数】WITH RECURSIVE实现Tally的逆操作
    目录题目地址代码题目地址https://leetcode.cn/problems/find-median-given-frequency-of-numbers/description/代码WITHRECURSIVERecCTEAS(SELECTnum,frequency-1asremaining_frequencyFROMNumbersWHEREfrequency>0UNIONALLSELECTn......
  • 代码随想录算法训练营第十一天|力扣20.有效的括号、力扣1047.删除字符串中所有相邻重
    有效的括号(力扣20.)括号匹配时使用栈解决的经典问题题意其实就像我们在写代码的过程中,要求括号的顺序是一样的有左括号,那么在对应位置则必须有右括号第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以returnfalse第二种情况:遍历字......
  • 力扣- 删除有序数组中的重复项
    给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:更改......
  • C语言中如何获取数组的中位数
    C语言中如何获取数组的中位数在C语言编程中,获取数组的中位数是一项常见而重要的任务。中位数是一个数组中的一个特殊值,它将该数组分为两个等长的部分。当数组长度为奇数时,中位数就是位于数组中间位置的元素;当数组长度为偶数时,中位数是中间两个元素的平均值。7C语言中如何获取数......