所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。
一、题目
二、解法
思路分析:本题如果使用暴力破解法可以在 O ( n 2 ) O(n^2) O(n2)的时间复杂度内得到结果,但是不免效率太低。像这种一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了,可以将时间复杂度降低到 O ( n ) O(n) O(n)。
单调栈里面存放下标即可,通过temperatures数组访问下标获取其元素。本题寻找的是数组中每个元素右边第一个比自己大的元素位置。因此从栈底到栈顶的顺序是递增。单调栈主要有三个判断条件:
- 当前遍历的元素temperatures[i]小于栈顶元素temperatures[st.top()]的情况;
- 当前遍历的元素temperatures[i]等于栈顶元素temperatures[st.top()]的情况;
- 当前遍历的元素temperatures[i]大于栈顶元素temperatures[st.top()]的情况。
情况一和情况二我们插入温度数组的下标;每当有大于栈头的元素出现时,我们就计算栈头元素的结果,然后弹出栈头元素,最后也同样插入温度数组的下标。一次循环遍历下来,栈内的元素只剩下两个76和73,那么这两个元素没有赋值,根据定义没有找到比这两个元素更大的温度,因此结果数组应为0。方便起见,我们直接将结果数组赋值为全零。
while (!st.empty() && temperatures[i] > temperatures[st.top()]) {
result[st.top()] = i - st.top();
st.pop();
}
程序如下:
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
stack<int> st;
vector<int> result(temperatures.size(), 0); // 所有元素为赋初值为0
st.push(0); // 插入温度数组的下标
for (int i = 1; i < temperatures.size(); i++) {
if (temperatures[i] <= temperatures[st.top()]) {
st.push(i); // 插入温度数组的下标
}
else {
while (!st.empty() && temperatures[i] > temperatures[st.top()]) {
result[st.top()] = i - st.top();
st.pop();
}
}
st.push(i);
}
return result;
}
};
复杂度分析:
- 时间复杂度: O ( n ) O(n) O(n)。
- 空间复杂度: O ( n ) O(n) O(n)。
代码简化:
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
stack<int> st;
vector<int> result(temperatures.size(), 0); // 所有元素为赋初值为0
for (int i = 0; i < temperatures.size(); i++) {
while (!st.empty() && temperatures[i] > temperatures[st.top()]) {
result[st.top()] = i - st.top();
st.pop();
}
st.push(i); // 插入温度数组的下标
}
return result;
}
};
三、完整代码
# include <iostream>
# include <vector>
# include <stack>
using namespace std;
//class Solution {
//public:
// vector<int> dailyTemperatures(vector<int>& temperatures) {
// stack<int> st;
// vector<int> result(temperatures.size(), 0); // 所有元素为赋初值为0
// st.push(0); // 插入温度数组的下标
// for (int i = 1; i < temperatures.size(); i++) {
// if (temperatures[i] <= temperatures[st.top()]) {
// st.push(i); // 插入温度数组的下标
// }
// else {
// while (!st.empty() && temperatures[i] > temperatures[st.top()]) {
// result[st.top()] = i - st.top();
// st.pop();
// }
// }
// st.push(i);
// }
// return result;
// }
//};
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
stack<int> st;
vector<int> result(temperatures.size(), 0); // 所有元素为赋初值为0
for (int i = 0; i < temperatures.size(); i++) {
while (!st.empty() && temperatures[i] > temperatures[st.top()]) {
result[st.top()] = i - st.top();
st.pop();
}
st.push(i); // 插入温度数组的下标
}
return result;
}
};
int main() {
vector<int> temperatures = { 73, 74, 75, 71, 69, 72, 76, 73 };
Solution s1;
vector<int> result = s1.dailyTemperatures(temperatures);
for (vector<int>::iterator i = result.begin(); i != result.end(); i++) {
cout << *i << " ";
}
cout << endl;
system("pause");
return 0;
}
end