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

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


I. Description:

在这里插入图片描述

II. Solution:


version 1


解题思路:

  整体思路是将A和B两个数组按照升序合并,最终计算一个有序数组的中位数。此时,需要判断下数组长度的奇偶性。


Code:

  • cpp
#include <vector>
class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        if(nums1.empty()){
            int L = nums2.size();
            if(L % 2 == 0){
                return (nums2[L/2 - 1] + nums2[L/2]) / 2.0;
            }
            else{
                return nums2[L/2];
            }
        }

        if(nums2.empty()){
            int L = nums1.size();
            if(L % 2 == 0){
                return (nums1[L/2 - 1] + nums1[L/2]) / 2.0;
            }
            else{
                return nums1[L/2];
            }
        }

        int L = 0;
        int i = 0, j = 0;

        int len_nums1 = nums1.size();
        int len_nums2 = nums2.size();

        // 将两个数组按照非降序合并成一个数组
        int s = len_nums1 + len_nums2;
        vector<int> nums_merge(s, 0);
        while(L != (len_nums1 + len_nums2)){
            // i,j其中某个数已经达到数组的长度
            if(i == len_nums1){
                while(j != len_nums2){
                    nums_merge[L++] = nums2[j++];
                }

                break;
            }

            if(j == len_nums2){
                while(i != len_nums1){
                    nums_merge[L++] = nums1[i++];
                }

                break;
            }
            
            if(nums1[i] < nums2[j]){
                nums_merge[L++] = nums1[i++];
            }
            else{
                nums_merge[L++] = nums2[j++];
            }

        }

        // 前面都是为了获得合并后数组的长度
        if (L % 2 == 0){
            return (nums_merge[L/2 - 1] + nums_merge[L/2]) / 2.0;
        }
        else{
            return nums_merge[L/2];
        }      
    }
};

version 2


解题思路:

  分析 v e r s i o n 1 version1 version1 的求解过程可知,我们不必等到把数组A和B合并完成后再去找中位数的位置。通过两个数组的长度 m + n m+n m+n 可以知道合并后的数组长度,是否可以写一个循环,当遍历到了中位数的位置就将结果返回。方法是可以但对于奇数偶数的分类还是会较为麻烦,能否通过某种方式将奇数偶数统一起来。
  假设合并后的数组长度为 l e n len len。当 l e n len len 为奇数时,我们需要得到 l e n / 2 len/2 len/2 索引处的值,则需要遍历的次数为 l e n / 2 + 1 len/2+1 len/2+1;当 l e n len len 为偶数时,我们需要得到 l e n / 2 − 1 len/2-1 len/21 l e n / 2 len/2 len/2 索引处的值,则依然需要遍历 l e n / 2 + 1 len/2+1 len/2+1 次。所以论遍历的次数,不论奇偶都需要遍历 l e n / 2 + 1 len/2+1 len/2+1 次。
  当 l e n len len 为奇数时,返回中位数只需要返回最后一次遍历的结果。当 l e n len len 为偶数时,则需要返回最后一次和倒数第二次的遍历结果。这样我们可以设 c u r cur cur p r e pre pre 两个变量用来分别记录当前一次和紧挨着的上一次循环遍历的结果,在每次循环开始时,先将 c u r cur cur 的值赋给 p r e pre pre ,这样当循环到最后一次遍历时, p r e pre pre 得到 c u r cur cur 的值,即倒数第二次遍历的结果,随后 c u r cur cur 更新为最后一次的结果。


Code:

  • cpp
class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int m = nums1.size();
        int n = nums2.size();

        int len = m + n;
        int numTraversal = len/2 + 1;  //总共遍历这么多次

        //分别用来记录两个数组的当前索引位置
        int a = 0, b = 0;  
        //分别用来存放当前循环遍历的结果和前一次遍历的结果
        int cur = 0, pre = 0;

        int count = 0;
        for(int i = 0; i < numTraversal; i++){
            pre = cur;

            //需要考虑两个数组有没有到头, 这个判断条件设置的较为巧妙
            if(a < m && (b == n || nums1[a] < nums2[b])){
                cur = nums1[a++];
            }
            else{
                cur = nums2[b++];
            }
        }

        if(len % 2 == 0){
            return (cur + pre) / 2.0;
        }
        else{
            return cur;
        } 
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值