1. 程式人生 > >2018騰訊內部調崗面試試題3——找出陣列中比左邊大比右邊的小的元素

2018騰訊內部調崗面試試題3——找出陣列中比左邊大比右邊的小的元素

題目:以時間複雜度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