日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

int数组,找小于右边所有数,大于左边所有数的数

發布時間:2025/7/25 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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数组,找小于右边所有数,大于左边所有数的数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。