牛客2024【牛客&赛文X】春招冲刺 ONT75 下一个更大的数(二) 【中等 单调栈 Java、Go、PHP】

题目

在这里插入图片描述题目链接:
https://www.nowcoder.com/practice/3923970e95b140fdb65e6c00bcda403d

思路

	单调栈

参考答案Java

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型ArrayList
     * @return int整型ArrayList
     */
    public ArrayList<Integer> nextBigger (ArrayList<Integer> nums) {
        //单调栈
        //本题用单调递减栈
        int n = nums.size();
        int[] arr = new int[n * 2];
        for (int i = 0; i < n ; i++) {
            arr[i] = nums.get(i);
            arr[i + n] = nums.get(i);
        }

        int[][] bigarr = new int[n * 2][2];
        Stack<List<Integer>> stack = new Stack<>(); //栈顶到栈底依次上升
        for (int i = 0; i < arr.length ; i++) {

            while (!stack.isEmpty() &&
                    arr[stack.peek().get(stack.peek().size() - 1)] < arr[i]) {
                List<Integer> pops = stack.pop();
                int leftBig = stack.isEmpty() ? -1 : stack.peek().get(stack.peek().size() - 1);

                for (Integer pop : pops) {
                    bigarr[pop][0] = leftBig; //左边第一个比i大的位置
                    bigarr[pop][1] = i; //右边第一个比i大的位置
                }
            }
            if (!stack.isEmpty() &&
                    arr[stack.peek().get(stack.peek().size() - 1)] ==  arr[i]) {
                stack.peek().add(i);
            } else {
                List<Integer> ll = new ArrayList<>();
                ll.add(i);
                stack.add(ll);
            }
        }

        while (!stack.isEmpty()) {
            List<Integer> pops = stack.pop();
            int leftBig = stack.isEmpty() ? -1 : stack.peek().get(stack.peek().size() - 1);
            for (Integer pop : pops) {
                bigarr[pop][0] = leftBig;
                bigarr[pop][1] = -1;
            }
        }


        //int[] help = new int[n];
        ArrayList<Integer> ans = new ArrayList<>();
        for (int i = 0; i < n ; i++) {
            //help[i] = bigarr[i][1] ==-1 ? -1: arr[bigarr[i][1]];
            ans.add(bigarr[i][1] == -1 ? -1 : arr[bigarr[i][1]]);
        }
        return ans;
    }
}

参考答案Go

package main



/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param nums int整型一维数组
 * @return int整型一维数组
 */
func nextBigger(nums []int) []int {
	//单调栈
	//单调递减栈,因为栈顶到栈底递增的

	n := len(nums)
	arr := make([]int, n*2)

	for i := 0; i < n; i++ {
		arr[i] = nums[i]
		arr[i+n] = nums[i]
	}

	//单调栈的通用模板开始
	bigarr := make([][]int, len(arr))
	stack := [][]int{}

	for i := 0; i < len(arr); i++ {
		size := len(stack)
		for size > 0 && arr[stack[size-1][len(stack[size-1])-1]] < arr[i] {
			pops := stack[size-1]

			stack = stack[:size-1]

			size = len(stack)

			leftbig := -1
			if size > 0 {
				leftbig = stack[size-1][len(stack[size-1])-1]
			}

			for _, v := range pops {
				bigarr[v] = make([]int, 2)
				bigarr[v][0] = leftbig //v左边边第一个比v位置大的位置是i
				bigarr[v][1] = i       //v右边第一个比v位置大的位置是i
			}
		}

		size = len(stack)
		if size > 0 && arr[stack[size-1][len(stack[size-1])-1]] == arr[i] {
			stack[size-1] = append(stack[size-1], i)
		} else {
			ll := []int{}
			ll = append(ll, i)

			stack = append(stack, ll)
		}
	}

	for len(stack) > 0 {
		size := len(stack)
		pops := stack[size-1]

		stack = stack[:size-1]

		size = len(stack)

		leftbig := -1
		if size > 0 {
			leftbig = stack[size-1][len(stack[size-1])-1]
		}

		for _, v := range pops {
			bigarr[v] = make([]int, 2)
			bigarr[v][0] = leftbig
			bigarr[v][1] = -1
		}
	}
	//单调栈的通用模板结束

	ans := make([]int, n)

	for i := 0; i < n; i++ {
		if bigarr[i][1] == -1 {
			ans[i] = -1
		} else {
			ans[i] = arr[bigarr[i][1]]
		}
	}

	return ans
}

参考答案PHP

<?php


/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @return int整型一维数组
 */
function nextBigger( $nums )
{
   //单调栈
    //单调递减栈,因为栈顶到栈底递增的

    $n = count($nums);
    $arr = array();

    for ($i=0;$i<$n;$i++){
        $arr[$i] = $nums[$i];
        $arr[$i+$n] = $nums[$i];
    }

    //下面的数组的值[[v1,v2],[v1,v2],[v1,v2]] v1表示位置i 左边第一个大于i位置的位置
    //v2表示位置i 右边第一个大于i位置的位置

    //php单调栈的通用模板开始
    $bigarr = array();

    $stack = array(); //php中栈用数组表示

    for($i=0;$i<count($arr);$i++){
        $len = count($stack);
        while ($len >0 && $arr[$stack[$len-1][count($stack[$len-1])-1]] < $arr[$i]){
            $pops = array_pop($stack);
            $len = count($stack);

            $leftbig = -1;
            if($len >0){
                $leftbig = $stack[$len-1][count($stack[$len-1])-1];
            }

            foreach ($pops as $v){
                $bigarr[$v][0] = $leftbig;
                $bigarr[$v][1] =$i;
            }
        }

        $len = count($stack);
        if($len >0 && $arr[$stack[$len-1][count($stack[$len-1])-1]] == $arr[$i]){
            $stack[$len-1][count($stack[$len-1])] = $i;
        }else{
            $ll = [$i];
            $stack[count($stack)] = $ll;
        }
    }

    while (count($stack) >0){
        $pops = array_pop($stack);
        $leftbig = -1;
        $len = count($stack);

        if($len >0){
            $leftbig = $stack[$len-1][count($stack[$len-1])-1];
        }

        foreach ($pops as $v){
            $bigarr[$v][0] = $leftbig;
            $bigarr[$v][1] =-1;
        }
    }

    //php单调栈的通用模板结束
    $ans = array();
    for($i=0;$i<$n;$i++){
        $ans[$i] = $bigarr[$i][1] ==-1 ? -1: $arr[$bigarr[$i][1]];
    }

    return $ans;
}
  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵长辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值