牛客2024【牛客&赛文X】春招冲刺ONT61 每日温度【hard 单调栈 Java、Go、PHP】

题目

题目链接:

https://www.nowcoder.com/practice/1f54e163e6944cc7b8759cc09e9c78d8

思路

复制代码
	单调栈最直接的应用就是获取数组中每个位置i,i的左边第一个比i大或者小的位置/数
	以及,i的右边第一个比i大或者小的位置/数

  不懂的同学看这里https://blog.csdn.net/Borslav/article/details/125469491

参考答案Java

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

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 := 0

			if 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 := 0
		if 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
			bigarr[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

php 复制代码
在这里插入代码片
相关推荐
沙威玛_LHE5 小时前
树和二叉树
数据结构·算法
py有趣7 小时前
LeetCode算法学习之两数之和 II - 输入有序数组
学习·算法·leetcode
夏鹏今天学习了吗7 小时前
【LeetCode热题100(62/100)】搜索二维矩阵
算法·leetcode·矩阵
吃着火锅x唱着歌9 小时前
LeetCode 1128.等价多米诺骨牌对的数量
算法·leetcode·职场和发展
十八岁讨厌编程9 小时前
【算法训练营 · 补充】LeetCode Hot100(中)
算法·leetcode
橘颂TA9 小时前
【剑斩OFFER】算法的暴力美学——最小覆盖字串
算法·c/c++·就业
wearegogog1239 小时前
基于混合蛙跳算法和漏桶算法的无线传感器网络拥塞控制与分簇新方法
网络·算法
Tiandaren10 小时前
大模型应用03 || 函数调用 Function Calling || 概念、思想、流程
人工智能·算法·microsoft·数据分析
2301_7951672011 小时前
玩转Rust高级应用 如何进行理解Refutability(可反驳性): 模式是否会匹配失效
开发语言·算法·rust
小当家.10511 小时前
[LeetCode]Hot100系列.贪心总结+思想总结
算法·leetcode·职场和发展