leetcode739题每日温度
题目:
给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指在第 i 天之后,才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0 来代替。
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
/**
题意解释:
*/
// 第一个想法是针对每个温度值向后进行一次搜索,找到一个比当前更高的温度值
int[] ans=new int[temperatures.length];
for(int i=0;i<temperatures.length;i++)
{
int index=i;
while(index<temperatures.length)
{
if(temperatures[index]>temperatures[i])
{
break;
}
index++;
}
if(index>temperatures.length-1)
{
index--;
}
if(temperatures[index]>temperatures[i])
{
ans[i]=index-i;
}else
{
ans[i]=0;
}
}
return ans;
}
}
上面的方法的运行效率不是很高,这个题目的标签是栈,然后题目的提示也是很明显,因为如果从后开始找的话会比较好找,也就是FILO的顺序。
class Solution {
public int[] dailyTemperatures(int[] temperatures) {
/**
题意解释:
*/
// 第一个想法是针对每个温度值向后进行一次搜索,找到一个比当前更高的温度值
int[] ans=new int[temperatures.length];
// for(int i=0;i<temperatures.length;i++)
// {
// int index=i;
// while(index<temperatures.length)
// {
// if(temperatures[index]>temperatures[i])
// {
// break;
// }
// index++;
// }
// if(index>temperatures.length-1)
// {
// index--;
// }
// if(temperatures[index]>temperatures[i])
// {
// ans[i]=index-i;
// }else
// {
// ans[i]=0;
// }
// }
// return ans;
/**
考虑用栈来解决
不过这个栈比较特殊,它是递减栈:栈里只有递减的元素
遍历整个数组,如果栈不空,且当前数字大于栈顶元素,那么如果直接进栈的话就不是递减栈,所以需要找出栈顶元素,由于当前数字大于栈顶元素的数字,而且一定格式第一个大于栈顶元素的数字,直接求出下标查就是二者的距离
继续看新的栈顶元素,直到当前数字小于等于栈顶元素停止,然后将数字入栈,这样就可以一直保持递减栈,且每个数和第一大于它的数字距离也可以算出
*/
Stack<Integer> stack=new Stack();
for(int i=0;i<temperatures.length;i++)
{
while(!stack.isEmpty() && temperatures[i]>temperatures[stack.peek()])
{
int val=stack.peek();
stack.pop();
ans[val]=i-val;
}
stack.push(i);
}
return ans;
}
}