力扣 困难题 寻找两个正序数组的中位数 使用 C++ 迭代器 通过

本文介绍了一种在O(log(m+n))时间复杂度内找到两个已排序数组中位数的方法。通过迭代器将两个数组合并成一个有序数组,并解决了在迭代过程中可能出现的边界问题,例如当一个数组遍历结束后,另一个数组仍有元素未加入目标数组的情况。最后,计算中位数并返回结果。
摘要由CSDN通过智能技术生成

力扣 寻找两个正序数组的中位数 使用 C++ 迭代器 通过

给定两个大小分别为 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

Median of the Two Sorted Arrays

Given two sorted arrays nums1 and nums2 of size m and n respectively, return the median of the two sorted arrays.

The overall run time complexity should be O(log (m+n)).

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/median-of-two-sorted-arrays

successful code

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
    vector<int> target;
    auto it1 = nums1.begin();
    auto it2 = nums2.begin();
    if(nums1.size() == 0){
        target = nums2;
    }else if(nums2.size() == 0){
        target = nums1;
    }else{
        auto inums = nums1.size()+nums2.size();
        while(inums--)
        {
            if(it1==nums1.end() )
            {
                target.push_back(*it2++);
                continue;
            }
            if(it2==nums2.end() )
            {
                target.push_back(*it1++);
                continue;
            }
            if(*it1 <= *it2)
            {
                target.push_back(*it1);
                it1++;
            }
            else
            {
                target.push_back(*it2);
                it2++;
            }
        }
    }
    double rvaule = 0.0;
    auto mid = target.begin() + (target.end() - target.begin()) / 2;
    if(target.size() % 2 == 0)
    {
        rvaule = (*mid + *(mid-1)) / 2.0;
    }
    else{
        rvaule = *mid ;
    }
    return rvaule;
    }
};

过程出现的issue

两个正序数组, 如何使用迭代器排序成一个有序数组, 问题: 最后的it.end()问题

vector<int> nums1{1,3,7};
vector<int> nums2{2,4};

判断条件是 if(*it1 <= *it2)
当 4为最后 加入后 如何 加入 7

vector<int> nums1{1,3,7};
    vector<int> nums2{2,4};
    vector<int> target;
    auto it1 = nums1.begin();
    auto it2 = nums2.begin();
    auto inums = nums1.size()+nums2.size();
//    cout << "inums : "<< inums<<endl;
    while(inums--)
    {
        if(*it1 <= *it2)
        {
            target.push_back(*it1);
            if((it1  )!=nums1.end())
                it1++;
        }
        else if(it2!=nums2.end())
        {
            target.push_back(*it2);
            if((it2  )!=nums2.end())
                it2++;
        }

    }
    for (auto i : target)
        cout << i <<endl;
    double rvaule = 0.0;
    auto mid = target.begin() + (target.end() - target.begin()) / 2;
    rvaule = *mid / 2.0;
    
    cout << "return : "<< rvaule<<endl;

解决: 单独增加end相关的判断

while(inums--)
{
    if(it1==nums1.end())
    {
        target.push_back(*it2);
        continue;
    }
    if(it2==nums2.end())
    {
        target.push_back(*it1);
        continue;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值