1029 Median(双指针)

it2024-08-18  39

这类题目归结于常用技巧与算法,有很鲜明的套路,重在理解其规则,通常写起来不算太复杂。

题目描述: 题目大致意思: 题目理解起来较为简单,就是输出两个从小到大排列的整数序列合并成一个整数序列后的中位数。 大致思路: 最容易想到的也是最直接的方法是,合并两个整数序列,并且从小到大进行排序,但是很显然这种方法在时间复杂度上来说肯定不是最优的。使用该方法的提交结果如下:可见有些测试用例耗时较长,本道题的时间限制如果在150ms的话,有些测试用例就不能够通过了。 接下来考虑如何进行改进:可以使用双指针的方法,使得时间复杂度下降到(m+n)/2。当使用cin进行输入时,对性能的提升并不明显,使用scanf进行输入时有较好的性能,放弃cin,使用scanf吧。 改进后的提交结果为: 提交的代码如下:

#include<iostream> #include <cstdio> #include<vector> #include<algorithm> using namespace std; int main() { int m, n; cin >> m; vector<int> arr1; for (int i = 0;i < m;i++) { int temp; scanf("%d",&temp); arr1.push_back(temp); } cin >> n; vector<int> arr2; for (int i = 0;i < n;i++) { int temp; scanf("%d",&temp); arr2.push_back(temp); } int output = 0; int len = (m + n - 1) / 2, i = 0, j = 0; if (m > n) swap(arr1, arr2); while (len >= 0 && i < arr1.size()) { if (arr1[i] < arr2[j]) { output = arr1[i]; i++; } else { output = arr2[j]; j++; } len--; } while (len >= 0) { output = arr2[j]; j++; len--; } cout << output; }

本次提交后累计得分为784分。

最新回复(0)