day58 ● 739. 每日温度 ● 496.下一个更大元素 I

69 阅读2分钟

单调栈是一种常用的数据结构,它可以用来解决一些常见的问题,比如寻找下一个更大元素、寻找下一个更小元素、寻找最近的较大/较小元素等等。在本文中,我们将介绍如何使用单调栈来解决两个问题:每日温度和下一个更大元素 I。

  1. 每日温度

题目描述:

给定一个代表每个日子温度的列表,返回一个列表,表示要等多少天才能等到温度升高。如果在这之后不会升高,返回 0。

例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

解题思路:

我们可以使用单调栈来解决这个问题。我们从左到右遍历温度列表,对于每个温度,我们将其下标入栈。如果当前温度大于栈顶下标所代表的温度,那么我们就可以得到栈顶下标的答案。我们不断弹出栈顶元素,直到当前温度小于等于栈顶下标所代表的温度为止。这个过程中,我们将答案数组中对应下标的值更新为栈顶下标到当前下标的距离。

Java 代码实现:

public int[] dailyTemperatures(int[] T) {
    int[] ans = new int[T.length];
    Stack<Integer> stack = new Stack<>();
    for (int i = 0; i < T.length; i++) {
        while (!stack.isEmpty() && T[i] > T[stack.peek()]) {
            int index = stack.pop();
            ans[index] = i - index;
        }
        stack.push(i);
    }
    return ans;
}
  1. 下一个更大元素 I

题目描述:

给定两个没有重复元素的数组 nums1 和 nums2,其中nums1是nums2的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。

nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1。

例如,给定 nums1 = [4,1,2],nums2 = [1,3,4,2],输出为 [-1,3,-1]。

解题思路:

我们可以使用单调栈来解决这个问题。我们首先遍历数组 nums2,将每个元素的下一个更大元素都存储在哈希表中。接着,我们遍历数组 nums1,对于每个元素,我们在哈希表中查找其下一个更大元素即可。

Java 代码实现:

public int[] nextGreaterElement(int[] nums1, int[] nums2) {
    Map<Integer, Integer> map = new HashMap<>();
    Stack<Integer> stack = new Stack<>();
    for (int num : nums2) {
        while (!stack.isEmpty() && num > stack.peek()) {
            map.put(stack.pop(), num);
        }
        stack.push(num);
    }
    while (!stack.isEmpty()) {
        map.put(stack.pop(), -1);
    }
    int[] ans = new int[nums1.length];
    for (int i = 0; i < nums1.length; i++) {
        ans[i] = map.get(nums1[i]);
    }
    return ans;
}

总结:

本文介绍了如何使用单调栈来解决两个常见问题:每日温度和下一个更大元素 I。单调栈是一种非常实用的数据结构,在算法竞赛和实际开发中都有广泛的应用。我们希望本文能够帮助读者更好地理解和使用单调栈。