欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-15 10:53:38
...

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

算法练习(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();
	}
};
算法程序设计很多时候难的是那个算法,得出算法后实现一般都不是问题。。。