C 單調棧使用總結

2021-10-10 03:18:23 字數 2648 閱讀 4084

相關leetcode題目:

496. 下乙個更大元素 i

503. 下乙個更大元素 ii

556. 下乙個更大元素 iii

31. 下乙個排列

739. 每日溫度

這類題最終要求的結果都是比當前元素更大的下乙個元素的位置

求解思路:

就比如上學做操時的排隊,如果你向後望去一馬平川,說明後面沒有比你更高的人,如果後面有高個擋住了你的視線,那他就是你後面第乙個比你高的人。將排隊的人還原成乙個陣列,同時維持乙個遞增棧,從後向前遍歷陣列,當棧頂元素小於當前元素,則棧頂彈出,始終保證棧內元素遞增。

**模板:核心**為while迴圈(將棧內所有小於當前元素的值都pop()出去)

vector<

int> nums;

vector<

int>

ans(nums.

size()

,0);

stack<

int> skt;

for(

int i = nums.

size()

-1; i >=0;

--i)

ans[i]

= skt.

empty()

?-1: nums[skt.

top()]

; skt.

push

(i);

}

下乙個更大元素 i

vector<

int>

nextgreaterelement

(vector<

int>

& nums1, vector<

int>

& nums2)

mp[nums2[i]

]= skt.

empty()

?-1: skt.

top();

skt.

push

(nums2[i]);

} vector<

int> ans;

for(

auto i : nums1)

return ans;

}

下乙個更大元素 ii

這題需要解決的問題是迴圈搜尋陣列,可行的方法是將陣列擴大兩倍,變相的實現迴圈遍歷,然後將下標與陣列大小取模,得到的下標就是有效下標

vector<

int>

nextgreaterelements

(vector<

int>

& nums)

doublevec[i]

= skt.

empty()

?-1: skt.

top();

skt.

push

(nums[i%sz]);

} vector<

int> ans;

for(

int i =

0; i < sz;

++i)

return ans;

}

下乙個更大元素 iii

int

nextgreaterelement

(int n)

if(end !=0)

skt.

push

(i);}if

(end ==0)

else

long

long ans =

stoll

(str);if

(ans > int_max)

return ans;

}

每日溫度

vector<

int>

dailytemperatures

(vector<

int>

& t)

stack<

int> skt;

vector<

int>

ans(t.

size()

,0);

for(

int i = t.

size()

-1; i >=0;

--i)

ans[i]

= skt.

empty()

?0: skt.

top(

)- i;

skt.

push

(i);

}return ans;

}

下乙個排列

void

nextpermutation

(vector<

int>

& nums)

stack<

int> skt;

int begin =0;

int end =0;

for(

int i = nums.

size()

-1; i >=0;

--i)

if(end !=0)

skt.

push

(i);}if

(begin ==0)

else

}

單調棧總結

單調棧一般可以對於給定的數列,求每個值v在他左右的區間 l,r 是最小值 最大值 通過單調遞增 遞減 棧來實現。1.用處 求每個值v是哪個區間 l,r 的最小 大 值,一般還會和區間 l,r 有關係 poj2796 feel good 給定數列 要求一 個區間內最小值乘區間和,的最大值。poj255...

單調佇列與單調棧總結

ref 單調棧解決的是以某個值為最小 最大 值的最大區間,實現方法是 求最小值 最大值 的最大區間,維護乙個遞增 遞減 的棧,當遇到乙個比棧頂小的值的時候開始彈棧,彈棧停止的位置到這個值的區間即為此值左邊的最大區間 同時,當乙個值被彈掉的時候也就意味著比它更小 更大 的值來了,也可以計算被彈掉的值得...

單調棧 佇列總結

51nod 1102 面積最大的矩形 有乙個正整數的陣列,化為直方圖,求此直方圖包含的最大矩形面積。法一 以每個柱子為高,預處理出每個點能夠向兩邊延伸的距離,左找到第乙個比當前點高度小的下標記為i,向右找到第乙個比當前點高度小的下標記為j,那麼此時以這點高度的最大值是f i j i 1 然後用for...