由于各种原因需要重新熟悉一下常见算法,最近一段时间写代码少,就从leetcode上找些题练练手。今天做的题目是:739.每日温度。
看到这个题很容易想到单调栈。单调栈是什么呢?从字面意思很容易看出来,单调栈首先是一个栈结构,满足后进先出(LIFO),再就是从栈顶到栈底的值是逐渐递增或者逐渐递减。
739的题目就不再描述了,题目链接:https://leetcode-cn.com/problems/daily-temperatures/
下面是我写的第一版代码,结果是过了34个用例,第35个超时。先看下我的代码:
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& T) {
uint32_t elementCount = T.size();
std::stack<int> s;
std::vector<int> subScripts;
std::vector<int> result(elementCount, 0);
for (int i = 0; i < elementCount; ++i) {
if (s.empty()) {
s.push(T[i]);
subScripts.emplace_back(i);
continue;
} else {
for (int j = 0; j < subScripts.size(); ++j) {
++ result[subScripts[j]];
}
while (!s.empty()) {
if (T[i] > s.top()) {
s.pop();
subScripts.pop_back();
} else {
break;
}
}
s.push(T[i]);
subScripts.emplace_back(i);
}
}
if (!s.empty()) {
for (int j = 0; j < subScripts.size(); ++j) {
result[subScripts[j]] = 0;
}
}
return result;
}
};
首先分析一下有没有什么操作是可以节省的?
- 保存值的栈s和保存下标的subScripts是重复的,用一个数据结构就可以
- 计算更高气温的天数,用下标相减就可以得到,不需要通过进栈数来获取
下面是修改后的代码:
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& T) {
uint32_t elementCount = T.size();
std::stack<int> subScripts;
std::vector<int> result(elementCount, 0);
for (int i = 0; i < elementCount; ++i) {
if (subScripts.empty()) {
subScripts.push(i);
continue;
} else {
while (!subScripts.empty()) {
if (T[i] > T[subScripts.top()]) {
result[subScripts.top()] = i - subScripts.top();
subScripts.pop();
} else {
break;
}
}
subScripts.push(i);
}
}
return result;
}
};
就先写这么多,早日重回代码癫疯,hia hia hia