题目描述
知识点
排序、思维
实现
码前思考
- 首先,肯定不能每次都进行排序,肯定会超时!!!所以需要寻找线性时间复杂度的方法;
- 首先,从左到右进行遍历,同时记录下每个数左边的最大值,判断其是否比它大;
- 其次,从右到左进行遍历,同时记录下每个数右边的最小值,判断其是否比它小;
- 满足上述两种情况的数就是
pivot
代码实现
//不存在相同数字
//从左到右表示
//从右到左来一遍
#include "bits/stdc++.h"
using namespace std;
const int maxn = 1e5+10;
int n;
int data[maxn];
bool l2r[maxn];
bool r2l[maxn];
vector<int> res;
int main(){
scanf("%d",&n);
fill(l2r,l2r+maxn,false);
fill(r2l,r2l+maxn,false);
for(int i=0;i<n;i++){
scanf("%d",&data[i]);
}
int max = INT_MIN;
//从0号位开始遍历
for(int i=0;i<n;i++){
if(data[i]>max){
l2r[i] = true;
}
//更新
if(data[i]>max){
max = data[i];
}
}
int min = data[n-1];
r2l[n-1]=true;
for(int i=n-2;i>=0;i--){
if(data[i]<min){
r2l[i] = true;
}
//更新
if(data[i]<min){
min = data[i];
}
}
//找到最小字符
for(int i=0;i<n;i++){
if(l2r[i]&&r2l[i]){
res.push_back(data[i]);
}
}
printf("%d\n",res.size());
//排序呀!
sort(res.begin(),res.end());
for(int i=0;i<res.size();i++){
printf("%d",res[i]);
if(i!=res.size()-1){
printf(" ");
}
}
printf("\n");
return 0;
}
码后反思
- 最令人窒息的就是当
pivot
是0时,要输出两行换行!!!我之前一直卡在这过不了! - 柳神的思路貌似没我的简单,不看她的啦。。。