牛客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 复制代码
在这里插入代码片
相关推荐
Tsuki_tl7 分钟前
【优选算法 — 双指针】经典例题题解+算法总结
算法·蓝桥杯·力扣·刷题·双指针·1024程序员节·优选算法
拓恒技术1 小时前
内河航道无人机智能巡检系统与算法应用
人工智能·深度学习·算法·无人机·智慧城市
如何原谅奋力过但无声1 小时前
【LeetCode hot100】代码随想录未cover部分
数据结构·算法·leetcode
INGNIGHT1 小时前
377.组合总和 Ⅳ(背包)
c++·算法·1024程序员节
拓恒技术1 小时前
城市管理中的无人机AI识别算法:架构、场景与落地
人工智能·算法·视觉检测·无人机·1024程序员节
吴可可1232 小时前
Accumark二次开发环境搭建与API入门
算法
木井巳3 小时前
【动态规划: 线性dp】解码方法
java·算法·leetcode·动态规划·推荐算法
春弦_11 小时前
自用算法整理二
数据结构·算法·图论
hetao173383712 小时前
2026-10-22~23 hetao1733837 的刷题记录
c++·算法
java_nnnn13 小时前
LeetCode刷题滑动窗口(串联所有单词的子串+最小覆盖的子串)Java
算法·leetcode·职场和发展