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

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

文章目录

  • 力扣Hot100-4 寻找两个正序数组的中位数
    • 全部刷题与学习记录
    • 原题目
    • 考查知识点
    • 自己的第一遍解法
    • 好的解法

全部刷题与学习记录

【C++刷题学习笔记目录】

【C++百万并发网络通信-笔记目录】

原题目

题目地址:4. 寻找两个正序数组的中位数

给定两个大小分别为 mn 的正序(从小到大)数组 nums1nums2。请你找出并返回这两个正序数组的 中位数

示例 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

考查知识点

二分查找

自己的第一遍解法

与力扣官方题解 寻找两个有序数组的中位数 中的第一种思路不谋而合:使用归并的方式,合并两个有序数组,得到一个大的有序数组。大的有序数组的中间位置的元素,即为中位数。

归并思路可以分成三步:

  1. 将两数组合并(重复数字要保留)
  2. 对合并后的数组进行排序
  3. 根据合并后数组大小的奇偶求中位数;size=奇数,中位数=vec[(size - 1) / 2]; size=偶数,中位数等=(vec[size / 2] + vec[size / 2 - 1] )/ 2

对与重复性的有序数组,有一种容器可以办到multiset,他可以将插入的元素自动进行排序

代码如下:

#include 
#include 
#include 

using namespace std;

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        if (nums1.empty() && nums2.empty()) return 0;

        //1 不重复合并 2 排序
        multiset<int> mer;
        for (auto i : nums1) mer.insert(i);
        for (auto i : nums2) mer.insert(i);

        //3 分奇偶取中位数
        int merSize = mer.size();
        vector<int> merVec;
        for (auto i : mer)  merVec.push_back(i);

        if ((merSize & 0x1) == 1) {//奇数
            return (double)merVec[(merSize - 1) / 2];
        }
        else {//偶数
            double s1 = merVec[merSize / 2];
            double s2 = merVec[merSize / 2 - 1];
            return (s1 + s2) / 2;
        }
    }
};

好的解法

官方题解中的二分法确实达到了题目要求的复杂度,这种解法也无愧于困难的难度,但是我属实是没看懂有点晕

你可能感兴趣的:(#,LeetCode,热题,HOT,100,刷题笔记,c++,leetcode)