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

本文探讨了如何在两个已排序的数组中找到中位数的两种算法。首先介绍了一种合并数组后寻找中位数的方法,然后提出了一种不创建新数组的直接扫描法,通过在原数组上交叉扫描并记录中位数。这两种算法都避免了额外的空间开销,并能有效地找到目标值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路1:

  1. 合并正序数组
  2. 根据合并后的数组判断返回中位数的位置

代码1:

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        vector<int> ans;
        int i = 0, j = 0;
        //数组比较合并
        while (i<nums1.size()&&j<nums2.size()) {
            if (nums1[i] < nums2[j]) 
                ans.push_back(nums1[i++]);
            else
                ans.push_back(nums2[j++]);
        }
        //数组剩余添加
        if (i < nums1.size())
            while(i<nums1.size())
                ans.push_back(nums1[i++]);
        else
            while(j<nums.size())
                ans.push_back(nums2[j++]);
        //根据数组长度判断中位数位置
        if (ans.size() % 2)
            return double(ans[ans.size() / 2]);
        else
            return (double(ans[ans.size() / 2-1] + double(ans[ans.size() / 2])) / 2);
    }
};

思路2:

  1. 不创建新的数组向量,直接在原数组上扫描
  2. 考虑中位数只有一个和有两个的情况——利用额外一个temp记录第一个中位数
  3. 两个循环(第一个循环用于交叉扫描,第二个循环用于剩余扫描)的终止条件相同

代码2:

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int i = 0, j = 0;
        int flag = 0;//用于记录当前扫描的是哪个数组
        int temp = 0;//当有两个中位数时,用来存储第一个中位数
        //两数组相互扫描
        while (i < nums1.size() && j < nums2.size()) {
            flag = 0;
            if (nums1[i] < nums2[j]) {flag = 1;i++;}
            else  j++;
            //用来保存有两个中位数时的第一个中位数
            if (double(i + j) == (double(nums1.size() + nums2.size()) / 2))
                temp = flag == 1 ? nums1[i - 1] : temp = nums2[j - 1];
            //判断是否到达中位数
            else if (i + j == ((nums1.size() + nums2.size()) / 2 + 1)) {
                if (flag == 1)
                    return temp == 0 ? double(nums1[i - 1]) : double(nums1[i - 1] + temp) / 2;
                else
                    return temp == 0 ? double(nums2[j - 1]) : double(nums2[j - 1] + temp) / 2;
            }
        }
        //剩余数组扫描
        while (1) {
            flag = 0;
            if (i < nums1.size()) {i++;flag = 1;}
            else  j++;
            //用来保存有两个中位数时的第一个中位数
            if (double(i + j) == (double(nums1.size() + nums2.size()) / 2))
                temp=flag == 1? nums1[i - 1]: temp = nums2[j - 1];
            //判断是否到达中位数
            else if (i + j == ((nums1.size() + nums2.size()) / 2 + 1)) {
                if (flag == 1)
                    return temp == 0 ? double(nums1[i - 1]) : double(nums1[i - 1] + temp) / 2;
                else
                    return temp == 0 ? double(nums2[j - 1]) : double(nums2[j - 1] + temp) / 2;
            }
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值