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

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

题目描述:给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
在这里插入图片描述
解题思路:新开一个数组,大小为m+n,对两个数组进行归并排序放入新开的数组中,当找到所需的中位数下标位置时,就可以计算中位数,将值返回。另外就是,对于偶数和奇数,中位数的计算方法不同。
对于长度为n的正序数组nums,这里方便公式表达,假设数组下标从1开始。如果n是偶数,那中位数为(nums[n/2]+nums[n/2+1])/2。如果n是奇数,那中位数为nums[(n+1)/2]

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

        int  m = nums1.size(), n = nums2.size();
        int i = 0, j = 0, t = 0;
        vector<int> merageNums(m + n, 0);
        double medianNumber = 0;

        //对两数组进行归并,到达中位数时就停止寻找
        while (i < m && j < n) {
            if (nums1[i] < nums2[j]) {
                merageNums[t++] = nums1[i++];
            } else {
                merageNums[t++] = nums2[j++];
            }

            if (0 == ((m + n) & 1)) {
                //m+n为偶数时
                if ((m + n) / 2 + 1 == t) {
                    //偶数情况下,长度为n的数组中位数:n/2和n/2+1取平均
                    medianNumber = (merageNums[t - 2] + merageNums[t - 1]) / 2.0;
                    break;
                }
            } else {
                //m+n为奇数
                if ((m + n + 1) / 2 == t) {
                    medianNumber = merageNums[t - 1];
                    break;
                }
            }
        }

        while (i < m) {
            merageNums[t++] = nums1[i++];
            if (0 == ((m + n) & 1)) {
                //m+n为偶数时
                if ((m + n) / 2 + 1 == t) {
                    medianNumber = (merageNums[t - 2] + merageNums[t - 1]) / 2.0;
                }
            } else {
                //m+n为奇数
                if ((m + n + 1) / 2 == t) {
                    medianNumber = merageNums[t - 1];
                }
            }
        } 
        
        while (j < n) {
            merageNums[t++] = nums2[j++];
            if (0 == ((m + n) & 1)) {
                //m+n为偶数时
                if ((m + n) / 2 + 1 == t) {
                    // cout << 
                    medianNumber = (merageNums[t - 2] + merageNums[t - 1]) / 2.0;
                }
            } else {
                //m+n为奇数
                if ((m + n + 1) / 2 == t) {
                    medianNumber = merageNums[t - 1];
                }
            }
        }
        return medianNumber;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值