• 单调栈应用--视野总和 go版本


    1.视野总和
    描叙:有n个人站队,所有的人全部向右看,个子高的可以看到个子低的发型,给出每个人的身高,问所有人能看到其他人发现总和是多少。
    输入:4 3 7 1
    输出:2
    解释:个子为4的可以看到个子为3的发型,个子为7可以看到个子为1的身高,所以1+1=2
    思路:观察题之后,我们发现实际上题目转化为找当前数字向右查找的第一个大于他的数字之间有多少个数字,然后将每个结果累计就是答案,但是这里时间复杂度为O(N^2),所以我们使用单调栈来解决这个问题。

    1.设置一个单调递增的栈(栈内0~n为单调递减)
    2.当遇到大于栈顶的元素,开始更新之前不高于当前人所能看到的值

     详细分析参考: https://blog.csdn.net/lucky52529/article/details/89155694

    func fieldSum(a []int) int {
        sum := 0
        var stack []int
        // 这里可以理解为需要一个无限高的人挡住栈中的人,不然栈中元素最后无法完全出栈
        a = append(a, math.MaxInt64)
    
    
        for i := 0; i< len(a); i++{
            if len(stack) == 0 || a[i] < a[stack[len(stack)-1]] {
                // index入栈
                stack = append(stack, i)
            } else {
                for len(stack) > 0 && a[i] >= a[stack[len(stack)-1]] {
                    top :=  stack[len(stack)-1]
                    // 出栈
                    stack = stack[0: len(stack) - 1]
                    sum += i - top - 1
                }
    
                stack = append(stack, i)
            }
        }
    
        return sum
    }
     
     
  • 相关阅读:
    高级搜索
    Hibernate通过什么方法可以把私有成员变量赋值成数据库查询到的值然后返回POJO对象呢?
    hibernate继承关系映射和java反射机制的运用
    eclipse启动停止--jdk环境变量配置
    visual studio 正则表达式 查找 替换
    常用正则表达式
    解决兼容的方法!
    JS的定时器和JS的执行机制
    2020年3月2日随笔
    2020年2月12日 线上笔记
  • 原文地址:https://www.cnblogs.com/xuhuaiqu/p/14404270.html
Copyright © 2020-2023  润新知