【leetcode/栈】每日温度(栈的使用)

这道LeetCode题目要求根据每日温度列表,生成一个列表,表示等待多久温度会升高。栈在这里起到了关键作用,栈底的元素是最大值,遇到新元素时会处理栈中所有比它小的元素。AC代码中要注意判断栈是否为空。
摘要由CSDN通过智能技术生成

题目:

每日温度

根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。

例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]

提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。

思路:

  1.  这道题显然不能通过BF来求解。我们得另辟蹊径。
  2. 栈存在的意义:当碰到后面某一特定元素,前面的元素需要得到处理时,就可以利用栈来求解。
  3. 还有一点,栈中的元素有所谓的标准进行排序的,栈底的元素是最大的,栈顶的元素则是最小的。碰到某一元素入栈,他就要把所有比他小的都处理掉
  4. 本体中,所谓的标准就是日子的索引,当我们碰到一个元素,看看它能不能处理我们栈中遗留的元素

AC代码:

#include<iostream>
#include<vector>
#include<stack>
using namespace std;

vector<int> dailyTemperatures(vector<int>& T) {
  stack<int> indexes;
  vector<int> result(T.size(), 0);
  for (int i = 0; i < T.size(); ++i) {
    // 为什么是后面的元素呢?因为indexes里放的都是之前访问过的元素
    while (!indexes.empty() && T[indexes.top()] < T[i]) {
      result[indexes.top()] = i - indexes.top();
      indexes.pop();
    }
    indexes.push(i);
  }
  return result;
}

int main() {
  int n;
  cin >> n;
  vector<int> T;
  for (int i = 0; i < n; ++i) {
    int num;
    cin >> num;
    T.push_back(num);
  }
  auto m = dailyTemperatures(T);
  for (auto mm : m) {
    cout << mm << " ";
  }
  cout << endl;
  return 0;
}

其他经验:

确实要判断是否为空,才能取栈顶元素啊。

引用\[1\]提供了一个朴素的解法,使用两个来存储字符串,一个用来存储普通字符,另一个用来存储特殊字符。遍历字符串,如果是普通字符则压入第一个,如果是特殊字符则弹出第一个顶元素。最后比较两个是否相同即可判断字符串是否有效。这个解法的时间复杂度是O(M + N),空间复杂度也是O(M + N)。\[1\] 引用\[2\]提供了另一个的应用场景,即判断括号是否有效。遍历字符串,如果是左括号则压入,如果是右括号则判断和顶元素是否匹配,不匹配则返回false,匹配则弹出顶元素。最后判断是否为空即可判断括号是否有效。\[2\] 引用\[3\]也提供了一个判断括号是否有效的解法,使用来操作。遍历字符串,如果是左括号则压入,如果是右括号则判断和顶元素是否匹配,不匹配则返回false,匹配则弹出顶元素。最后判断是否为空即可判断括号是否有效。这个解法使用了HashMap来存储括号的对应关系。\[3\] 综上所述,在解决字符串相关问题中有着广泛的应用,包括判断字符串是否有效、逆波兰表达式等。在解决这些问题时,可以帮助我们保存和处理字符的顺序,从而简化问题的处理过程。 #### 引用[.reference_title] - *1* *3* [Leetcode刷题03-](https://blog.csdn.net/weixin_47802917/article/details/123007699)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v4^insert_chatgpt"}} ] [.reference_item] - *2* [leetCode-类型详解](https://blog.csdn.net/zhiyikeji/article/details/125508011)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v4^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值