当前位置: 首页 > news >正文

LeetCode Hot100【4. 寻找两个正序数组的中位数】

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

自己做 

分析

解1:归并思想

class Solution {
public:double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {int sum = 0;double value;queue<double> value2;int i = 0, j = 0;if ((nums1.size() + nums2.size()) % 2 == 1) {                 //两数组大小相加为奇数【只有一个中位数】while (i < nums1.size() && j < nums2.size()) {if (nums1[i] < nums2[j]) {value = nums1[i];           //相当于取nums1[i]i++;}else {value = nums2[j];           //相当于取nums2[j]j++;}sum++;if (sum == (nums1.size() + nums2.size()) / 2 + 1)        //找到中位数return value;}while (i < nums1.size()) {        //遍历完其中一个数组还没有找到value = nums1[i];           //相当于取nums1[i]i++;sum++;if (sum == (nums1.size() + nums2.size()) / 2 + 1)        //找到中位数return value;}while (j < nums2.size()) {        //遍历完其中一个数组还没有找到value = nums2[j];           //相当于取nums2[j]j++;sum++;if (sum == (nums1.size() + nums2.size()) / 2 + 1)        //找到中位数return value;}}else {                               //两数组大小相加为偶数【需要合并】while (i < nums1.size() && j < nums2.size()) {if (nums1[i] < nums2[j]) {value2.push(nums1[i]);           //相当于取nums1[i]i++;if (value2.size() > 2)             //只维护两个数据value2.pop();}else{value2.push(nums2[j]);           //相当于取nums2[j]j++;if (value2.size() > 2)             //只维护两个数据value2.pop();}sum++;if (sum == (nums1.size() + nums2.size()) / 2 + 1) {        //找到中位数double num1 = value2.back();double num2 = value2.front();value = (num1 + num2) / 2;return value;}}while (i < nums1.size()) {        //遍历完其中一个数组还没有找到value2.push(nums1[i]);           //相当于取nums1[i]i++;if (value2.size() > 2)             //只维护两个数据value2.pop();sum++;if (sum == (nums1.size() + nums2.size()) / 2 + 1) {        //找到中位数double num1 = value2.back();double num2 = value2.front();value = (num1 + num2) / 2;return value;}}while (j < nums2.size()) {        //遍历完其中一个数组还没有找到value2.push(nums2[j]);           //相当于取nums2[j]j++;if (value2.size() > 2)             //只维护两个数据value2.pop();sum++;if (sum == (nums1.size() + nums2.size()) / 2 + 1) {        //找到中位数double num1 = value2.back();double num2 = value2.front();value = (num1 + num2) / 2;return value;}}}return 0;}
};

思考

看题解【想不到】

总结:使用二分我们可以直接排除不可能是中位数的数

仿写

class Solution {
public:int getKthElement(const vector<int>& nums1, const vector <int>& nums2, int k) {     //寻找中位数(位置为k)对应元素int index1 = 0, index2 = 0;         //两数组的中位索引int len1 = nums1.size();            //注:nums1.size()返回的是无符号整型,这一步就是为了将无符号整型转化为有符号int len2 = nums2.size();while(true) {if(index1 == len1)          //nums1为空数组return nums2[index2 + k - 1];   //直接返回nums2的第k个元素【即Nums2的中位数就是两者合并的中位数】if (index2 == len2)          //nums2为空数组return nums1[index1 + k - 1];   //直接返回nums1的第k个元素【即Nums1的中位数就是两者合并的中位数】if (k == 1) {                //将中位数前面的数全部排除后,k = 1,这个数即是中位数return min(nums1[index1], nums2[index2]);   //排除的过程中,会不断移动Index,当k=1时即只剩下了中位数,这种情况下就代表了前k-1个数已经完全排除了,第k个数即为中位数,也是剩余数中最小的}//正常情况,平分k/2int newIndex1 = min(index1 + k / 2 - 1, len1 - 1);          //偏移中轴位置int newIndex2 = min(index2 + k / 2 - 1, len2 - 1);          //偏移中轴位置int pivot1 = nums1[newIndex1];int pivot2 = nums2[newIndex2];if (pivot1 <= pivot2) {              //数组1的中位比数组2的中位小k -= newIndex1 - index1 + 1;    //排除index1 = newIndex1 + 1;}else {k -= newIndex2 - index2 + 1;    //排除index2 = newIndex2 + 1;}} }double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {int totalLen = nums1.size() + nums2.size();if (totalLen % 2 == 1)           //总长为奇数return getKthElement(nums1, nums2, (totalLen + 1) / 2);else                            //总长为偶数return (getKthElement(nums1, nums2, totalLen / 2) + getKthElement(nums1, nums2, totalLen / 2 + 1))/ 2.0;}};

http://www.dtcms.com/a/282417.html

相关文章:

  • 什么是 WebClient?
  • xss-labs的小练
  • 基于faster-r-cnn行人检测和ResNet50+FPN的可见光红外图像多模态算法融合创新
  • VIVADO技巧_BUFGMUX时序优化
  • 比特币技术简史 第二章:密码学基础 - 哈希函数、公钥密码学与数字签名
  • 基于阿里云云服务器-局域网组网软件
  • Mfc初始化顺序
  • 【27】MFC入门到精通——MFC 修改用户界面登录IP IP Address Control
  • 虚幻引擎5 GAS开发俯视角RPG游戏 #06-7:无限游戏效果
  • 【28】MFC入门到精通——MFC串口 Combobox 控件实现串口号
  • 技术演进中的开发沉思-36 MFC系列: 对话框
  • Java并发编程(一)
  • LeetCode Hot 100 二叉树的最大深度
  • .NET 10 Preview 4 已发布
  • 【C# in .NET】9. 探秘委托:函数抽象的底层机制
  • 设置第三方窗口置顶(SetWindowPos方法,vb.net)
  • WMS仓储管理系统智能调控提升电子企业库存周转率
  • 系统启动流程分析
  • Linux-RAID
  • QML 五大对话框组件
  • 端口被占用时的解决问题
  • Egg.js × NestJS 2025 Nodejs后端框架选型指南
  • 代码随想录算法训练营十七天|二叉树part07
  • 【android bluetooth 协议分析 03】【蓝牙扫描详解 2】【app触发蓝牙扫描后,协议栈都做了那些事情】
  • 跨平台 App 如何无痛迁移到鸿蒙系统?全流程实战+Demo 教程
  • 八股文——包装类
  • Android 升级targetSdk无法启动服务
  • 动态规划题解——分割等和子集【LeetCode】
  • 面向向量检索的教育QA建模:九段日本文化研究所日本语学院的Prompt策略分析(6 / 500)
  • 知识点3:python-sdk 核心概念(prompt、image、context)