C++算法:寻找两个正序数组的中位数

news/2024/11/29 14:55:19/

题目

寻找两个正序数组的中位数
给定两个大小分别为 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

2023年3月13号的解法

class Solution {
public:
double findMedianSortedArrays(vector& nums1, vector& nums2) {
const int Len = nums1.size() + nums2.size();
const int iAvg1 = Rec(nums1.data(), nums1.data() + nums1.size(), nums2.data(), nums2.data() + nums2.size(), (Len - 1) / 2);
if (Len & 1)
{
return iAvg1;
}
const int iAvg2 = Rec(nums1.data(), nums1.data() + nums1.size(), nums2.data(), nums2.data() + nums2.size(), (Len - 1) / 2+1);
return (iAvg1 + iAvg2) / 2.0;
}
int Rec(int* b1, int* e1, int* b2, int* e2, int iFindIndex)
{
if (b1 == e1)
{
return b2[iFindIndex];
}
if (b2 == e2)
{
return b1[iFindIndex];
}
if (0 == iFindIndex)
{
return min(*b1, *b2);
}
int k = (iFindIndex + 1) / 2;
const int index1 = min(k - 1,(int)( e1 - b1)-1);
const int index2 = min(k - 1, (int)(e2 - b2 )- 1);
if (b1[index1] < b2[index2])
{
return Rec(b1 + index1 + 1, e1, b2, e2, iFindIndex - index1 - 1);
}
return Rec(b1, e1, b2 + index2 + 1, e2, iFindIndex - index2 - 1);
}
};

2023年8月6号的解法

class Solution {
public:
double findMedianSortedArrays(vector& nums1, vector& nums2) {
m_c = nums1.size() + nums2.size();
m_iHalf = m_c / 2;
int left = 0, r = min(m_iHalf, (int)nums1.size()) + 1;//左闭右开
while (r > left + 1)
{
const auto mid = left + (r - left) / 2;
const int leftLen2 = m_iHalf - mid;
const int iRet = Cmp(mid, leftLen2, nums1, nums2);
if (0 == iRet)
{
break;
}
else if (iRet < 0)
{
r = mid;
}
else
{
left = mid;
}
}
if (m_dRet < 0 )
{
Cmp(left,m_iHalf-left,nums1,nums2);
}
return m_dRet;
}
int Cmp(int leftLen1, int leftLen2, const vector& nums1, const vector& nums2)
{
if (leftLen2 > nums2.size())
{
return 1;
}
int iLeftMax = INT_MIN;
if (leftLen1 > 0)
{
iLeftMax = max(iLeftMax, nums1[leftLen1 - 1]);
}
if (leftLen2 > 0)
{
iLeftMax = max(iLeftMax, nums2[leftLen2 - 1]);
}
int iRightMin = INT_MAX;
if (leftLen1 < nums1.size())
{
iRightMin = min(iRightMin, nums1[leftLen1]);
}
if (leftLen2 < nums2.size())
{
iRightMin = min(iRightMin, nums2[leftLen2]);
}
if (iLeftMax <= iRightMin)
{
if (1 & m_c)
{
m_dRet = iRightMin;
}
else
{
m_dRet = (iLeftMax + iRightMin) / 2.0;
}
return 0;
}
if ((leftLen1 > 0) && (nums1[leftLen1 - 1] > iRightMin))
{
return-1;
}
return 1;
}
double m_dRet=-1;
int m_c;
int m_iHalf;
};

其它

视频课程

如果你觉得复杂,想从简单的算法开始,可以学习我的视频课程。
https://edu.csdn.net/course/detail/38771
我的其它课程
https://edu.csdn.net/lecturer/6176

测试环境

win7 VS2019 C++17

相关下载

doc版文档,排版好
https://download.csdn.net/download/he_zhidan/88348653


http://www.ppmy.cn/news/1141005.html

相关文章

为什么说重写是运行时多态?

为什么说重写是运行时多态&#xff1f; 重写&#xff08;Overriding&#xff09;被称为运行时多态&#xff08;Runtime Polymorphism&#xff09;&#xff0c;是因为它涉及到在程序运行时&#xff08;而不是编译时&#xff09;根据对象的实际类型来确定要调用的方法。在运行时&…

Windows电脑多开器在无人机仿真应用中的实践

随着无人机技术的不断发展&#xff0c;无人机仿真已经成为了无人机研究和开发的重要手段之一。但是&#xff0c;在进行无人机仿真时&#xff0c;往往需要同时运行多个仿真软件&#xff0c;这就需要使用多开器来实现。 Windows电脑多开器可以在一台电脑上同时运行多个软件&…

NFT Insider#110:The Sandbox与TB Media Global合作,YGG Web3游戏峰会阵容揭晓

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members、BeepCrypto出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周报将从NFT市场数据&#xff0c;艺术新闻类&#xff0c;游戏新闻类&#xff0c;虚拟世界类&#xff0…

李沐深度学习记录4:12.权重衰减/L2正则化

权重衰减从零开始实现 #高维线性回归 %matplotlib inline import torch from torch import nn from d2l import torch as d2l#整个流程是&#xff0c;1.生成标准数据集&#xff0c;包括训练数据和测试数据 # 2.定义线性模型训练 # 模型初始化&#xff08;函…

解决VUE安装依赖时报错:npm ERR! code ERESOLVE

前言 在使用 npm 安装项目依赖时&#xff0c;有时会遇到错误信息 “npm ERR! code ERESOLVE”&#xff0c;该错误通常发生在依赖版本冲突或者依赖解析问题时。本文将详细介绍出现这个错误的原因&#xff0c;并提供解决方法&#xff0c;确保正确安装项目依赖并避免该错误的发生。…

Java数组:没错,不装了我就是书架。

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、数组的概念1、什么是数组&#xff1f;2、数组的创建3、数组的初始化Ⅰ、动态初始化Ⅱ、静态初始化 二、数组的使用1、数组中…

计算机网络(文章链接汇总)

参考引用 计算机网络微课堂-湖科大教书匠计算机网络&#xff08;第7版&#xff09;-谢希仁 计算机网络&#xff08;一&#xff09;&#xff1a;概述计算机网络&#xff08;二&#xff09;&#xff1a;物理层计算机网络&#xff08;三&#xff09;&#xff1a;数据链路层计算机网…

怎么使用jenkins设置web自动打包

在Jenkins中设置Web自动打包需要完成以下步骤&#xff1a; 1.环境基础 安装Jenkins&#xff1a;首先&#xff0c;你需要在服务器上安装Jenkins。 你可以从Jenkins官网下载Jenkins的安装包&#xff0c;并按照官方指导进行安装。 2.使用jenkins设置web自动打包步骤 创建Jenk…