单调栈是一种常用的数据结构,它可以用来解决一些常见的问题,比如寻找下一个更大元素、寻找下一个更小元素、寻找最近的较大/较小元素等等。在本文中,我们将介绍如何使用单调栈来解决两个问题:每日温度和下一个更大元素 I。
- 每日温度
题目描述:
给定一个代表每个日子温度的列表,返回一个列表,表示要等多少天才能等到温度升高。如果在这之后不会升高,返回 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;
}
- 下一个更大元素 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。单调栈是一种非常实用的数据结构,在算法竞赛和实际开发中都有广泛的应用。我们希望本文能够帮助读者更好地理解和使用单调栈。