单调栈
单调栈是一种特殊的栈结构,栈内元素保持单调递增或者单调递减的特性。在使用单调栈处理问题时,
当有新元素入栈时,会根据单调性的要求对栈内元素进行调整,通常是将不符合单调性的元素出栈,
直到满足单调条件后再将新元素入栈。
单调栈主要用于解决一些与数组中元素的左右边界、最近较大值或最近较小值相关的问题,时间复杂度通常为
O(n),因为每个元素最多进栈和出栈一次。
单调栈的分类
1. 单调递增栈: 栈内元素从栈底到栈顶是单调递增的,即栈顶元素是栈内所有元素中的最大值。
当新元素入栈时,如果新元素小于栈顶元素,则将栈顶元素出栈,
直到新元素大于等于栈顶元素或者栈为空,然后将新元素入栈。
2. 单调递减栈: 栈内元素从栈底到栈顶是单调递减的,即栈顶元素是栈内所有元素中的最小值。
当新元素入栈时,如果新元素大于栈顶元素,则将栈顶元素出栈,
直到新元素小于等于栈顶元素或者栈为空,然后将新元素入栈。
1 // 实例:求数组中每个元素右侧第一个比它大的元素 2 3 #include <iostream> 4 #include <vector> 5 #include <stack> 6 7 // 函数用于找出数组中每个元素右侧第一个比它大的元素 8 std::vector<int> nextGreaterElement(const std::vector<int>& nums) { 9 int n = nums.size(); 10 std::vector<int> result(n, -1); // 初始化结果数组,默认值为 -1,表示没有找到更大的元素 11 std::stack<int> st; // 定义一个栈,用于存储数组元素的索引 12 13 for (int i = 0; i < n; ++i) { 14 // 当栈不为空且当前元素大于栈顶元素时 15 while (!st.empty() && nums[i] > nums[st.top()]) { 16 int topIndex = st.top(); 17 st.pop(); 18 result[topIndex] = nums[i]; // 更新栈顶元素对应的结果为当前元素 19 } 20 st.push(i); // 将当前元素的索引入栈 21 } 22 23 return result; 24 } 25 26 int main() { 27 std::vector<int> nums = {4, 1, 2, 5}; 28 std::vector<int> result = nextGreaterElement(nums); 29 30 // 输出结果 31 for (int num : result) { 32 std::cout << num << " "; 33 } 34 std::cout << std::endl; 35 36 return 0; 37 }
浙公网安备 33010602011771号