leetcode_力扣_4. 寻找两个正序数组的中位数

题目描述

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

提示

  • nums1.length == m
  • nums2.length == n
  • 0 <= m <= 1000
  • 0 <= n <= 1000
  • 1 <= m + n <= 2000
  • -106 <= nums1[i], nums2[i] <= 106

解题思路

  • 因为两个数组都是有序的,所以可以用类似于归并排序那样,分别从两个数组中往外取元素;
  • 中位数即是数组最中间的那个数,就可以根据两个原数组的长度计算出来;
  • 从两个原数组中往外取元素,直到取到对应下标的元素,退出循环,计算并返回结果。

代码

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {

        int len_1, len_2;
        int cur, begin, end, idx_1, idx_2, key;
        float temp = 0;

        len_1 = nums1.size();
        len_2 = nums2.size();

        if((len_1+len_2) % 2 == 0){
            end = (len_1+len_2) / 2;
            begin = end - 1;
        }else{
            begin = (len_1+len_2) /2;
            end = begin;
        }
        cur = -1;

        idx_1 = 0;
        idx_2 = 0;
        while(idx_1 < len_1 && idx_2 < len_2){
            
            if(nums1[idx_1] < nums2[idx_2]){
                key = nums1[idx_1];
                idx_1++;
            }else{
                key = nums2[idx_2];
                idx_2++;
            }
            
            cur++;
            if(cur > end){
                break;
            }
            if(cur >= begin){
                temp += key;
            }
        }
        while(idx_1 < len_1){
            key = nums1[idx_1];
            idx_1++;
            cur++;
            if(cur > end){
                break;
            }
            if(cur >= begin){
                temp += key;
            } 
        }
        while(idx_2 < len_2){
            key = nums2[idx_2];
            idx_2++;
            cur++;
            if(cur > end){
                break;
            }
            if(cur >= begin){
                temp += key;
            }
        }

        if(begin == end){
            return temp;
        }else{
            return temp / 2;
        }
    }
};

提交结果

res

总结

  • 碰到多个数组且有序,想归并的思想。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值