题目分析
原题:
请根据每日气温列表,重新生成一个列表,对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。
分析:
这道题的题意并不难理解,对于输入列表的每一个元素,从下标大于其下标的元素中寻找第一个大于它的值,并记录下标之差,最后将所有下标之差返回。
思路分析
思路一:暴力查找
通过分析题意,最好想到的方法就是暴力查找。其具体思路是:
第一步:创建一个容器v用于装填输出。若输入为空直接返回v。
第二步:既然是对于输入列表的每一个元素,那么考虑通过for循环遍历输入的vector容器。因为最后一个元素对应的输出一定是0,因此只需遍历T.size()-1个元素。
遍历过程中,设置并初始化一个int类型变量target为i+1,这个target变量的作用是指示所有下标大于当前元素下标的元素,因此下标从i+1开始是完全可以的。
通过设置while循环,将T[i]与之后的所有元素作比较,直至找到大于T[i]的那个元素。当然这个元素是不一定存在的,因此,在while循环的条件中需要添加一个边界条件target<T.size()
。退出循环的条件是target>=T.size()||T[target]>T[i]
,两个条件一个对应着没找到,一个对应着找到了。可以通过分类讨论将0或target-i放入vector容器。这里通过三目运算符v.push_back(target<T.size()?target-i:0);
完成。
这里有一个特别需要注意的点:while循环两个条件的先后顺序设置是不能调换的,我在这里也是犯了这样的错误,对于这一语句while(target<T.size()&&T[target]<=T[i])
,一开始“&&”符号前后的条件语句我是写反了的,这样就导致了先访问T[target],再限定target<T.size()
,导致在某个测试用例的调试过程中出现了数组溢出的情况,即 ==42==ERROR: AddressSanitizer: heap-buffer-overflow on address
这一debug的产生。在焕杰同学的帮助下,overcome了这一debug。
关于这一debug大家可以看我的博客Debug:ERROR: AddressSanitizer: heap-buffer-overflow on address【C++】
思路一代码如下:
class Solution {
public:
vector<int> dailyTemperatures(vector<int>