By Jalan
知识工具需求
数学
数据结构和算法
语言
题干
快速排序有分类这个步骤,就是选一个数把比他小的放一边大的放另一边.
现在看看有没有这些数
输入条件
N个数<=10^5
每个数不会大于10^9
输出条件
输出左边都比它小右边都比它大的数的个数和数,末尾没空格.
坑点
这题有一个地方我真的没懂,输出完还要打印个换行,要不会有一个格式错误.
测试点2格式错误.(空数据打印0\n\n)
我真的很建议pat要么把测试用例给全,要么就在题干里明说,这我也不知道你要考哪里,莫非是考我能不能嗯猜?
例子
例1
输入
5
1 3 2 4 5
输出
3
1 4 5
题解
第一次
思路
- 输入
- 遍历2次数组,维持一个front和tile数组,里面分别是从前到当前数里的最大数和从后到当前数里的最小数.
- 再遍历一次数组,和最大数/最小数对比.符合条件加入数组result
- 排序result,输出
预期时间复杂度
nlogn
编写用时
15分钟
代码
CPP
#include <stdio.h>
#include<vector>
#include<cstdio>
#include<algorithm>
using namespace std;
int main(int argc, char const *argv[])
{
//1
int N;
scanf("%d",&N);
vector<int> list(N);
for (int i = 0; i < N; i++)
{
scanf("%d",&list[i]);
}
//2
vector<int> front(N);
vector<int> tile(N);
int max=0;
for (int i = 0; i < N; i++)
{
front[i]=max;
if (list[i]>max)
{
max=list[i];
}
}
int min=0x7fffffff;
for (int i = N-1; i >=0; i--)
{
tile[i]=min;
if (list[i]<min)
{
min=list[i];
}
}
//3
vector<int> result;
for (int i = 0; i < N; i++)
{
if (list[i]>front[i]&&list[i]<tile[i])
{
result.push_back(list[i]);
}
}
//4
sort(result.begin(),result.end());
if ((int)result.size()==0)
{
printf("0\n\n");
}else
{
printf("%d\n", (int)result.size());
for (int i = 0; i < (int)result.size(); i++)
{
printf("%d", result[i]);
if (i != result.size() - 1)
{
printf(" ");
}
}
printf("\n");
}
return 0;
}
运行用时
结尾
看在我写了这么多注释的份上可以给我点个赞嘛,求求惹=]砰砰砰,给我加点写下去的油呀@.@
也欢迎关注我的CSDN账号呀,接下来两个月我应该会按这个格式更新所有的PTA甲级题目
**开心code每一天**