题目
题目链接:
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;
}