首页 > 其他分享 >456. 132 模式 Golang实现

456. 132 模式 Golang实现

时间:2024-10-31 11:30:58浏览次数:1  
标签:nums 元素 456 Golang 132 second stack 单调

题目描述:

给你一个整数数组 nums ,数组中共有 n 个整数。132 模式的子序列 由三个整数 nums[i]、nums[j] 和 nums[k] 组成,并同时满足:i < j < k 和 nums[i] < nums[k] < nums[j] 。

如果 nums 中存在 132 模式的子序列 ,返回 true ;否则,返回 false 。

示例 3:

输入:nums = [-1,3,2,0]
输出:true
解释:序列中有 3 个 132 模式的的子序列:[-1, 3, 2]、[-1, 3, 0] 和 [-1, 2, 0] 。

思路分析:

这个题是单调栈的经典应用,先了解下单调栈的用途和场景。

单调栈(Monotone Stack):一种特殊的栈。在栈的「先进后出」规则基础上,要求「从 栈顶 到 栈底 的元素是单调递增(或者单调递减)」。其中满足从栈顶到栈底的元素是单调递增的栈,叫做「单调递增栈」。满足从栈顶到栈底的元素是单调递减的栈,叫做「单调递减栈」。

  • 单调递增栈:
    单调递增栈:只有比栈顶元素小的元素才能直接进栈,否则需要先将栈中比当前元素小的元素出栈,再将当前元素入栈。
    这样就保证了:栈中保留的都是比当前入栈元素大的值,并且从栈顶到栈底的元素值是单调递增的。

这个题目:核心就是遍历一次数组,那么每次就固定一个数,寻找剩下满足要求的两个元素。用second记录中间大的值,然后维持栈的单调递减性。
例子: [3, 5, 0, 3, 4]

点击查看代码
func find132pattern(nums []int) bool {
    if len(nums) < 3 {
        return false
    }

    stack := []int{}
    //second的作用:候选的nums[k]值「第二大的值」
    second := int(^uint(0) >> 1) * -1

    // 逆序遍历
    for i := len(nums) - 1; i >= 0; i-- {
        //第一个有效的second必须是从栈顶元素弹出的,所以必然能保证可以正确找到三个元素
        if nums[i] < second {
            // 找到符合132模式的情况
            return true
        }

        // 更新second并维护栈的单调递减
        for len(stack) > 0 && nums[i] > stack[len(stack)-1] {
            second = stack[len(stack)-1] // 弹出栈顶作为新的second
            stack = stack[:len(stack)-1]
        }

        // 压入栈中,作为潜在的nums[j]
        stack = append(stack, nums[i])
    }

    return false
}

标签:nums,元素,456,Golang,132,second,stack,单调
From: https://www.cnblogs.com/CharlseGo/p/18517381

相关文章

  • golang编写代码发邮件
    AI提示词用go语言直接向mx记录的25端口发邮件,要采用STARTTLS连接方式,要包含Message-IDpackagemainimport("crypto/tls""fmt""log""math/rand""net""net/mail""net/smtp""st......
  • 在openwrt上跑golang程序
    1.安装Go语言、搭建开发环境https://blog.csdn.net/qq_38105536/article/details/1426351322.VMwareWorkstation部署最新版OpenWrt23.05.3https://blog.csdn.net/gtj0617/article/details/137706312桥接模式(负责物理网络连接状态),设置ip:192.168.0.11设置root密码root@Ope......
  • golang驱动系统打印机
    参考项目https://github.com/google/cloud-print-connector谷歌云打印机连接器cupslinux系统winspoolwindows系统https://github.com/lxn/winAWindowsAPIwrapperpackagefortheGoProgrammingLanguagehttps://github.com/antonlahti/go-winapiAWind......
  • P9994 [Ynoi Easy Round 2024] TEST_132
    题意给定平面上\(n\)个点,保证两两横纵坐标不同:对于所有横坐标为\(x\)的点,权值\(v_i=v_i^2\)。询问所有纵坐标为\(y\)的点的权值之和。\(n\le10^6\)。Sol根号分治,考虑对于所有横坐标相同的点分组。对于修改操作,若当前修改的组大小\(\leB\),那么直接暴力修......
  • 2024-2025-1 20231326 《计算机基础与程序设计》第四周总结
    2024-2025-120231326《计算机基础与程序设计》第四周总结目录2024-2025-120231326《计算机基础与程序设计》第四周总结课程答疑WSL2的安装问题作业中的问题作业格式问题AI工具的使用问题优秀作业课程答疑WSL2的安装问题如图所示,部分同学在WSL2中安装Ubuntu虚拟机时,报错err......
  • 市面上很火的1234567转成视频数字人,数字人克隆一比一复刻
    功能介绍:数字人克隆一比一复刻,效果媲美真人水平我们是支持单视频不限制时长,我们的是导入2K还是4K的视频模型,输出的也是2K/4K的会员期间无限量不限制创作条数,不限量克隆形象,非积分模式无限合成并非市面上那些数字人按分钟技费的设备需求:安卓9.0以上......
  • 市面上很火的1234567转成视频数字人,数字人克隆一比一复刻
    功能介绍:数字人克隆一比一复刻,效果媲美真人水平我们是支持单视频不限制时长,我们的是导入2K还是4K的视频模型,输出的也是2K/4K的会员期间无限量不限制创作条数,不限量克隆形象,非积分模式无限合成并非市面上那些数字人按分钟技费的设备需求:安卓9.0以上......
  • 92. 反转链表 II Golang实现
    题目描述:给你单链表的头指针head和两个整数left和right,其中left<=right。请你反转从位置left到位置right的链表节点,返回反转后的链表。思路分析:没到指定的位置范围时,直接进行链表的链接,然后到了需要转换的范围就将这些节点用一个栈保存,然后再利用栈的先入后出......
  • 142. 环形链表 II Golang实现
    #题目描述:给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如......
  • 2024-2025-1 20241325王向龙《计算机程序与设计》第五周学习总结
    这个作业属于哪个课程2024-2025-1-计算机基础与程序设计)这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK05这个作业的目标①Pep/9虚拟机②机器语言与汇编语言③算法与伪代码④测试:黑盒,白盒作业正文本博客链接https://www.cnblogs.com/wangxiang......