[面试题]在一个无序数组中,找到数字满足 该数字大于下标小于该数字的任何数 和 小于下标大于该数字的任何数

即找出数组中左边比该数字小 右边比该数字大的数

思想:

遍历一次数组,动态记录访问该下标时的最大值(正序)

同理,可以记录访问该下标时的最小值(倒序)

得出结论:两个数组相同的时候满足题目所给条件

时间复杂度: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;
}
posted @ 2024-12-05 13:50  Kotori_Kawaii  阅读(3)  评论(0编辑  收藏  举报