1、题目描述:
2、题解:
方法:单调栈
思路:
stack为单调栈,保存的下标(从栈底到栈顶的元素所对应的nums的值单调不增,也可以理解为下降的)
遍历一遍数组的长度的两倍:
循环处理:stack不为空 && 当前的nums中的值比栈顶元素所对应的nums值大
就让结果数组栈顶元素所对应的位置的值 等于 此时的nums中的值
stack出栈
下标取余放入stack中
返回res
Python实现:
class Solution:
def nextGreaterElements(self, nums: List[int]) -> List[int]:
#单调栈
if not nums:
return []
n = len(nums)
stack = []
res = [-1] * n
for i in range(len(nums) * 2):
while stack and nums[i%n] > nums[stack[-1]]:
res[stack.pop()] = nums[i % n]
stack.append(i%n)
return res
C++实现:
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
//单调栈
int n = nums.size();
stack<int> st;
vector<int> res(n,-1);
for (int i=0;i < 2*n;i++){
while (!st.empty() && nums[i % n] > nums[st.top()]){
res[st.top()] = nums[i % n];
st.pop();
}
st.push(i % n);
}
return res;
}
};
当然,还可以从后往前遍历:
栈是单调不降的(也可以认为是上升的),循环处理的时候,遇到比当前nums的值小的出栈
C++实现:
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
//单调栈
int n = nums.size();
stack<int> stack;
vector<int> res(n);
for (int i = 2*n-1;i >= 0;i--){
while (!stack.empty() && nums[i % n] >= stack.top()){
stack.pop();
}
res[i % n] = stack.empty() ? -1 :stack.top();
stack.push(nums[i % n]);
}
return res;
}
};
单调栈:力扣496. 下一个更大元素 I
单调栈:力扣739. 每日温度
3、复杂度分析:
时间复杂度:O(N)
空间复杂度:O(N)