LeetCode 4. 寻找两个有序数组的中位数(二分查找,难)

文章目录

    • 1. 题目
    • 2. 解题
      • 2.1 合并数组
      • 2.2 优化2.1解法,双指针
      • 2.3 二分法(找第k个数)
      • 2.4 切分法

1. 题目

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。

请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为O(log(m+n))O(log(m + n))O(log(m+n))

你可以假设 nums1 和 nums2 不会同时为空。

示例 1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 合并数组

  • 合并两个数组,再取中位数
  • 时间和空间复杂度均为 O(m+n)
class Solution {
public:double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {int n1 = nums1.size(), n2 = nums2.size(), len;len = n1 + n2;vector<int> nv(len);int i = 0, j = 0, k = 0;while(i < n1 && j < n2){if(nums1[i] < nums2[j])nv[k++] = nums1[i++];elsenv[k++] = nums2[j++];}if(i == n1){while(j < n2)nv[k++] = nums2[j++];}else{while(i < n1)nv[k++] = nums1[i++];}if(len%2)return nv[len/2];return (nv[len/2]+nv[len/2-1])/2.0;}
};

在这里插入图片描述

2.2 优化2.1解法,双指针

  • 不合并两个数组,设置双指针在两个数组上
  • 比较大小,分别移动各自的指针,遍历到中间的计数停止
  • 时间复杂度 O(m+n),空间复杂度 O(1)
class Solution {
public:double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {int n1 = nums1.size(), n2 = nums2.size(), len;len = n1 + n2;vector<int> nv(len);int i = 0, j = 0, k, left = -1, right = -1;for(k = 0; k <= len/2; ++k){left = right;if(i < n1 && (j >= n2 || nums1[i] < nums2[j]))right = nums1[i++];elseright = nums2[j++];}if(len%2)return right;return (left+right)/2.0;        }
};

2.3 二分法(找第k个数)

参考链接,解法3
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

class Solution {
public:double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {int n1 = nums1.size(), n2 = nums2.size(), len, kth;len = n1 + n2;kth = (len+1)/2;if(len%2)return findKth(nums1,0,n1-1,nums2,0,n2-1,kth);return (findKth(nums1,0,n1-1,nums2,0,n2-1,kth)+findKth(nums1,0,n1-1,nums2,0,n2-1,kth+1))/2.0;      }int findKth(vector<int>& nums1, int s1, int e1, vector<int>& nums2, int s2, int e2, int kth){int len1 = e1-s1+1;int len2 = e2-s2+1;if(len1 > len2)	//确保传进来的参数len1是较短的数组(它先空)return findKth(nums2,s2,e2,nums1,s1,e1,kth);if(len1 == 0)return nums2[s2+kth-1];//一个为空,直接找到答案if(kth == 1)return min(nums1[s1],nums2[s2]);int i = s1+min(len1,kth/2)-1;//min使得指针不会越界int j = s2+min(len2,kth/2)-1;if(nums1[i] > nums2[j])//舍去nums2前面的return findKth(nums1,s1,e1,nums2,j+1,e2,kth-(j-s2+1));else//舍去nums1前面的return findKth(nums1,i+1,e1,nums2,s2,e2,kth-(i-s1+1));}
};

O(lg(m+n))O(lg(m+n))O(lg(m+n))时间复杂度,尾递归,无需堆栈,空间复杂度 O(1)O(1)O(1)
在这里插入图片描述

2.4 切分法

  • 放了方便处理,确保A数组长度较短
  • 初始状态下mid1取数组1的中间,mid1,mid2左半边的总个数 == 右半边 或者 比右半边少1
  • 对mid1进行二分查找,相应的mid2会随动(mid2=allHalf−mid1mid2 = allHalf - mid1mid2=allHalfmid1
  • 如果 lmax1<=rmin2,andlmax2<=rmin1lmax1 <= rmin2 ,\quad and \quad lmax2 <= rmin1lmax1<=rmin2,andlmax2<=rmin1 , 成功找到分界线
  • Lmax=max(lmax1,lmax2))Lmax = max(lmax1,lmax2))Lmax=max(lmax1,lmax2)), Rmin=min(rmin1,rmin2)Rmin = min(rmin1, rmin2)Rmin=min(rmin1,rmin2),总个数为奇数返回RminRminRmin, 偶数返回(Lmax+Rmin)/2.0(Lmax+Rmin)/2.0(Lmax+Rmin)/2.0
    在这里插入图片描述
class Solution {
public:double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {int n1 = nums1.size(), n2 = nums2.size();if(n1 > n2)//确保n1是较短的数组return findMedianSortedArrays(nums2, nums1);int left = 0, right = n1, allHalf = (n1+n2)/2, mid1, mid2;int lmax1, rmin1, lmax2, rmin2;while(left <= right){mid1 = left+((right-left)>>1);mid2 = allHalf - mid1;lmax1 = (mid1-1 >= 0) ? nums1[mid1-1] : INT_MIN;rmin1 = (mid1 < n1) ? nums1[mid1] : INT_MAX;lmax2 = (mid2-1 >= 0) ? nums2[mid2-1] : INT_MIN;rmin2 = (mid2 < n2) ? nums2[mid2] : INT_MAX;//在边界处,认为没有元素,设置成最大或者最小,保证下面关系式成立if(lmax1 > rmin2)right = mid1-1;else if(lmax2 > rmin1)left = mid1+1;else{left = right = mid1;break;}}int i = left, j = allHalf-left;int l = max(i-1 >= 0 ? nums1[i-1] : INT_MIN,j-1 >= 0 ? nums2[j-1] : INT_MIN);int r = min(i < n1 ? nums1[i] : INT_MAX,j < n2 ? nums2[j] : INT_MAX);if((n1+n2)%2 == 1)return r;return (l+r)/2.0;}  
};

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

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

相关文章

论文浅尝 | 当Hearst还不够时:用分布模型来提升语料库中的上下义关系检测

笔记整理 | 潘晓梅&#xff0c;东南大学硕士&#xff0c;研究方向为知识图谱构建、自然语言处理。来源&#xff1a;EMNLP 2020.论文下载地址&#xff1a; https://www.aclweb.org/anthology/2020.emnlp-main.502.pdf项目源码地址&#xff1a; https://github.com/ccclyu/ComHyp…

LeetCode 887. 鸡蛋掉落(DP,难、不懂)

1. 题目 你将获得 K 个鸡蛋&#xff0c;并可以使用一栋从 1 到 N 共有 N 层楼的建筑。 每个蛋的功能都是一样的&#xff0c;如果一个蛋碎了&#xff0c;你就不能再把它掉下去。 你知道存在楼层 F &#xff0c;满足 0 < F < N 任何从高于 F 的楼层落下的鸡蛋都会碎&…

正确的LeetCode刷题姿势!

名师 带你刷爆LeetCode算法知识 讲解训练免费0元报名参加在讲到 AI 算法工程师时&#xff0c;大部分同学关注点都在高大上的模型&#xff0c;一线优秀的项目。但大家往往忽略了一点&#xff0c;人工智能的模型、项目最终还是要靠程序和算法实现。算法能力是每一个程序员的基本功…

论文浅尝 | DI刊发的那些有关Knowledge Graph的论文

本文转载自公众号&#xff1a;数据智能英文刊知识图谱被称为人工智能的基石&#xff0c;它的前身是语义网&#xff0c;由谷歌在2012年率先提出&#xff0c;用于改善自身的搜索业务。Data Intelligence执行主编、东南大学计算机科学与技术学院漆桂林教授这样定义知识图谱&#x…

缓存那些事

本文已发表于《程序员》杂志2017年第3期&#xff0c;下面的版本又经过进一步的修订。 一般而言&#xff0c;现在互联网应用&#xff08;网站或App&#xff09;的整体流程&#xff0c;可以概括如图1所示&#xff0c;用户请求从界面&#xff08;浏览器或App界面&#xff09;到网络…

LeetCode 42. 接雨水(双指针、单调栈)

文章目录1. 题目2. 解题2.1 正反扫描法2.2 双指针2.3 单调栈1. 题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图&#xff0c;在这种情况下&am…

论文浅尝 - IJCAI | Knowledge is NOT always you need: 外部知识注入预训练模型的利与弊...

转载公众号 | 浙大KG论文题目&#xff1a;Drop Redundant, Shrink Irrelevant: Selective Knowledge Injection for Language Model Pretraining本文作者&#xff1a;张宁豫&#xff08;浙江大学&#xff09;、邓淑敏&#xff08;浙江大学&#xff09;、张亦弛&#xff08;阿里…

圆形的CNN卷积核?华中大清华康奈尔提出圆形卷积,进一步提升卷积结构性能!...

文 | 小马编 | 极市平台写在前面目前正常卷积的感受野大多都是一个矩形的&#xff0c;因为矩形更有利于储存和计算数据的方便。但是&#xff0c;人类视觉系统的感受野更像是一个圆形的。因此&#xff0c;作者就提出&#xff0c;能不能将CNN卷积核的感受野也变成圆形呢&#xff…

Android自定义Lint实践

Android Lint是Google提供给Android开发者的静态代码检查工具。使用Lint对Android工程代码进行扫描和检查&#xff0c;可以发现代码潜在的问题&#xff0c;提醒程序员及早修正。 为保证代码质量&#xff0c;美团在开发流程中加入了代码检查&#xff0c;如果代码检测到问题&…

关于PaddleNLP如何加载训练好的模型进行NER

关于PaddleNLP如何加载训练好的模型进行NER 关于PaddleNLP如何加载训练好的模型进行NER 当时在如何加载已经训练好的模型的问题上花了很长时间&#xff0c;后来也是受另一篇文章启发&#xff0c;问题才得以解决&#xff0c;此文章写的很详细&#xff0c;所以不再详细介绍&#…

论文浅尝 | 利用机器翻译和多任务学习进行复杂的知识图谱问答

笔记整理 | 谭亦鸣&#xff0c;东南大学博士生。来源&#xff1a;EACL‘21链接&#xff1a;https://www.aclweb.org/anthology/2021.eacl-main.300.pdf概述知识图谱问答过程一般包括实体链接&#xff0c;多跳推理等步骤&#xff0c;传统方法将各个步骤作为模块单独处理&#xf…

LeetCode 134. 加油站(贪心)

文章目录1. 题目2. 解题1. 题目 在一条环路上有 N 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;开始时油箱为空。 …

诺奖级成果开源!为什么说AlphaFold2足以改变全人类?

文 | 炼丹学徒编 | 小轶前天&#xff0c;AlphaFold2开源&#xff0c;相信大家被大大小小的公众号刷屏了。谷歌Deepmind团队此前使用基于Transformer的模型&#xff0c;在CASP14比赛上&#xff0c;刷新蛋白质三维结构预测的新高度&#xff0c;而详细论文&#xff0c;代码&#x…

美团外卖前端可视化界面组装平台 —— 乐高

乐高&#xff0c;是美团点评一个快速搭建后台系统页面的平台。名称来源于大家熟悉的丹麦知名玩具品牌&#xff0c;他们的玩具都是通过组合易拆卸、装配的零件&#xff0c;形成最终的作品。经过长期的发展&#xff0c;乐高品牌渐渐有了“快乐、想象、创意的未来”的寓意。 随着外…

论文浅尝 | 主题驱动的分子图表示对比学习

笔记整理 | 方尹&#xff0c;浙江大学在读博士&#xff0c;研究方向&#xff1a;图表示学习。论文地址&#xff1a;https://arxiv.org/abs/2012.12533动机与贡献现有的对比学习框架中可能存在以下几个弊端&#xff1a;1.把节点看成一种视图&#xff0c;在节点和图之间进行对比学…

LeetCode 931. 下降路径最小和(DP)

文章目录1. 题目2. 动态规划解题1. 题目 给定一个方形整数数组 A&#xff0c;我们想要得到通过 A 的下降路径的最小和。 下降路径可以从第一行中的任何元素开始&#xff0c;并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列。 示例&#xff1a; 输…

到2021年,目前深度学习领域有哪些除了调模型以外的硬核研究工作和进展?

文 | 刘斯坦&#xff0c;电光幻影炼金术源 | 极市平台作为一个未入门的研究生小白&#xff0c;一方面为深度学习的实际效果和应用价值而感到兴奋&#xff0c;另一方面也会担忧自己的个人能力的发展。个人目前浅薄的看法是&#xff0c;调模型的强应用向的研究工作&#xff0c;由…

美团点评SQL优化工具SQLAdvisor开源

在数据库运维过程中&#xff0c;优化 SQL 是 DBA 团队的日常任务。例行 SQL 优化&#xff0c;不仅可以提升程序性能&#xff0c;还能够降低线上故障的概率。 目前常用的 SQL 优化方式包括但不限于&#xff1a;业务层优化、SQL逻辑优化、索引优化等。其中索引优化通常通过调整索…

LeetCode 295. 数据流的中位数(大小堆)

文章目录1. 题目2. 大小堆解题1. 题目 中位数是有序列表中间的数。如果列表长度是偶数&#xff0c;中位数则是中间两个数的平均值。 例如&#xff0c; [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 3) / 2 2.5设计一个支持以下两种操作的数据结构&#xff1a;void addNum(int…

论文浅尝 | 利用常识知识图谱进行多跳推理的语言生成方法

笔记整理 | 朱珈徵&#xff0c;天津大学硕士。链接&#xff1a;https://arxiv.org/pdf/2009.11692.pdf动机尽管生成式预训练语言模型在一系列文本生成任务上取得了成功&#xff0c;但在生成过程中需要对基础常识知识进行推理的情况下&#xff0c;它们仍然会受到影响。现有的方法…