316-找右边第一个大的数并计算距离

清疚 2022-10-14 13:49 210阅读 0赞

找右边第一个大的数并计算距离

题目如下

请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。

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

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

解题代码及注释

  1. #include<iostream>
  2. #include<vector>
  3. #include<stack>
  4. using namespace std;
  5. vector<int> dailyTemperatures(vector<int>& nums)//气温转换函数
  6. {
  7. int len = nums.size();//获取数组的元素的个数
  8. if (len == 0)//数组中没有元素
  9. return nums;
  10. if (len == 1)//数组中只有一个元素
  11. return {
  12. 0 };
  13. stack<int> s;//定义一个栈s
  14. int i = 0;//定义i并初始化为0
  15. vector<int> res(len);//开辟一个长度为len的数组res
  16. while (i < len)//遍历数组元素
  17. {
  18. if (s.empty() || nums[s.top()] >= nums[i])//栈为空或者数组的前一个值大于等于后一个值
  19. {
  20. s.push(i++);//把当i的值入栈,然后i+1
  21. }
  22. else//栈不为空且数组的前一个值小于后一个值
  23. {
  24. res[s.top()] = i - s.top();//计算距离
  25. s.pop();//出栈栈顶元素
  26. }
  27. }
  28. while (!s.empty())//退出循环后,此时栈不为空
  29. {
  30. res[s.top()] = 0;//把新数组剩下的元素都赋值为0
  31. s.pop();//出栈栈顶元素
  32. }
  33. return res;//返回整个新的数组
  34. }
  35. int main()
  36. {
  37. vector<int>arr = {
  38. 73, 74, 75, 71, 69, 72, 76, 73 };
  39. vector<int>brr = dailyTemperatures(arr);//调用气温转换函数
  40. for (int i = 0; i < brr.size(); ++i)//打印新数组
  41. {
  42. cout << brr[i] << " ";
  43. }
  44. cout << endl;
  45. return 0;
  46. }

代码演示图如下

在这里插入图片描述
在这里插入图片描述

运行截图如下

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,210人围观)

还没有评论,来说两句吧...

相关阅读

    相关 10 亿 100

    思路: 1. 使用最小堆(Min Heap) :维护一个包含100个元素的最小堆。开始时,将前100个数添加到最小堆中。然后,对于剩余的数字,如果它比最小堆中的最小值大,就