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

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

题目如下

请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 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;
}

代码演示图如下

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

运行截图如下

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

上一篇:销售管理系统


下一篇:【C语言学习】单链表的创建、增删、交换、排序