Monotonic-stack
``` c++ "数组有重复元素"
vector<vector<int>> GetLessRepeat(vector<int>& nums) {
if (nums.empty()) {
return vector<vector<int>>{};
}
stack<vector<int>> mono;
vector<vector<int>> results(nums.size(),vector<int>(2));
for (int i = 0; i < (int)nums.size(); ++i) {
//比是和第一个元素比,求最左时是最后一个元素
while (!mono.empty() && nums[mono.top().front()] > nums[i]) {
vector<int> current_sets = mono.top();
mono.pop();
//弹栈时需要求每个元素的最左最右值
for (auto elem : current_sets) {
results[elem][1] = i;
results[elem][0] = mono.empty() == true ? -1 : mono.top().back();
}
}
//插入时要看是和top相等还是比top大
if (!mono.empty() && nums[mono.top().back()] == nums[i]) {
mono.top().push_back(i);
}
//比栈顶大或者为空,那就直接压栈就完事了
else {
mono.push(vector<int>{i});
}
}
//清零操作
while (!mono.empty()) {
auto temp = mono.top();
mono.pop();
for (auto elem : temp) {
//如果栈不为空,可以先取栈顶元素,避免多次访问栈
results[elem][1] = -1;
results[elem][0] = mono.empty() == true ? -1 : mono.top().back();
}
}
return std::move(results);
}Last updated