首页 > 试题广场 >

单调栈结构

[编程题]单调栈结构
  • 热度指数:3575 时间限制:C/C++ 4秒,其他语言8秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个不含有重复值的数组 arr,找到每一个 i 位置左边和右边离 i 位置最近且值比 arr[i] 小的位置。返回所有位置相应的信息。


输入描述:
第一行输入一个数字 n,表示数组 arr 的长度。

以下一行输出 n个数字,表示数组的值。


输出描述:
输出n行,每行两个数字 L 和 R,如果不存在,则值为-1,下标从0开始。
示例1

输入

7
3 4 1 5 6 2 7

输出

-1 2
0 2
-1 -1
2 5
3 5
2 -1
5 -1

备注:

function solution(n, nums) {
//   初始化结果数组和单调栈
  const res = new Array(n), stack = []
  let popIndex, leftLessIndex
//   遍历给定的数组
//   因为结果是求数组中每个位置的左右较小的位置,所以单调栈从顶向下应该是递减的
  for (let i = 0; i < n; i++) {
//     违反单调栈的结构时,需要弹出栈顶,并且将当前位置压入
    while (stack.length && nums[stack[stack.length - 1]] > parseInt(nums[i])) {
      popIndex = stack.pop()
      leftLessIndex = stack.length ? stack[stack.length - 1] : -1
      res[popIndex] = [leftLessIndex, i]
    }
    stack.push(i)
  }
//   栈中还有元素,说明即使遍历完数组也没有比栈中剩余的元素小的元素,所以其右边没有比栈中剩余元素小的元素
  while (stack.length) {
    popIndex = stack.pop()
    leftLessIndex = stack.length ? stack[stack.length - 1] : -1
    res[popIndex] = [leftLessIndex, -1]
  }
  return res
}
let n = parseInt(readline())
let nums = readline().split(' ')
let result = solution(n, nums)
for (let i = 0; i < n; i++) {
  print(result[i][0] + ' ' + result[i][1])
}

发表于 2021-08-30 11:05:31 回复(0)

问题信息

上传者:小小
难度:
1条回答 5429浏览

热门推荐

通过挑战的用户

查看代码