原题地址:496. Next Greater Element I。
解法一:普通解法
//O(n * m)
vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
vector<int>::iterator pos;
vector<int> res;
int flag;
for (int i = 0; i < findNums.size(); i++) {
pos = find(nums.begin(), nums.end(), findNums[i]);
flag = 0;
for (vector<int>::iterator j = pos + 1; j != nums.end(); j++) {
if (*j > findNums[i]) {
res.push_back(*j);
flag = 1;
break;
}
}
if (flag == 0) {
res.push_back(-1);
}
}
return res;
}
解法二:栈解法
使用一个栈来保存递减子序列,当遇到一个数nums[i]
大于栈顶元素时,则弹出所有小于nums[i]
的元素,并且将他们的Next Greater Element
设为nums[i]
,随后将nums[i]
压栈。
如图所示,nums
为[5, 4, 3, 2, 1, 6]
,6是前面所有元素[5, 4, 3, 2, 1]
的Next Greater Element
。
再比如nums
为[9, 8, 7, 3, 2, 1, 6]
,栈首先会保存一个递减子序列[9, 8, 7, 3, 2, 1]
,然后我们看见6大于1,则弹出1 2 3
, 他们的Next Greater Element
就应该是6。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xo2y3q0h-1607915026720)(http://7xs8vt.com1.z0.glb.clouddn.com/blog/leetcode/496-next-greater-element-i/sample.png)]
// O(n)
vector<int> nextGreaterElement2(vector<int>& findNums, vector<int>& nums) {
vector<int> res;
stack<int> s;
unordered_map<int, int> map;
for (int i = 0; i < nums.size(); i++) {
while (!s.empty() && s.top() < nums[i]) {
map[s.top()] = nums[i];
s.pop();
}
s.push(nums[i]);
}
for (int i = 0; i < findNums.size(); i++) {
if (map.count(findNums[i]) > 0) {
res.push_back(map[findNums[i]]);
}
else {
res.push_back(-1);
}
}
return res;
}
参考: