牛客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 复制代码
在这里插入代码片
相关推荐
朝朝辞暮i3 小时前
C++ 第 21 课:struct —— 把一组相关数据打包在一起
开发语言·c++·算法
青梅橘子皮3 小时前
Blue---二分算法(二分查找与二分答案)
算法
长河3 小时前
Java的GC(垃圾回收)中,标记无用对象的核心方法是可达性分析算法
java·jvm·算法
月光船幽幽3 小时前
加性偏移外推提升参数识别可靠性
python·算法
Ivanqhz4 小时前
层归一化、残差、前馈网络与激活函数简述
服务器·数据库·人工智能·深度学习·算法
不会就选b5 小时前
算法日常・每日刷题--<动态规划>3
数据结构·算法
-dzk-6 小时前
【堆】LC 347.前 K 个高频元素
算法·堆
H.莓飛6 小时前
【数据结构】栈_OJ题
linux·数据结构·算法·centos
Zootopia6266 小时前
多架 eVTOL集群排班调度方案思考
人工智能·算法·数学建模·matlab·动态规划·无人机·evtol
和裕6 小时前
年度框架直供 vs 零散按需采购:定制纸箱采购成本、交付与服务核心区别全对比
大数据·运维·网络·人工智能·算法