题目链接:. - 力扣(LeetCode)
这道题目可以用暴力的办法写出来,只需要在数组nums后面再将元素粘到后面,在对数组里的每一个元素都进行分析就可以了,这里我们来说另外一种解法——单调栈
我们这里先定义一个栈st,因为我要求的是每一个元素的下一个比它大的元素,注意这里的两个词——”下一个“,”更大的“,下一个意味着我们还没有遍历到,比他大这里我们就考虑将我们的栈设定成一个单调递减的栈,为什么呢,每次遍历的时候,只要我当前遍历的这个元素大于我的栈顶元素,这说明什么,这是不是就意味着,这个元素,就是我们栈顶元素的下一个更大的元素,所以只要遇到比栈顶元素大的,就将该元素赋值到我们结果数组中栈顶元素所对应的位置,里我们不是用if条件判断,而是while循环不断地弹出栈顶元素,这样不断地递归的判断,注意这里有一个细节就是我们一开始是将结果数组里的所有的元素都赋初值为-1,因为题目中说了,如果说找不到比它更大的,就加个数组的值赋值为-1,还有就是这里我们的for循环的i的终止条件是i<2*n.因为他这里要求的是循环数组,所以吗还需要i%n的操作来避免数组下标的越界,来看具体的代码的实现
class Solution {
public:vector<int> nextGreaterElements(vector<int>& nums) {int n = nums.size();vector<int> ans(n,-1);stack<int> st;for (int i = 0; i < 2 * n; i++) {while (st.empty() == false && nums[st.top()] < nums[i%n]) {ans[st.top()] = nums[i%n];st.pop();}if (i < n) st.push(i);}return ans;}
};
首先就是遍历数组,在栈不为空时,这里还需要注意的一点是我栈储存的是数组下标的索引,当我的栈顶的元素小于我的当前遍历的元素的时候,就代表这个元素就是我要找的栈顶的目标元素,将该元素加入到结果数组中,然后将栈顶的元素弹出,while不断进行循环,直到元素不大于栈顶的元素的时候,此时就将该元素加入到栈里,当i<n时才加入元素到栈里,2n只是因为题目说是循环数组,这样方便处理,最后在for循环结束的时候,返回数组result即可。
以上就是我对这道题目的想法与理解!