首页 > 试题广场 >

单调栈

[编程题]单调栈
  • 热度指数:7363 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个长度为 n 的可能含有重复值的数组 nums,找到每一个位置 i 左边最近的位置 l 和右边最近的位置 r ,nums_lnums_r 比 nums_i 小。

请设计算法,返回一个二维数组,表示所有位置相应的信息。位置信息包括:两个数字 l 和 r。如果不存在,则值为 -1,下标从 0 开始。

数据范围: ,-10^9 \le nums_i \le 10^9
进阶:空间复杂度 ,时间复杂度

示例1

输入

[3,4,1,5,6,2,7]

输出

[[-1,2],[0,2],[-1,-1],[2,5],[3,5],[2,-1],[5,-1]]
示例2

输入

[1,1,1,1]

输出

[[-1,-1],[-1,-1],[-1,-1],[-1,-1]]
package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int一维数组 
 * @return int二维数组
*/
func foundMonotoneStack( nums []int ) [][]int {
    n:=len(nums)
    ans:=make([][]int,n)
    for i,_:=range ans{
        ans[i]=[]int{-1,-1}
    }
    stk1:=[]int{}
    stk2:=[]int{}
    for i,j:=0,n-1;i<n&&j>=0;i,j=i+1,j-1{
        for len(stk1)>0&&nums[stk1[len(stk1)-1]]>nums[i]{
            ans[stk1[len(stk1)-1]][1]=i
            stk1=stk1[:len(stk1)-1]
        }
        stk1=append(stk1,i)
        for len(stk2)>0&&nums[stk2[len(stk2)-1]]>nums[j]{
            ans[stk2[len(stk2)-1]][0]=j
            stk2=stk2[:len(stk2)-1]
        }
        stk2=append(stk2,j)
    }
    return ans
}

发表于 2023-03-09 00:47:35 回复(0)

问题信息

上传者:牛客301499号
难度:
1条回答 3236浏览

热门推荐

通过挑战的用户

查看代码