0
点赞
收藏
分享

微信扫一扫

A1029 Median (25 分| two pointers| 排序,附详细注释,逻辑分析)


写在前面

  • 实现思路
  • ​vector<int> vn(n);​​封装序列1
  • ​vn.resize(n+m);​​封装序列2
  • ​sort​​排序,去中间下标对应值
  • 10分钟a题目

测试用例

input:
4 11 12 13 14
5 9 10 15 16 17
output:
13

input:
3 1 1 1
3 2 2 2
output:
1

ac代码

#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
int n,m, tmp, cnt = 0;
cin >> n;
vector<int> vn(n);
for(int i=0; i<n; i++) scanf("%d", &vn[i]);
cin >> m;
vn.resize(n+m);
for(int i=n; i<m+n; i++) scanf("%d", &vn[i]);
sort(vn.begin(), vn.end());

printf("%d", vn[(m+n+1)/2-1]);
return 0;
}

学习代码

  • 思路分析
  • 开1个数组,在线处理第1个数组。
  • 从小到大数找到(n + m + 1) / 2位置对应哪个组,输出具体值
  • cnt计数,第1个数组设置指针i,每次从第2个数组中读⼊tmp,检查第1个数组中前几个数是否比tmp小
  • 小,cnt+1并判断是否为中间数,是就输出
  • 数完比temp小的数未到中间数,cnt+1。检查tmp是不是中间数,是就输出
  • 循环上述过程。如果第2个数组读取完,还未到中间数,说明中间数在剩下1个数组中,在剩下的数组中数到中间数位置即可

#include <iostream>
using namespace std;
int k[200005];
int main()
{
int n, m, tmp, cnt = 0;
cin >> n;
for (int i = 1; i <= n; i++)
scanf("%d", &k[i]);
k[n + 1] = 0x7fffffff;
cin >> m;
int midpos = (n + m + 1) / 2, i = 1;
for (int j = 1; j <= m; j++)
{
scanf("%d", &tmp);
while (k[i] < tmp)
{
cnt++;
if (cnt == midpos)
{
cout << k[i];
return 0;
}
i++;
}
cnt++;
if (cnt == midpos)
{
cout << tmp;
return 0;
}
}
while (i <= n)
{
cnt++;
if (cnt == midpos)
{
cout << k[i];
break;
}
i++;
}
return 0;
}

知识点小结

// 跳出1层循环
break;

  • vector数组合并

#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
vector<int>vec1(2),vec2(2),vec3,vec4(5);
vec1[0]=1;
vec1[1]=2;
vec2[0]=11;
vec2[1]=12;
vec3.insert(vec3.begin(),vec1.begin(),vec1.end());
vec3.insert(vec3.begin(),vec2.begin(),vec2.end());
for(auto it=vec3.begin(); it!=vec3.end(); it++)
{
cout << *it << " ";
}
cout << endl;

merge(vec1.begin(),vec1.end(),vec2.begin(),vec2.end(),vec4.begin());
for(auto it=vec4.begin(); it!=vec4.end(); it++)
{
cout << *it << " ";
}
return 0;
}


举报

相关推荐

a1029 Median(vector的使用)

0 条评论