题目链接
解法1 - 单调栈
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums)
{
int n = nums.size();
vector<int> ret(n);
stack<int> s;
for (int i = 2*n-1; i >= 0; --i)
{
while (!s.empty() && s.top() <= nums[i%n])
s.pop();
ret[i%n] = s.empty() ? -1 : s.top();
s.push(nums[i%n]);
}
return ret;
}
};
解法2 - 动态规划
- dp数组元素含义:下一个更大元素的索引
- 状态转移方程:
(1) dp[i] = i+1, if nums[i+1] > nums[i]
(2) dp[i] = dp[i+1], if nums[i+1] == nums[i]
(3) idx = i+1, while nums[idx] < nums[i], idx = dp[idx]; 当nums[idx] >= nums[i], 参考(1)(2)给dp[i]赋值. 即通过下一个更大元素的索引,跳跃的寻找下一个更大元素
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums)
{
int n = nums.size();
vector<int> numss(n+n);
for (int i = 0; i < n; ++i)
{
numss[i] = nums[i];
numss[i+n] = nums[i];
}
vector<int> idx(n+n, -1);
for (int i = 2*n-2; i >= 0; --i)
{
if (numss[i+1] > numss[i])
{
idx[i] = i+1;
}
else if (numss[i+1] == numss[i])
{
idx[i] = idx[i+1];
}
else
{
int tmp_idx = idx[i+1];
while (tmp_idx != -1 && numss[i] > numss[tmp_idx])
tmp_idx = idx[tmp_idx];
if (tmp_idx != -1)
{
if (numss[i] == numss[tmp_idx])
idx[i] = idx[tmp_idx];
else
idx[i] = tmp_idx;
}
}
}
vector<int> ret(n);
for (int i = 0; i < n; ++i)
ret[i] = idx[i] == -1 ? -1 : nums[idx[i] % n];
return ret;
}
};