This commit is contained in:
programmercarl
2023-02-18 09:18:51 +08:00
parent b0c67e3dff
commit d2311377a8
7 changed files with 129 additions and 47 deletions

View File

@@ -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:
};
```
可以版本二不仅代码精简了,也比版本一少做了无用功!
## 其他语言版本