📅  最后修改于: 2023-12-03 15:09:29.965000             🧑  作者: Mango
在编程中,我们经常需要寻找数组中每个元素的 下一个更大元素,也就是数组中当前元素后面第一个比它大的元素。这个问题可以使用单调栈(Monotonic Stack)解决。
单调栈是一种特殊的栈数据结构,当我们向栈中添加元素时,会按照一定的顺序排列,比如从小到大或从大到小。这种栈结构在解决一些连续性问题时非常有用。
我们可以使用单调栈来寻找数组中每个元素的下一个更大元素。从左到右遍历数组,将每个元素加入到单调栈中。如果当前元素小于栈顶元素,那么将当前元素加入到栈中继续遍历。如果当前元素大于栈顶元素,那么弹出栈顶元素,并把当前元素作为弹出元素的下一个更大元素。将弹出元素和它的下一个更大元素保存在一个 unordered_map
中。最后,栈中剩余的元素都没有下一个更大元素。
下面是一个简单的 C++ 程序,实现了上面的解题思路:
#include <iostream>
#include <stack>
#include <unordered_map>
#include <vector>
using namespace std;
vector<int> nextGreater(vector<int>& nums) {
stack<int> s;
unordered_map<int, int> m;
vector<int> res(nums.size(), -1);
for (int i = 0; i < nums.size(); i++) {
while (!s.empty() && nums[i] > nums[s.top()]) {
res[s.top()] = nums[i];
m[nums[s.top()]] = nums[i];
s.pop();
}
s.push(i);
}
return res;
}
int main() {
vector<int> nums = {2, 7, 4, 3, 5};
vector<int> res = nextGreater(nums);
for (int i = 0; i < res.size(); i++) {
cout << nums[i] << " -> " << res[i] << endl;
}
return 0;
}
程序中的 nextGreater
函数用于寻找下一个更大元素。它接收一个 vector<int>
类型的参数 nums
,表示需要查找的数组。函数创建了一个单调栈和一个 unordered_map
,用于保存每个元素的下一个更大元素。函数最终返回一个 vector<int>
,表示每个元素的下一个更大元素。
主函数调用 nextGreater
函数,并输出每个元素的下一个更大元素。对于例子 {2, 7, 4, 3, 5},输出结果如下:
2 -> 7
7 -> -1
4 -> 5
3 -> 5
5 -> -1
本文介绍了如何使用单调栈寻找数组中每个元素的下一个更大元素。这个问题在编程中非常常见,而单调栈是解决这个问题的常用数据结构。希望能对读者有所帮助。