找右边第一个大的数并计算距离
题目如下
请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。
提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。
解题代码及注释
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
vector<int> dailyTemperatures(vector<int>& nums)//气温转换函数
{
int len = nums.size();//获取数组的元素的个数
if (len == 0)//数组中没有元素
return nums;
if (len == 1)//数组中只有一个元素
return { 0 };
stack<int> s;//定义一个栈s
int i = 0;//定义i并初始化为0
vector<int> res(len);//开辟一个长度为len的数组res
while (i < len)//遍历数组元素
{
if (s.empty() || nums[s.top()] >= nums[i])//栈为空或者数组的前一个值大于等于后一个值
{
s.push(i++);//把当i的值入栈,然后i+1
}
else//栈不为空且数组的前一个值小于后一个值
{
res[s.top()] = i - s.top();//计算距离
s.pop();//出栈栈顶元素
}
}
while (!s.empty())//退出循环后,此时栈不为空
{
res[s.top()] = 0;//把新数组剩下的元素都赋值为0
s.pop();//出栈栈顶元素
}
return res;//返回整个新的数组
}
int main()
{
vector<int>arr = { 73, 74, 75, 71, 69, 72, 76, 73 };
vector<int>brr = dailyTemperatures(arr);//调用气温转换函数
for (int i = 0; i < brr.size(); ++i)//打印新数组
{
cout << brr[i] << " ";
}
cout << endl;
return 0;
}