牛客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 复制代码
在这里插入代码片
相关推荐
游是水里的游1 小时前
【算法day19】回溯:分割与子集问题
算法
不想当程序猿_1 小时前
【蓝桥杯每日一题】分糖果——DFS
c++·算法·蓝桥杯·深度优先
南城花随雪。1 小时前
单片机:实现FFT快速傅里叶变换算法(附带源码)
单片机·嵌入式硬件·算法
dundunmm1 小时前
机器学习之scikit-learn(简称 sklearn)
python·算法·机器学习·scikit-learn·sklearn·分类算法
古希腊掌管学习的神1 小时前
[机器学习]sklearn入门指南(1)
人工智能·python·算法·机器学习·sklearn
波音彬要多做1 小时前
41 stack类与queue类
开发语言·数据结构·c++·学习·算法
程序员老冯头4 小时前
第十五章 C++ 数组
开发语言·c++·算法
AC使者8 小时前
5820 丰富的周日生活
数据结构·算法
cwj&xyp9 小时前
Python(二)str、list、tuple、dict、set
前端·python·算法
xiaoshiguang313 小时前
LeetCode:222.完全二叉树节点的数量
算法·leetcode