七、[LeetCode OJ]Median of Two Sorted Arrays

本文介绍了一种高效算法来找到两个已排序数组的中位数。通过合并两个数组并利用栈结构提前结束计算的方式,确保了算法的时间复杂度为O(log(m+n)),提供了两种实现思路。

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

【问题描述】

There are two sorted arrays nums1 and nums2 of size m and n respectively.

Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

Example 1:

nums1 = [1, 3]
nums2 = [2]

The median is 2.0

Example 2:

nums1 = [1, 2]
nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5
问题来源:Median of Two Sorted Arrays

【问题分析】

题意很简单,求两个有序数组组合起来后的中位数。
用最简单直接的方法,两个for循环遍历两个数组进行排序,找出排序后数组的中位数,这种时间复杂度为O(m*n)。
这里没有采用分治方法,而是采用了简单的归并排序。假设有两个数组A1和A2,比较两个数组的元素A1[i]和A2[j],将较小的元素放入新数组,如果A1[i]小,则i++;如果A2[j]小,则j++,再接着比较A1[i]和A2[j],直到一个数组全部进行了比较。时间复杂度为O(m+n)。
给出了两份代码,第一份是全部排完序后寻找它的中位数,第二份是排序到它的中位数后直接停止排序。

【源代码】

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        vector<int> result;
        int count = nums1.size() + nums2.size();
        int i = 0;
        int j = 0;
       	while (i < nums1.size() && j < nums2.size()) {
	       	if (nums1[i] < nums2[j]) {
	       		result.push_back(nums1[i]);
	       		i++;
		} else {
			result.push_back(nums2[j]);
			j++;
		}
	}
	while(i < nums1.size()) {
       		result.push_back(nums1[i]);
   	   	i++;
	}
	while(j < nums2.size()) { 
		result.push_back(nums2[j]);
		j++;
	}
	if (count == 0) {
        	return 0;
       	} else if (count % 2 == 0) {
		return (result[count/2] + result[count/2 - 1]) / 2.0;
	} else {
		return (result[count/2]);
	}
    }
};
class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        stack<int> result;
        int count = nums1.size() + nums2.size();
        int i= 0;
        int j = 0;
       	while (i < nums1.size() || j < nums2.size()) {
       		if (i < nums1.size() && j < nums2.size()) {
	       		if (nums1[i] < nums2[j]) {
	       			result.push(nums1[i]);
	       			i++;
			} else {
				result.push(nums2[j]);
				j++;
			}
		} else {
			if (j >= nums2.size()) {
    	    			result.push(nums1[i]);
    	    			i++;
			} else {
				result.push(nums2[j]);
				j++;
			}
		}
		if (result.size() > count / 2) {
			if (count % 2 == 0) {
				int number1 = result.top();
				result.pop();
				return (number1 + result.top())/2.0;
			} else {
				return result.top();
			}
		}
	}
	return 0;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值