输入:一个整数数组 nums
要求:
-
这是一个环形数组,意味着
nums[nums.length - 1]的下一个元素是nums[0]。 -
需要为
nums中的每一个元素x,找到它在环形遍历顺序中的第一个比它更大的数。
输出:一个与 nums 等长的答案数组 ans,其中 ans[i] 是 nums[i] 的“下一个更大元素”。如果不存在,则为 -1
思路:最直观的写法是构建一个2*nums.size()大小的辅助数组,然后用nums数据填充,构建一个实际的单调栈,去前nums.size()个结果返回就好了。
进阶一点点就是,用int real_index = i % n; 模拟辅助数组,然后需要注意只填充前n个答案,谨防答案被后面的数据所覆盖。
复杂度:
时间复杂度:O(n)
空间复杂度:O(n) 虽然没有构建辅助数组,但是用了辅助栈
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
//构建一个2n大小的辅助数组 或者 模拟一个2n大小的数组
int n = nums.size();
vector<int> ans(n, -1);
stack<int> s;
for (int i = 0; i < n * 2; ++i) {
int real_index = i % n;
while (!s.empty() && nums[real_index] > nums[s.top()]) {
ans[s.top()] = nums[real_index];
s.pop();
}
// 关键:只需要为 0 到 n-1 的元素找答案
if (i < n) {
s.push(real_index);
}
}
return ans;
}
};
434

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



