算法练习(3):Median of Two Sorted Arrays

本文介绍了一种高效求解两个有序序列和序列中值的方法,通过每次选取最小值并逐步构建新序列,最终找到中值,避免了直接排序带来的高时间复杂度。

这次的题目相对来说思维难度上加大了一点,是求两个有序序列的和序列的中值,这个听起来很简单,但是有个复杂度要求,题目如下:


分析与思路:所以当然可以排除暴力求解的方法,因为有复杂度要求就是时间上有要求,而暴力求解最费时间,也就是说不能直接简单用一个vector什么容器把两个序列的值放进来然后排序取中值,这样能解但是不满足复杂度要求。我想到一个比较巧妙省时间的方法就是每次在取两个序列中的最小值放进序列同时把新序列排序,这样就避免了新序列的排序,同时再改进一点,因为我们是在两个序列中直接取最小值,那么是不是不用完全取到新序列呢,取到中值出现就停止,这样就更省时间了。我感觉上这是最优了吧。。。我是用优先队列来实现的,取到中值出现时,奇数个则中值就是队列头,偶数个则是队列前两个的均值。

代码如下:

class Solution {
public:
	double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
		priority_queue<int> q;
		int num = (nums1.size() + nums2.size()) / 2+1;			//取多少次能出现中值
		bool Ou = true;							//判断奇偶
		if ((nums1.size() + nums2.size()) % 2) Ou = false;
		while (num--) {
			int a = nums1.empty() ? 2147483640 : nums1.front();	//防止在空序列中访问
			int b = nums2.empty() ? 2147483640 : nums2.front();
			if (a < b) {						//取两序列中的最小值
				q.push(nums1.front());
				nums1.erase(nums1.begin());
			}
			else {
				q.push(nums2.front());
				nums2.erase(nums2.begin());
			}
		}
		if (Ou) {
			int temp1 = q.top();
			q.pop();
			return ((double)temp1+(double)q.top()) / 2;
		}
		else return (double)q.top();
	}
};
算法程序设计很多时候难的是那个算法,得出算法后实现一般都不是问题。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值