解题过程的小记录,如有错误欢迎指出。
难度:二星(用two pointers的合并算法并不难,merge的模板要背一下,不懂通过率为何这么低)
题目分析
给出两个递增序列,求合并后(依旧要求递增)的中位数
注意点
- 题目涉及的数据量大,改用scanf进行输入
我的解题过程
思路
- 找出中位数所在的位置(因为合并后是递增数列,中位数所在的位置和两个数串长度的和是否奇数有关)
- 利用two pointers指向两个数列的开始,取小的排入合并数列,一直到两个数列都被排入完毕,中途要是合并数列的下标为所要求的中位数的下标,则返回对应的数进行输出
bug
无,简单题
代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<long long> num;
int mergebase(int pos,int L1, int R1, int L2, int R2) {
vector<long long> temp = num;
int index = 0;
int i = L1, j = L2;
while (i < R1&&j < R2) {
if (num[i] < num[j]) temp[index] = num[i++];
else temp[index] = num[j++];
if (index == pos) return temp[index];
index++;
}
while (i < R1) {
temp[index] = num[i++];
if (index == pos) return temp[index];
index++;
}
while (j < R2) {
temp[index] = num[j++];
if (index == pos) return temp[index];
index++;
}
}
int main()
{
int n1, n2;
cin >> n1;
long long t;
for (int i = 0; i < n1; i++) {
scanf("%lld", &t);
num.push_back(t);
}
cin >> n2;
for (int i = 0; i < n2; i++) {
scanf("%lld", &t);
num.push_back(t);
}
int pos;
if (1.0*(n1 + n2) / 2 != (n1 + n2) / 2) {
pos = (n1 + n2) / 2;
}
else {
pos = (n1 + n2) / 2 - 1;
}
cout << mergebase(pos, 0, n1, n1, n1 + n2);
return 0;
}
dalao的代码
全部代码因版权原因不放出来,大家可以自行去柳神博客购买或者参考晴神的上机笔记~
借鉴点
- 两个数的向下取整可以利用(N+M-1)/2公式(只对应序列下标从0开始)
- 可以不进行临时数组的输入,只要i和j对应有变化即可,因为最后要的只是下标对应的数而已
二星难度算法题解析
本文解析了一道二星难度的算法题,旨在寻找两个递增序列合并后的中位数。通过twopointers方法定位中位数位置,并利用merge算法实现。代码使用C++编写,包括了完整的解题思路和实现细节。
392

被折叠的 条评论
为什么被折叠?



