93 求陣列,左邊的數都小於等於它,右邊的數都大於等於它
阿新 • • 發佈:2019-01-24
93.在一個 int 數組裡查詢這樣的數,它大於等於左側所有數,小於等於右側所有數。直觀
想法是用兩個陣列 a、b。a[i]、b[i]分別儲存從前到 i 的最大的數和從後到 i 的最小的數,一
個解答:這需要兩次遍歷,然後再遍歷一次原陣列,將所有 data[i]>=a[i-1]&&data[i]<=b[i]
的 data[i]找出即可。給出這個解答後,面試官有要求只能用一個輔助陣列,且要求少遍歷一
想法是用兩個陣列 a、b。a[i]、b[i]分別儲存從前到 i 的最大的數和從後到 i 的最小的數,一
個解答:這需要兩次遍歷,然後再遍歷一次原陣列,將所有 data[i]>=a[i-1]&&data[i]<=b[i]
的 data[i]找出即可。給出這個解答後,面試官有要求只能用一個輔助陣列,且要求少遍歷一
次。
/* 93.在一個 int 數組裡查詢這樣的數,它大於等於左側所有數,小於等於右側所有數。直觀 想法是用兩個陣列 a、b。a[i]、b[i]分別儲存從前到i的最大的數和從後到 i 的最小的數,一 個解答:這需要兩次遍歷,然後再遍歷一次原陣列,將所有 data[i]>=a[i-1]&&data[i]<=b[i] 的 data[i]找出即可。給出這個解答後,面試官有要求只能用一個輔助陣列,且要求少遍歷一 次。 同81題: 利用一個輔助陣列,記錄每一個元素右側的最小值是多少 rightMin 在順序遍歷 儲存當前最大值 即左邊最大的 那麼若兩者相等 則滿足 當前值大於左邊所有 又是右邊最小 小於右邊所有 */ #include<iostream> using namespace std; #define max(a,b) a>b?a:b #define min(a,b) a<b?a:b void solve(int data[],int len) { int* rightMin=new int[len]; int left_max; //輸出原陣列 for(int i=0;i<len;i++) cout<<data[i]<<" "; cout<<endl; rightMin[len-1]=data[len-1]; for (int i=len-2;i>=0;i--)//從右向左 rightMin[i]=min(data[i],rightMin[i+1]); left_max=0; for (int i=0;i<len;i++) { left_max=max(data[i],left_max); if(left_max==rightMin[i]) cout<<data[i]<<":大於陣列左邊數,小於陣列右邊數"<<endl; } } int main() { int data[10]={1,3,2,4,6,7,5,9,11,10}; int data2[7] ={7,10,2,6,19,22,32}; solve(data2,7); solve(data,10); }