[面试题]在一个无序数组中,找到数字满足 该数字大于下标小于该数字的任何数 和 小于下标大于该数字的任何数
即找出数组中左边比该数字小 右边比该数字大的数
思想:
遍历一次数组,动态记录访问该下标时的最大值(正序)
同理,可以记录访问该下标时的最小值(倒序)
得出结论:两个数组相同的时候满足题目所给条件
时间复杂度:O(sN) s为常数级
若有数据可以hack掉,请在评论区告诉我T T
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<cstring>
using namespace std;
int main(){
vector<int>arr={5,3,7,13,9,15,19};
// int n;
// while(scanf("%d",&n)!=EOF){
// arr.push_back(n);
// }
int m=arr.size();
int arrmax[m],arrmin[m];
arrmax[0]=arr[0];
arrmin[m-1]=arr[m-1];
for(int i=0;i<m;i++){
if(i-1>=0)arrmax[i]=max(arrmax[i-1],arr[i]);//5 5 7 13 13 15 19
if(m-i-2>=0)arrmin[m-i-2]=min(arrmin[m-i-1],arr[m-i-2]);//3 3 7 9 9 15 19
}
for(int i=0;i<m;i++){
if(arrmax[i]==arrmin[i]){
cout<<arrmax[i]<<" ";
}
}
return 0;
}