Update
This commit is contained in:
@@ -16,6 +16,11 @@
|
||||
* 输出: [2,-1,2]
|
||||
* 解释: 第一个 1 的下一个更大的数是 2;数字 2 找不到下一个更大的数;第二个 1 的下一个最大的数需要循环搜索,结果也是 2。
|
||||
|
||||
提示:
|
||||
|
||||
* 1 <= nums.length <= 10^4
|
||||
* -10^9 <= nums[i] <= 10^9
|
||||
|
||||
|
||||
# 思路
|
||||
|
||||
@@ -23,7 +28,7 @@
|
||||
|
||||
这道题和[739. 每日温度](https://programmercarl.com/0739.每日温度.html)也几乎如出一辙。
|
||||
|
||||
不同的时候本题要循环数组了。
|
||||
不过,本题要循环数组了。
|
||||
|
||||
关于单调栈的讲解我在题解[739. 每日温度](https://programmercarl.com/0739.每日温度.html)中已经详细讲解了。
|
||||
|
||||
@@ -33,7 +38,7 @@
|
||||
|
||||
确实可以!
|
||||
|
||||
讲两个nums数组拼接在一起,使用单调栈计算出每一个元素的下一个最大值,最后再把结果集即result数组resize到原数组大小就可以了。
|
||||
将两个nums数组拼接在一起,使用单调栈计算出每一个元素的下一个最大值,最后再把结果集即result数组resize到原数组大小就可以了。
|
||||
|
||||
代码如下:
|
||||
|
||||
@@ -51,12 +56,17 @@ public:
|
||||
|
||||
// 开始单调栈
|
||||
stack<int> st;
|
||||
for (int i = 0; i < nums.size(); i++) {
|
||||
while (!st.empty() && nums[i] > nums[st.top()]) {
|
||||
result[st.top()] = nums[i];
|
||||
st.pop();
|
||||
st.push(0);
|
||||
for (int i = 1; i < nums.size(); i++) {
|
||||
if (nums[i] < nums[st.top()]) st.push(i);
|
||||
else 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);
|
||||
}
|
||||
st.push(i);
|
||||
}
|
||||
// 最后再把结果集即result数组resize到原数组大小
|
||||
result.resize(nums.size() / 2);
|
||||
@@ -74,6 +84,36 @@ resize倒是不费时间,是O(1)的操作,但扩充nums数组相当于多了
|
||||
|
||||
代码如下:
|
||||
|
||||
```CPP
|
||||
// 版本二
|
||||
class Solution {
|
||||
public:
|
||||
vector<int> nextGreaterElements(vector<int>& nums) {
|
||||
vector<int> result(nums.size(), -1);
|
||||
if (nums.size() == 0) return result;
|
||||
stack<int> st;
|
||||
st.push(0);
|
||||
for (int i = 1; i < nums.size() * 2; i++) {
|
||||
// 模拟遍历两边nums,注意一下都是用i % nums.size()来操作
|
||||
if (nums[i % nums.size()] < nums[st.top()]) st.push(i % nums.size());
|
||||
else if (nums[i % nums.size()] == nums[st.top()]) st.push(i % nums.size());
|
||||
else {
|
||||
while (!st.empty() && nums[i % nums.size()] > nums[st.top()]) {
|
||||
result[st.top()] = nums[i % nums.size()];
|
||||
st.pop();
|
||||
}
|
||||
st.push(i % nums.size());
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
可以版本二不仅代码精简了,也比版本一少做了无用功!
|
||||
|
||||
最后在给出 单调栈的精简版本,即三种情况都做了合并的操作。
|
||||
|
||||
```CPP
|
||||
// 版本二
|
||||
class Solution {
|
||||
@@ -95,7 +135,6 @@ public:
|
||||
};
|
||||
```
|
||||
|
||||
可以版本二不仅代码精简了,也比版本一少做了无用功!
|
||||
|
||||
## 其他语言版本
|
||||
|
||||
|
||||
Reference in New Issue
Block a user