算法训练 Day 58

LeetCode 739. 每日温度

题目链接:739. 每日温度

思路:本题可以使用暴力解法,两层for循环,但终归是不美,这种可以使用暴力解法搜索数组元素之间关系的情况,可以使用单调栈的思想。单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边(或左边)第一个比当前元素高的元素,因为存储了之前遍历的信息,所以单调栈只需要遍历一次。
本题是要找到一个元素的右边第一个比自身大的元素,所以我们应该使用递增栈。接下来有三种情况:

  • 当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况
    直接将当前遍历元素入栈。
  • 当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况
    因为本题要求的是大于自身的元素,所以等于的时候同第一种情况相同,入栈。
  • 当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况
    将栈顶元素弹出,并将当前遍历元素持续与新的栈顶元素比较,直到遇到上述两种情况或者该元素成为栈顶元素为止。

go版本:

func dailyTemperatures(temperatures []int) []int {
    n := len(temperatures)
    res := make([]int, n)
    stack := make([]int, 0)
    for i := 0; i < n; i++ {
        temp := temperatures[i]
        // 当前遍历的元素T[i]大于栈顶元素T[st.top()]
        for len(stack) > 0 && temp > temperatures[stack[len(stack)-1]] {
            prev := stack[len(stack)-1]
            stack = stack[:len(stack)-1]
            res[prev] = i - prev
        }
        stack = append(stack, i)
    }
    return res
}

LeetCode 496. 下一个更大元素 I

题目链接:496. 下一个更大元素 I

思路:本题与上一题思路一致,仍然使用递增的单调栈来做,但此题多了一些细节上的处理。
首先,我们需要根据题目要求初始化一个数组res用来存放结果,数组长度与nums1一样大小,并且全部初始化为-1。第二个关键就是,题目中说是两个没有重复元素的数组 nums1 和 nums2,那我们可以构建一个哈希表来存放nums1的值,这样之后循环判断的时候就可以根据数值快速找到其对应的下标,还可以判断nums2中的元素是否在nums1中出现过。
接下来同上一题一样,会遇到三种情况:

  • 当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况
    直接将当前遍历元素入栈。
  • 当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况
    因为本题要求的是大于自身的元素,所以等于的时候同第一种情况相同,入栈。
  • 当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况
    将栈顶元素弹出,并将当前遍历元素持续与新的栈顶元素比较,直到遇到上述两种情况或者该元素成为栈顶元素为止。这个地方还要明确一点,此时遍历的栈顶元素在nums2中右面第一个大的元素即是nums2[i],也就是当前的遍历元素。

go版本:

func nextGreaterElement(nums1 []int, nums2 []int) []int {
    res := make([]int, len(nums1))
    for i := range res {
        res[i] = -1
    }
    mp := map[int]int{}
    for i,v := range nums1 {
        mp[v] = i
    }

    stack := []int{}
    stack = append(stack, 0)

    for i:=1; i<len(nums2); i++ {
        for len(stack)>0 && nums2[i] > nums2[stack[len(stack)-1]] {
            top := stack[len(stack)-1]
            if _, ok := mp[nums2[top]]; ok {
                index := mp[nums2[top]];
                res[index] = nums2[i]
            }
            stack = stack[:len(stack)-1]
        }
        stack = append(stack, i)
    } 
    return res
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值