题目:
给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。
数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1 。
解析:
此题目一一开始的思路就是遍历一遍然后再遍历一遍(过程如上题)。即可实现操作。代码如下,这样很麻烦其实也可以不扩充nums,而是在遍历的过程中模拟走了两遍nums。
代码:
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
stack<int>st;
vector<int> result(nums.size(),-1);
st.push(0);
for(int i = 1; i < nums.size(); ++i){
if(nums[i] <= nums[st.top()]){
st.push(i);
}
else{
while(!st.empty() && nums[i] >nums[st.top()]){
result[st.top()] = nums[i];
st.pop();
}
st.push(i);
}
}
for(int i = 0; i < nums.size(); ++i){
if(nums[i] <= nums[st.top()]){
st.push(i);
}
else{
while(!st.empty() && nums[i] >nums[st.top()]){
if(result[st.top()] != -1) {
st.pop();
continue;
}
result[st.top()] = nums[i];
st.pop();
}
st.push(i);
}
}
return result;
}
};
遍历的过程中模拟走了两遍nums代码:
- 多次顺序遍历数组:对一个数组遍历两 / n 次,可以通过变量的范围为0~2*vector.size()-1,然后让变量对整个数组长度取余,此时变量变化为多次从:0 到vector.size()-1,即实现多次顺序遍历数组。
- 此时有个特殊点 有i = 0的情况,之前代码则没有,因为当第二次遍历的第一个字母你要判断所以需要增加 i = 0的情况,之前代码,通过st【0】 = 0初始化,因为只遍历一次所以无所谓,但是这个需要遍历多次。
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
stack<int>st;
vector<int> result(nums.size(),-1);
for(int i = 0; i < nums.size()*2; ++i){
int j = i%nums.size();
while(!st.empty() && nums[j] >nums[st.top()]){
result[st.top()] = nums[j];
st.pop();
}
st.push(j);
}
return result;
}
};