算法练习(3):Median of Two Sorted Arrays
2017-09-09 01:30
489 查看
这次的题目相对来说思维难度上加大了一点,是求两个有序序列的和序列的中值,这个听起来很简单,但是有个复杂度要求,题目如下:
分析与思路:所以当然可以排除暴力求解的方法,因为有复杂度要求就是时间上有要求,而暴力求解最费时间,也就是说不能直接简单用一个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();
}
};算法程序设计很多时候难的是那个算法,得出算法后实现一般都不是问题。。。
分析与思路:所以当然可以排除暴力求解的方法,因为有复杂度要求就是时间上有要求,而暴力求解最费时间,也就是说不能直接简单用一个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();
}
};算法程序设计很多时候难的是那个算法,得出算法后实现一般都不是问题。。。
相关文章推荐
- 算法分析课每周练习 Median of Two Sorted Arrays
- leetcode:Median of Two Sorted Arrays (找两个序列的中位数,O(log (m+n))限制) 【面试算法】
- 【算法导论学习-016】两个已排过序的等长数组的中位数(median of two sorted arrays)
- 【LeetCode-面试算法经典-Java实现】【004-Median of Two Sorted Arrays(两个排序数组的中位数)】
- (算法分析Week4)Median of Two Sorted Arrays[Hard]
- Median_of_Two_Sorted_Arrays(理论支持和算法总结)
- 【算法】【Divide and conquer】Median of Two Sorted Arrays
- 【LeetCode算法练习(C语言)】Median of Two Sorted Arrays
- 算法第三周Median of Two Sorted Arrays[hard]
- LeetCode算法题目:Median of Two Sorted Arrays
- 算法分析与设计丨第三周丨LeetCode(5)——Median of Two Sorted Arrays(Hard)
- LeetCode Online Judge 题目C# 练习 - Median of Two Sorted Arrays
- 算法课第十五周作业 | Median of Two Sorted Arrays
- Median of Two Sorted Arrays (找两个序列的中位数,O(log (m+n))限制) 【面试算法leetcode】
- Leetcode平台上的Median of Two Sorted Arrays题目用Java堆算法实现
- 【算法分析与设计】【第二周】4.Median of Two Sorted Arrays
- Median of Two Sorted Arrays
- Median of Two Sorted Arrays
- LeetCode - Median of Two Sorted Arrays
- leetcode-4-Median of Two Sorted Arrays