- 一個點前後的點都可以是它的解,同一個點相等肯定不會入棧。
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
vector<pair<int,int>>stack;
vector<int>res;
for(int i=nums.size()-1;i>=0;i--){
stack.push_back(make_pair(nums[i],i));
}
for(int i=nums.size()-1;i>=0;i--){
// i [0,len-1]
while(!stack.empty()&&stack.back().first<=nums[i]){
stack.pop_back();
}
// 可能出現遍歷完後面倍增數組的情況
if(stack.empty()){
res.push_back(-1);
}
else{
res.push_back(stack.back().first);
}
stack.push_back(make_pair(nums[i],i));
}
reverse(res.begin(),res.end());
return res;
}
};
或者簡化一下:直接暴力空的stack從後往前遍歷,res取i%n,相當於先考慮一輪後序遍歷,再進行一輪後序遍歷,相當於第一輪是考慮後邊的更大值,第二輪是解決後面沒有更大值的情況下考慮前面的情況。如果前面後面都有更大值也不怕,因爲第二輪遍歷會用後面的最大值覆蓋掉前面的最大值的解。
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
int n = nums.size();
vector<int> res(n);
stack<int> s;
// 假裝這個數組長度翻倍了
for (int i = 2 * n - 1; i >= 0; i--) {
// 索引要求模,其他的和模板一樣
while (!s.empty() && s.top() <= nums[i % n])
s.pop();
res[i % n] = s.empty() ? -1 : s.top();
s.push(nums[i % n]);
}
return res;
}
};