题目
题目链接:
https://www.nowcoder.com/practice/1f54e163e6944cc7b8759cc09e9c78d8
思路
单调栈最直接的应用就是获取数组中每个位置i,i的左边第一个比i大或者小的位置/数以及,i的右边第一个比i大或者小的位置/数不懂的同学看这里https://blog.csdn.net/Borslav/article/details/125469491
参考答案Java
import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** 每日温度* @param dailyTemperatures int整型一维数组* @return int整型一维数组*/public int[] temperatures (int[] dailyTemperatures) {//单调栈,递减栈// 也就是先求每个元素i左边,右边离他最近的第一个大于i的数,没有大于i的用-1表示int n = dailyTemperatures.length;int[][] bigarr = new int[n][2];//单调递减栈Stack<List<Integer>> stack = new Stack<>();for (int i = 0; i < n ; i++) {while (!stack.isEmpty() &&dailyTemperatures[stack.peek().get(0)] < dailyTemperatures[i]) {List<Integer> pops = stack.pop();int leftBigger = stack.isEmpty() ? -1 : stack.peek().get(stack.peek().size() - 1);for (Integer pop : pops) {bigarr[pop][0] = leftBigger; //pop左边边第一个比pop大的位置bigarr[pop][1] = i; //pop右边第一个比pop大的位置}}if (!stack.isEmpty() &&dailyTemperatures[stack.peek().get(0)] == dailyTemperatures[i]) {stack.peek().add(i);} else {List<Integer> ll = new ArrayList<>();ll.add(i);stack.push(ll);}}while (!stack.isEmpty()) {List<Integer> pops = stack.pop();int leftBigger = stack.isEmpty() ? -1 : stack.peek().get(stack.peek().size() - 1);for (Integer pop : pops) {bigarr[pop][0] = leftBigger;bigarr[pop][1] = -1;}}//前面的代码是通用的单调栈的模板,// 答案中我们只需要用到bigarr中每个元素的1下标,即右边第一个比自己大的位置int[] ans = new int[n];for (int i = 0; i < n ; i++) {if (bigarr[i][1] == -1) {ans[i] = 0;} else {ans[i] = bigarr[i][1] - i;}}return ans;}
}
参考答案Go
package main/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** 每日温度* @param dailyTemperatures int整型一维数组* @return int整型一维数组*/
func temperatures(dailyTemperatures []int) []int {//单调栈,递减栈// 也就是先求每个元素i左边,右边离他最近的第一个大于i的数,没有大于i的用-1表示n := len(dailyTemperatures)bigarr := make([][]int, n)//单调递减栈stack := [][]int{} //GO中栈用切片表示即可for i := 0; i < n; i++ {stlen := len(stack)for len(stack) > 0 && dailyTemperatures[stack[stlen-1][len(stack[stlen-1])-1]] < dailyTemperatures[i] {pops := stack[stlen-1]stack = stack[:stlen-1]leftbig := 0if len(stack) == 0 {leftbig = -1} else {stlen = len(stack)leftbig = stack[stlen-1][len(stack[stlen-1])-1]}for _, v := range pops {bigarr[v] = make([]int, 2)bigarr[v][0] = leftbig //v左边第一个比v大的位置bigarr[v][1] = i //v右边第一个比v大的位置}}stlen = len(stack)if len(stack) > 0 && dailyTemperatures[stack[stlen-1][len(stack[stlen-1])-1]] == dailyTemperatures[i] {stack[stlen-1] = append(stack[stlen-1], i)} else {list := []int{}list = append(list, i)stack = append(stack, list)}}for len(stack) > 0 {stlen := len(stack)pops := stack[stlen-1]stack = stack[:stlen-1]leftbig := 0if len(stack) == 0 {leftbig = -1} else {stlen = len(stack)leftbig = stack[stlen-1][len(stack[stlen-1])-1]}for _, v := range pops {bigarr[v] = make([]int, 2)bigarr[v][0] = leftbigbigarr[v][1] = -1}}//前面的代码是通用的单调栈的模板,// 答案中我们只需要用到bigarr中每个元素的1下标,即右边第一个比自己大的位置ans := make([]int, n)for i := 0; i < n; i++ {if bigarr[i][1] == -1 {ans[i] = 0} else {ans[i] = bigarr[i][1] - i}}return ans
}
参考答案PHP
在这里插入代码片