20200331:每日温度(leetcode739)

每日温度

  • 题目
  • 思路与算法
  • 代码实现
  • 复杂度分析

题目

20200331:每日温度(leetcode739)_第1张图片

思路与算法

  1. 思路一:暴力法,本题首先最直观的想法就是,我们在新建结果数组,然后为了填每个位置的值,每次都去遍历一遍数组找到第一个比当前值大的数,找到的时候break出来即可,这样的时间复杂度为:O(n²).不推荐,因此想到我们的栈结构来解决问题,在O(n)的时间内解决问题,即如下思路二。
  2. 思路二:将数组的每个值入栈,如果即将入栈的值比现在的大,那么将当前栈顶元素对应的位置的res算出来,再将其出栈,如果比栈顶元素小,则继续压栈,如此,便只需要一轮遍历即可完成本题的要求。

代码实现

方法一(暴力):

class Solution {
    public int[] dailyTemperatures(int[] T) {
        // 初始化变量
        int[] res = new int[T.length];
        
        for (int i = 0; i < T.length;i++){
            int tmp = T[i];
            for (int j = i; j < T.length;j++){
                if (T[j] > tmp){
                    res[i] = j - i;
                    break;
                }
            }
        }
        return res;
    }
}

方法二(栈解法):

package com.immunize.leetcode.dailyTemperatures;

import java.util.Stack;

/**
 * 
 * 输入:[73, 74, 75, 71, 69, 72, 76, 73]
 * 
 * 输出:[1, 1, 4, 2, 1, 1, 0, 0]
 * 
 * 左边为栈底,右边为栈顶
 * 
 * 【0(73)】
 * 
 * 【 】(74)T[1] > 73T[0],此时先计算出当前 res[peek] = i - peek,再将T[0]出栈,
 * 
 * 【1(74)】 75 > 74 同理,得到res[peek] = 2-1 = 1
 * 
 * 【 2(75) 3(71) 4(69) 】
 * 
 * 【 2(75) 5(72)】6(72) > 69,71,因此依次算出,res[4] = 5-4 = 1,res[3] = 5-3 = 2
 * 
 * 【 ... 】 依次类推即可得到最终的res
 * 
 * @author Mr IMMUNIZE
 *
 */
public class Solution {
	public int[] dailyTemperatures(int[] T) {
		// 初始化结果数组
		int[] res = new int[T.length];
		// 使用堆栈记录每次入栈的数的下标索引,
		Stack<Integer> stack = new Stack();
		for (int i = 0; i < T.length; i++) {
			while (!stack.empty() && T[i] > T[stack.peek()]) {
				res[stack.peek()] = i - stack.peek();
				stack.pop();
			}
			stack.add(i);
		}
		// 返回结果数组
		return res;
	}
}

复杂度分析

复杂度 时间复杂度 空间复杂度
暴力法 O(n²) O(n)
栈解法 O(n) O(n)

你可能感兴趣的:(leetcode学习记录篇)