leetcode - 739. 每日温度

题目

image.png

解法一:

思路:输出的最后一位一定是0,从右往左遍历温度表T,如果当前温度T[i]小于上一次温度T[i + 1],则记录1,否则从上次记录的最大值开始往左遍历,找到最近的比当前值大的温度,记录index

/**
* @param {number[]} T
* @return {number[]}
*/
var dailyTemperatures = function(T) {
   let len = T.length;
   let index = len - 1;
   let max = T[len - 1];
   let dp = new Array(len);
   dp[len - 1] = 0;
   for(let i = len - 2; i >= 0; i--) {
       if (T[i + 1] > T[i]) {
           dp[i] = 1;
       } else {
           if (T[i] >= max) {
               dp[i] = 0;
               max = T[i];
               index = i;
           } else {
               dp[i] = index - i;
               tmpIndex = index;
               while(tmpIndex > i) {
                   if (T[tmpIndex] > T[i]) {
                       dp[i] = tmpIndex - i;
                   }
                   tmpIndex--;
               }
           }
       }
   }
   return dp;
};

解法2:

从左往右遍历温度表,用一个栈来存放温度值与index的信息,如果当前遍历的值小于栈最后的元素值,则把当前元素推入栈内,否则依次把当前值与栈的最后元素对比,如果当前值大于栈的最后一位元素值,则栈推出最后一位,并记录该位置的距离i - item.index,直到栈的最后一位元素值大于等于当前遍历值,才把当前值放入栈中。最后不要忘了把res中为空的元素替换成0

/**
 * @param {number[]} T
 * @return {number[]}
 */
var dailyTemperatures = function(T) {
    let stack = [{val: T[0], index: 0}];
    let res = new Array(T.length);
    for (let i = 1; i < T.length; i++) {
        if (T[i] > stack[stack.length - 1].val) {
            let flag = true;
            while(flag) {
                if (stack.length > 0 && stack[stack.length - 1].val < T[i]) {
                    let item = stack.pop();
                    res[item.index] = i - item.index;
                } else {
                    stack.push({val: T[i], index: i})
                    flag = false;
                }
            }
        } else {
            stack.push({val: T[i], index: i})
        }
    };
    for (let i = 0; i < res.length; i++) {
        if (res[i] === undefined) {
            res[i] = 0;
        }
    }
    return res;
};

你可能感兴趣的:(leetcode - 739. 每日温度)