给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。
示例 1:
输入: [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数;
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。
注意: 输入数组的长度不会超过 10000。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-greater-element-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
解决这道题目首先要弄明白如何存储下一个最大值的问题,暴力遍历是不可取的,这样很可能超时(虽然没试过),设想一下这样的情形,一串递减的数字,下一个数比这串数组的最大值还要大,那么该数是这串递减数字集合的最大值,那么一次遍历就能解决所有问题,非常方便。如何实现呢?这就不得不说栈了,我们用栈去存储这些数字的下标,直到遇到更大的数才弹栈,这样可以一直弹栈直到没有数字小于遍历到的数;由于是循环数组,所以要遍历两次数组防止后面的元素没有下一个最大值,代码如下:
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
int len = nums.size();
// 注意这里的-1是专门为最大值准备的
vector<int> res(len, -1);
stack<int> s;
// 循环两遍,防止后面的元素没有下一个最大值
for(int i = 0; i < 2 * len - 1; i ++) {
// 如果栈不为空,且栈顶所表示的位置的值小于当前遍历的值
while(!s.empty() && nums[s.top()] < nums[i % len]) {
res[s.top()] = nums[i % len];
s.pop();
}
// 将当前位置输入到栈中
s.push(i % len);
}
return res;
}
};
/*作者:heroding
链接:https://leetcode-cn.com/problems/next-greater-element-ii/solution/csi-lu-xiang-jie-by-heroding-4bv0/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/
本文介绍了一种使用栈解决循环数组中寻找下一个更大元素的方法。通过遍历两次数组确保所有元素都能找到对应的下一个更大值,适用于LeetCode上的相关题目。
1万+

被折叠的 条评论
为什么被折叠?



