2018騰訊內部調崗面試試題3——找出陣列中比左邊大比右邊的小的元素
阿新 • • 發佈:2019-02-14
題目:以時間複雜度O(n)從長度為n的陣列中找出同時滿足下面兩個條件的所有元素:
(1)該元素比放在它前面的所有元素都大;
(2)該元素比放在它後面的所有元素都小。
分析:面試官給的上面冗餘的描述,其實一句話即可說明,即“以時間複雜度O(n)從長度為n的陣列中找出所有比左邊大比右邊的小的元素”。一開始求出所有的右邊最小陣列rightMin,然後從左往右判斷當前元素是否是左邊最大,如果是則和其相鄰的右邊最小數(存放於最小陣列rightMin)比較,如果小於,則找到了滿足條件的元素。注意:左右兩邊第一個數不滿足條件。
實現:
#include <iostream>
using namespace std;
void g_fPrintThePivotElements(int data[],int len)
{
//從右往左,尋找每個位置及其之後的最小數
int* rightMin = new int[len];
int r_min = data[len-1];
for (int i = len-1;i>=0;--i)
{
if(data[i]<r_min)
r_min = data[i];
rightMin[i] = r_min;
}
//從左往右,尋找比左邊大且比右邊小的數
int l_max = data[0];
for (int i=0;i<len-1;++i)
{
if(data[i]>l_max)
{
l_max = data[i];
if(data[i]<rightMin[i+1])
cout<<data[i]<<endl;
}
}
}
int main()
{
int dTestArray[]={1,8,6,9,10,15,12,20};
g_fPrintThePivotElements(dTestArray,sizeof (dTestArray)/sizeof(dTestArray[0]));
}
輸出:
9
10