leetcode:两个排序数组的中位数

leetcode:两个排序数组的中位数

题目要求:
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。

请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。

你可以假设 nums1 和 nums2 不同时为空。

示例 1:

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

中位数是 2.0
示例 2:

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

中位数是 (2 + 3)/2 = 2.5

解题思路:
首先想到的就是利用多路归并的思想找到中位数,先计算得到中位数的位置target,然后我们只需要用两个下标指向两个两个数组的开始,然后每次将其值较小的下标后移,如此执行target步,此时两者的最小值就是中位数(如果总数为双,则为两个最小值的平均)。
但在代码实现时遇到很多问题,比如如果一个数组到尾部了怎么办,又比如遇到空数组怎么办,如果加判断条件特殊处理的话,代码会变得庞大并且难看。综合起来看,这些都属于边界问题,于是想到在两个数组的末尾加上Max_Int,如此,解决了边界问题。

代码实现:

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {//这里为了使边界条件更好处理,在两个数组的末尾加入元素Max_int
	int length = nums1.size() + nums2.size();
	int target = length/2;
    if(length%2==0){
        target--;
    }                                             //计算得到中位数的具体位置  
	nums1.push_back(2147483647);
	nums2.push_back(2147483647);                  //数组末尾插入int最大值
	int i_num1 = 0;
	int i_num2 = 0;
	double res = 0;
	while (target>0) {                            //移动到中位数开始位置
		target--;
		nums1[i_num1]<nums2[i_num2] ? i_num1++ : i_num2++;
	}
	res = nums1[i_num1]<nums2[i_num2] ? nums1[i_num1++] : nums2[i_num2++];         //取中位数
	if (length % 2 == 0) {
		res = res + (nums1[i_num1]<nums2[i_num2] ? nums1[i_num1] : nums2[i_num2]);
		res = res / 2;
	}
    nums1.erase(nums1.end()-1);
    nums2.erase(nums2.end()-1);                   //删去插入的数据
	return res;
}
};

咯咯咯,今天程序员节,开启博客的第一天,希望以后越来越好!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值