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

【力扣hot100题】(067)寻找两个有序数组的中位数

我觉得这是目前hot里最难的题了,不敢想象面试碰到这等恐怖的题会是怎样一番腥风血雨。

大体思路其实不难(找到正确方法途径实现还是有难度的),难点主要集中在情况巨多,但凡这题给定两数组长度之和一定为奇数都不会这么难。

思路想了好一会,我先是想到每次取两数组的中间值比较,将大的那个后面的元素全部剔除,但这种方法需要记录原始数组长度、剔除的长度,每次都要比较是否剔除了一半的原长度……

看来答案才发现可以从前往后剔除,思路其实差不多但是实现起来答案确实更简单。

我最终的方法结合了答案和自己的想法:先记录需要找的位置k=(nums1.size()+nums2.size()-1)/2,同样是每次找寻中间节点k/2比较,剔除中间值小的那个数组的右边部分,k减去剔除的值,每个循环检查k,若k为0则取两数组首位更小的那个值。

这还只是大体思路,还有很多其余情况,比如一个数组的长度达不到k/2,这时候就取这个数组的最后一个元素和另一个数组中间点比较;还有一个数组已经为空,这时候取另一个数组的第k个位置即可;还有需要加入bool判断有几个中位数,如果有两个就还要取下一个最小值与当前最小值相加除以二……

总之最终还是“顺利”的过了。

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        bool b=(nums1.size()+nums2.size())%2;
        int k=(nums1.size()+nums2.size()-1)/2;
        while(1){
            if(nums1.size()==0){
                if(b==1) return nums2[k];
                else return static_cast<double>(nums2[k]+nums2[k+1])/2;
            }
            if(nums2.size()==0){
                if(b==1) return nums1[k];
                else return static_cast<double>(nums1[k]+nums1[k+1])/2;
            }
            if(k==0){
                if(b==1) return min(nums1[0],nums2[0]);
                else if(nums2.size()>1&&nums1[0]>nums2[0]) return static_cast<double>(nums2[0]+min(nums1[0],nums2[1]))/2;
                else if(nums1.size()>1&&nums1[0]<nums2[0]) return static_cast<double>(nums1[0]+min(nums1[1],nums2[0]))/2;
                else return static_cast<double>(nums1[0]+nums2[0])/2;
            }
            if(nums1.size()<=k/2){
                if(nums1[nums1.size()-1]>nums2[k/2]){
                    nums2.erase(nums2.begin(),nums2.begin()+(k+1)/2);
                    k-=(k+1)/2;
                }
                else{
                    k-=nums1.size();
                    nums1.clear();
                }
            }
            else if(nums2.size()<=k/2){
                if(nums2[nums2.size()-1]>nums1[k/2]){
                    nums1.erase(nums1.begin(),nums1.begin()+(k+1)/2);
                    k-=(k+1)/2;
                }
                else{
                    k-=nums2.size();
                    nums2.clear();
                }
            }
            else if(nums1[k/2]>nums2[k/2]){
                nums2.erase(nums2.begin(),nums2.begin()+(k+1)/2);
                k-=(k+1)/2;
            }
            else{
                nums1.erase(nums1.begin(),nums1.begin()+(k+1)/2);
                k-=(k+1)/2;
            }
        }
        return 0;
    }
};

前三个if都是判断是否可以return了,后面的一系列if else都是移动k和删除元素。

相关文章:

  • 壹起航:15 年深耕,助力中国工厂出海远航产品出海
  • Valgrind——内存调试和性能分析工具
  • 蓝桥杯真题——前缀总分、遗迹
  • el-table,新增、复制数据后,之前的勾选状态丢失
  • 【深度学习】【目标检测】【Ultralytics-YOLO系列】YOLOV3源码整体结构解析
  • 系统与网络安全------Windows系统安全(11)
  • 【笔记】VS中C#类库项目引用另一个类库项目的方法
  • coze生成流程图和思维导图工作流
  • 【C#知识点详解】Dictionary<TKey,TValue>储存结构详解
  • 初阶数据结构(3)顺序表
  • Electron使用WebAssembly实现CRC-32 STM32校验
  • 爱普生高精度车规晶振助力激光雷达自动驾驶
  • Python基础知识点(函数2)
  • 自用记录 | AI辅助 在线画图工具 使用Mermaid语法(流程图 ER图)
  • 【Kafka基础】Kafka 2.8以下版本的安装与配置指南:传统ZooKeeper依赖版详解
  • 如何拿到iframe中嵌入的游戏数据
  • 2023年蓝桥杯第十四届CC++大学B组真题及代码
  • Linux内核设计——(二)进程调度
  • CMake实战指南一:add_custom_command
  • 手撕算法——宽度优先搜索-BFS
  • wordpress 主题 tewnty ten 导航条字体 修改/银川seo优化
  • 杭州安卓软件开发/马鞍山网站seo
  • 淘宝联盟推广做网站违法/郑州seo代理外包公司
  • 天河低价网站建设/友情链接什么意思
  • 公司网站做推广/互联网舆情
  • 有帮忙做儿童房设计的网站吗/今日网站收录查询