代码随想录算法训练营第五十九天| 503.下一个更大元素II、42. 接雨水

代码随想录算法训练营第五十九天| 503.下一个更大元素II、42. 接雨水

503.下一个更大元素II

题目链接: 503.下一个更大元素II

解题代码

func nextGreaterElements(nums []int) []int {
    length := len(nums)
    result := make([]int,length,length)
    for i:=0;i<len(result);i++{
        result[i] = -1
    }
    //单调递减,存储数组下标索引
    stack := make([]int,0)
    for i:=0;i<length*2;i++{
        for len(stack)>0&&nums[i%length]>nums[stack[len(stack)-1]]{
            index := stack[len(stack)-1]
            stack = stack[:len(stack)-1] // pop
            result[index] = nums[i%length]
        }
        stack = append(stack,i%length)
    }
    return result
}

42. 接雨水

题目链接:42. 接雨水

解题代码

func trap(height []int) int {
   if len(height) <= 2 {
      return 0
   }
   st := make([]int, 1, len(height)) // 切片模拟单调栈,st存储的是高度数组下标
   var res int
   for i := 1; i < len(height); i++ {
      if height[i] < height[st[len(st)-1]] {
         st = append(st, i)
      } else if height[i] == height[st[len(st)-1]] {
         st = st[:len(st)-1] // 比较的新元素和栈顶的元素相等,去掉栈中的,入栈新元素下标
         st = append(st, i)
      } else {
         for len(st) != 0 && height[i] > height[st[len(st)-1]] {
            top := st[len(st)-1]
            st = st[:len(st)-1]
            if len(st) != 0 {
               tmp := (min(height[i], height[st[len(st)-1]]) - height[top]) * (i - st[len(st)-1] - 1)
               res += tmp
            }
         }
         st = append(st, i)
      }
   }
   return res
}


func min(x, y int) int {
   if x >= y {
      return y
   }
   return x
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值