每日温度笔记

#include
#include
#include
using namespace std;

//思路分析
//分析题目的意思可以知道,题目求解的其实就是依次对于temperatureVec中的每个元素,找到从左往右第一个比大的值,
//然后将两个数据的下标做差放入结果vec中
//分析题目意思我们也可以发现,存放结果的resultVec与temperatureVec是一一对应的,resultVec
//的第i个元素表示temperatureVec的第i个元素需要经历几天能第一遇到比temperatureVec[i]大的值

//解法一
//双重循环,第一重循环用i遍历temperatureVec的每个元素,第二重用j(i+1)循环遍历temperatureVec选定元素后面的元素,
//找到第一个大于temperatureVec[i]的元素,把j - i的值放入result[i]中或者result.pushback(j-i)的值

//优化解法
//新建一个栈,遍历数组,如果栈为空,则直接将该元素的下标入栈,在栈不空的情况下,如果入栈的数据大于栈顶元素,那么
//那么要弹出栈顶元素,此时也是栈顶这个元素遇到的第一个大于他的值的元素,直接两个元素的下标做差,然后放入出栈元素
//下标对应的resultVec[出栈元素下标]的值上
//利用了栈回溯的特性,此时的栈内元素的特点是栈底到栈顶递减,栈顶到栈底递曾,称为单调递增栈
//回溯思路分析:
// 75, 71, 69, 72, 76, 73
//1.第一次目的是找75右边第一个比75大的数据,发现他右边第一个元素比75小
//那么就暂时不找75右边第一个比75大的数据,而是找71右边第一个比71大的数据
//发现他右边第一个元素比71小,那么就暂时不找71右边第一个比71大的数据,
//而是找69右边第一个比69大的数据,发现72大于69,那么72就是第一个比69大的元素
//下标做做差就是resultVec中对应69的下标的值,此时在用72和71比,发现72比71大,
//那么72就是第一个比71大的元素
//下标做做差就是resultVec中对应71的下标的值,此时在用72和75比,发现72比75小,
//继续找72右边比72大的数,找打以后与75比...
//分析思路可以看到,典型的回溯,当暂时找不到比当前值大的元素时,就去找他右边比他小的元素的第一个目标值
//找到以后,再和他比较

vector getResult(vector& temperatureVec)
{
	vector resultVec(8, 0);

	stack increasStk;

	for (int i = 0; i < (int)temperatureVec.size(); i++)
	{

		//回溯通常会和while循环配合,因为栈顶元素出站后,栈顶元素一直在变,要不断对新的栈顶元素进行同样的逻辑处理

		while (!increasStk.empty() && temperatureVec[increasStk.top()] < temperatureVec[i])
		{
			resultVec[increasStk.top()] = i - increasStk.top();
			increasStk.pop();
		}
		increasStk.push(i);
	}

	return resultVec;
}

int main()
{
	vector temperatureVec = { 73,74,75,71,69,72,76,73 };

	vectorres =  getResult(temperatureVec);

	for (int i = 0; i < (int)res.size(); i++)
	{
		cout << res[i] << endl;
	}
}

每日温度笔记_第1张图片

你可能感兴趣的:(算法练习,蓝桥杯,c++,算法)