牛客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 复制代码
在这里插入代码片
相关推荐
ghie90902 分钟前
基于MATLAB的遗传算法优化支持向量机实现
算法·支持向量机·matlab
朝新_38 分钟前
【优选算法】第一弹——双指针(上)
算法
艾莉丝努力练剑1 小时前
【C++STL :stack && queue (一) 】STL:stack与queue全解析|深入使用(附高频算法题详解)
linux·开发语言·数据结构·c++·算法
CoovallyAIHub1 小时前
ICLR 2026 惊现 SAM 3,匿名提交,实现“概念分割”,CV领域再迎颠覆性突破?
深度学习·算法·计算机视觉
IT古董1 小时前
【第五章:计算机视觉-计算机视觉在工业制造领域中的应用】1.工业缺陷分割-(2)BiseNet系列算法详解
算法·计算机视觉·制造
电鱼智能的电小鱼1 小时前
服装制造企业痛点解决方案:EFISH-SBC-RK3588 预测性维护方案
网络·人工智能·嵌入式硬件·算法·制造
yan8626592462 小时前
于 C++ 的虚函数多态 和 模板方法模式 的结合
java·开发语言·算法
小此方2 小时前
C语言自定义变量类型结构体理论:从初见到精通(下)
c语言·数据结构·算法
_poplar_2 小时前
15 【C++11 新特性】统一的列表初始化和变量类型推导
开发语言·数据结构·c++·git·算法
CoovallyAIHub3 小时前
YOLO Vision 2025 还没结束!亚洲首场登陆深圳,YOLO26有望亮相
深度学习·算法·计算机视觉