题目描述
原题链接:503. 下一个更大元素
解题思路
本题与 每日温度 核心思路相同,区别在于本题的数组变为循环数组,第一次遍历到前n个未找到更大数的数,还有后续循环会变会遍历到的可能情况。为考虑循环的影响,这里就有两个思路:一个是构造出一个数组二倍的数组,进行遍历。另一个是遍历两轮。
本题代码构建的重点就是维持好映射关系。
(1)思路一:构建新数组
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
int n = nums.size();
if(n == 1) return {-1};
// 在nums后面再添加一遍
for(int i = 0; i < n; i++) nums.push_back(nums[i]);
vector<int> res(n, -1);
stack<int> st;
st.push(0);
for(int i = 1; i < 2 * n; i++) {
// 弹出条件不变,映射res时,取除n的余数
while(!st.empty() && nums[st.top()] < nums[i]) {
res[st.top() % n] = nums[i];
st.pop();
}
st.push(i);
}
return res;
}
};
Python
class Solution:
def nextGreaterElements(self, nums: List[int]) -> List[int]:
n = len(nums)
nums = nums + nums
stack = []
res = [-1] * n
for i in range(2 * n):
while stack and nums[stack[-1]] < nums[i]:
res[stack[-1] % n] = nums[i]
stack.pop()
stack.append(i)
return res
(2)思路二:循环二次遍历
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
int n = nums.size();
if(n == 1) return {-1};
vector<int> res(n, -1);
stack<int> st;
st.push(0);
// 二次循环遍历,将i取余n后映射到正确对应位置
for(int i = 1; i < 2 * n; i++) {
while(!st.empty() && nums[st.top()] < nums[i % n]) {
res[st.top()] = nums[i % n];
st.pop();
}
st.push(i % n);
}
return res;
}
};
参考文章:503. 下一个更大元素 II