题目描述
知识点
居然知识点是 栈和哈希表 ,呜呜呜
结果
实现
码前思考
- 我使用的是暴力的方法,从右到左遍历,不过使用一个数组记录了当前位置的
warmer positon
是哪个,所以解法就没有两层for循环那么纯暴力了。
代码实现
//题目就是找某个数右边第一个比它大的数。。。
//我也不太清楚非暴力的写法怎么做。。。只会从右往左暴力遍历
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& T) {
int len = T.size();
if(len == 0){
return vector<int>();
}
vector<int> res(len,len); //先用于存放索引
res[len-1] = len;
for(int i=len-2;i>=0;i--){
//首先看后面的那个元素是否比比自己大
if(T[i] < T[i+1]){
res[i] = i+1;
}else{
//需要反复进行查找
int j = res[i+1];
while(j != len){
if(T[i] < T[j]){
res[i] = j;
break;
}else{
j = res[j];
}
}
}
}
//然后计算天数
for(int i=0;i<len;i++){
//printf("%d ",res[i]);
if(res[i] == len){
res[i] = 0;
}else{
res[i] = res[i] - i;
}
}
return res;
}
};
码后反思
- 看了官方的单调栈解法,我发现自己的解法应该是用数组索引 模拟了一个单调栈 了。(有点小开心,哈哈哈
- 官方还有用哈希的,因为温度的范围有限(
[30,100]
),所以可以用哈希记录每个温度第一次出现的位置。
单调栈解题
- 从后往前遍历数组使用递增栈进行解题
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& T) {
int len = T.size();
if(len == 0){
return vector<int>();
}
stack<int> st;
vector<int> res(len,0);
//从后往前,更加符合直觉
for(int i=len-1;i>=0;i--){
while(!st.empty() && T[st.top()] <= T[i]){
st.pop();
}
if(st.empty()){
res[i] = 0;
}else{
res[i] = st.top()-i;
}
st.push(i);
}
return res;
}
};