int数组,找小于右边所有数,大于左边所有数的数
一個int數組,里面數據無任何限制,要求求出所有這樣的數a[i],其左邊的數都小于等于它,右邊的數都大于等于它。能否只用一個額外數組和少量其它空間實現。
老早就想把這道題目寫了,一直沒寫;N天不碰算法,思維完全鈍了。
網絡上的解法思路(見附),都是一直的。那如果再說一模一樣的就沒太大意思,除了記錄題目和增加網絡冗余度之外;
其實這里說的和網絡大部分也是一樣的,但是,解釋稍微轉變,希望讓你這透徹的看懂它。
經一番琢磨,題目很網上的解釋包含了一個很簡單的思想,“單調棧”,哈哈,是不是很熟悉呢?
如果想不起來,就回去看看其他博文中的題目吧:單調棧:柱形統計圖中最大面積(POJ 2559)?誰看得最大?(使用了單調棧的思想)
好了這里,當你理解了單調棧了,可以開始解題了;
7, 10, 2, 6, 19, 22, 32
如果只遍歷一遍,我們很容易可以知道它是否比它前面的所有數要大(記錄其前面遍歷的最大元素),例如,這時遍歷到19了,之前先記錄前面最大的(這是可以做到的),為10。因為19>10 所有19符合其中大于等于其前面所有元素的條件。這時同時也記錄最大元素為19,接著檢測下一個元素。
好,這里我們完成了檢測“左邊的數都小于等于它”的條件,麻煩就在于“右邊的數都大于等于它”;這時候“單調棧”的思想就可以很好的解決這個問題。因為它保證了每次壓進棧里的元素是單調遞增的。如果不是遞增,把之前棧內的元素出棧(這些元素已經不符合“右邊的數都大于等于它”了),保持單調棧的特性。
所有把符合上述的元素放在單調棧中就OK了。
OK,簡單吧。自認為比一些網絡上了各種抄的復雜解釋來得簡單,當然也有人會認為其他的要簡單,whatever,反正我們都理解了。
1 void func37(int a[], int n) 2 { 3 assert(a && n>0); 4 5 int pre_max = -INT_MAX; //可使用棧的特性剔除這個變量 6 int i; 7 stack<int> st; 8 9 for (i=0; i<n; i++) 10 { 11 if (a[i] >= pre_max) 12 { 13 pre_max = a[i]; 14 15 while(!st.empty() && a[st.top()] > a[i]) //保存棧的特性 16 { 17 st.pop(); 18 } 19 20 st.push(i); 21 } 22 else 23 { 24 while(!st.empty() && a[st.top()] > a[i]) //保存棧的特性 25 { 26 st.pop(); 27 } 28 continue; 29 } 30 } 31 32 if (st.empty()) 33 { 34 cout<<"no one is appropriated"<<endl; 35 return; 36 } 37 while(!st.empty()) 38 { 39 cout<<a[st.top()]<<" "; 40 st.pop(); 41 } 42 cout<<endl; 43 }?
附:
最原始的方法是檢查每一個數 array[i] ,看是否左邊的數都小于等于它,右邊的數都大于等于它。這樣做的話,要找出所有這樣的數,時間復雜度為O(N^2)。
其實可以有更簡單的方法,我們使用額外數組,比如rightMin[],來幫我們記錄原始數組array[i]右邊(包括自己)的最小值。假如原始數組為: array[] = {7, 10, 2, 6, 19, 22, 32}, 那么rightMin[] = {2, 2, 2, 6, 19, 22, 32}. 也就是說,7右邊的最小值為2, 2右邊的最小值也是2。
有了這樣一個額外數組,當我們從頭開始遍歷原始數組時,我們保存一個當前最大值 max, 如果當前最大值剛好等于rightMin[i], 那么這個最大值一定滿足條件。還是剛才的例子。
第一個值是7,最大值也是7,因為7 不等于 2, 繼續,
第二個值是10,最大值變成了10,但是10也不等于2,繼續,
第三個值是2,最大值是10,但是10也不等于2,繼續,
第四個值是6,最大值是10,但是10不等于6,繼續,
第五個值是19,最大值變成了19,而且19也等于當前rightMin[4] = 19, 所以,滿足條件。
如此繼續下去,后面的幾個都滿足。
畢
?
轉載于:https://www.cnblogs.com/legendmaner/archive/2013/05/20/3079120.html
總結
以上是生活随笔為你收集整理的int数组,找小于右边所有数,大于左边所有数的数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 驰骋工作流引擎Silverlight版本
- 下一篇: Serializable接口初探