算法训练营day50(补),单调栈2

// 503. 下一个更大元素 II

func nextGreaterElements(nums []int) []int {

  n := len(nums)

  result := make([]int, n)

  for i := 0; i < n; i++ {

    result[i] = -1

  }

  stack := make([]int, 0)

  //因为收尾相连,采用i%2运算实现循环

  for i := 0; i < 2*n; i++ {

    j := i % n

    for len(stack) > 0 && nums[j] > nums[stack[len(stack)-1]] {

      index := stack[len(stack)-1]

      stack = stack[:len(stack)-1]

      result[index] = nums[j]

    }

    stack = append(stack, j)

  }

  return result

}

//42. 接雨水

func trap(height []int) int {

  n := len(height)

  stack := make([]int, 1, n)

  sum := 0

  for i := 1; i < n; i++ {

    if height[i] == height[stack[len(stack)-1]] {

      stack = stack[:len(stack)-1]

    } else {

      for len(stack) > 0 && height[i] > height[stack[len(stack)-1]] {

        mid := stack[len(stack)-1]

        stack = stack[:len(stack)-1]

        if len(stack) > 0 {

          //求高度

          h := min(height[i], height[stack[len(stack)-1]]) - height[mid]

          //求宽度

          w := i - stack[len(stack)-1] - 1

          //求总面积

          sum += (h * w)

        }

      }

    }

    stack = append(stack, i)

  }

  return sum

}

func min(a, b int) int {

  if a < b {

    return a

  }

  return b

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值