📜  寻找下一个更大元素的 C++ 程序(1)

📅  最后修改于: 2023-12-03 15:09:29.965000             🧑  作者: Mango

寻找下一个更大元素的 C++ 程序

在编程中,我们经常需要寻找数组中每个元素的 下一个更大元素,也就是数组中当前元素后面第一个比它大的元素。这个问题可以使用单调栈(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
总结

本文介绍了如何使用单调栈寻找数组中每个元素的下一个更大元素。这个问题在编程中非常常见,而单调栈是解决这个问题的常用数据结构。希望能对读者有所帮助。