热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LeetCode155最小栈(优先队列/巧妙的解法)

看起来挺简单,但是写起来才有坑。模仿java里面的栈1、用数组存放元素2、设置size和index,push和pop只需要移动index就好了,不需要处理元素。3、初始化为16,如

看起来挺简单,但是写起来才有坑。

模仿java里面的栈

1、用数组存放元素

2、设置size和index,push和pop只需要移动index就好了,不需要处理元素。

3、初始化为16,如果满了要扩容到2倍,为了偷懒,数组只增不减。

最后就是处理min的问题,原来想着提供一个min变量,每次插入的时候更新min即可。

但是如果刚好pop了一个min呢?上一个min是多少?

当然可以使用一个secondMin变量,但是连续pop两个呢?上上个呢?

所以使用变量不行。

因为只需要在获取的时候是常数,维护min不做限制,那么使用优先队列就好了。

注意在pop的时候,要注意pop的是不是最小值,是的话有限队列也要poll

没进行出错处理,比如pop到负数,但是题目本身也没这样的操作。过了

class MinStack {

    int size;
        int index;

        //只有一个min,或者两个min,不能实现该功能
        //如果pop了一个min,没法获取之前的最小值了

        //使用最小堆就好了
        PriorityQueue min;

        int [] array;


            /** initialize your data structure here. */
            // 初始化给16
            public MinStack() {
                size = 16;
                index = 0;
                array = new int [16];
                min = new PriorityQueue<>();
            }

            public void push(int x) {
                //扩容
                if(index==size-1){
                    size*=2;
                    int [] temp = new int [size];
                    int ori = size/2;
                    for(int i=0;i){
                        temp[i]=array[i];
                    }
                    array = temp;
                }

                array[index++]=x;
                min.add(x);

            }

            public void pop() {
                int temp = array[--index];
                //如果pop掉的是最小值,那么队列也要删掉一个最小值
                if(temp==getMin()){
                    min.poll();
                }
            }

            public int top() {
                return array[index-1];
            }

            public int getMin() {
                return min.peek();
            }
}

技术分享图片

排第一的答案很有趣!是自定义的数据结构来维护min值!

使用了一个栈来保存Pair

技术分享图片

Pair是当前值val对应的min值

技术分享图片

每次push的时候更新min值,然后创建Pair,压栈

技术分享图片

因为用的是栈,就算是同一个数字,后入和先入的也能区分不同的min。

而且这个栈st和题目要求的栈刚好可以同步pop,也算巧妙吧!

LeetCode155-最小栈(优先队列/巧妙的解法)


推荐阅读
  • LeetCode 102 - 二叉树层次遍历详解
    本文详细解析了LeetCode第102题——二叉树的层次遍历问题,提供了C++语言的实现代码,并对算法的核心思想和具体步骤进行了深入讲解。 ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 使用 ModelAttribute 实现页面数据自动填充
    本文介绍了如何利用 Spring MVC 中的 ModelAttribute 注解,在页面跳转后自动填充表单数据。主要探讨了两种实现方法及其背后的原理。 ... [详细]
  • 本文详细对比了HashMap和HashTable在多线程环境下的安全性、对null值的支持、性能表现以及方法同步等方面的特点,帮助开发者根据具体需求选择合适的数据结构。 ... [详细]
  • 本文提供了一个关于AC自动机(Aho-Corasick Algorithm)的详细解析与实现方法,特别针对P3796题目进行了深入探讨。文章不仅涵盖了AC自动机的基本概念,还重点讲解了如何通过构建失败指针(fail pointer)来提高字符串匹配效率。 ... [详细]
  • 本报告记录了嵌入式软件设计课程中的第二次实验,主要探讨了使用KEIL V5开发环境和ST固件库进行GPIO控制及按键响应编程的方法。通过实际操作,加深了对嵌入式系统硬件接口编程的理解。 ... [详细]
  • 来自FallDream的博客,未经允许,请勿转载,谢谢。一天一套noi简直了.昨天勉强做完了noi2011今天教练又丢出来一套noi ... [详细]
  • 使用 Babylon.js 实现地球模型与切片地图交互(第三部分)
    本文继续探讨在上一章节中构建的地球模型基础上,如何通过自定义的 `CameraEarthWheelControl` 类来实现更精细的地图缩放控制。我们将深入解析该类的实现细节,并展示其在实际项目中的应用。 ... [详细]
  • 使用jQuery与百度地图API实现地址转经纬度功能
    本文详细介绍了如何利用jQuery和百度地图API将地址转换为经纬度,包括申请API密钥、页面构建及核心代码实现。 ... [详细]
  • SPFA算法详解与应用
    当图中包含负权边时,传统的最短路径算法如Dijkstra不再适用,而Bellman-Ford算法虽然能解决问题,但其时间复杂度过高。SPFA算法作为一种改进的Bellman-Ford算法,能够在多数情况下提供更高效的解决方案。本文将详细介绍SPFA算法的原理、实现步骤及其应用场景。 ... [详细]
  • 深入解析Unity3D游戏开发中的音频播放技术
    在游戏开发中,音频播放是提升玩家沉浸感的关键因素之一。本文将探讨如何在Unity3D中高效地管理和播放不同类型的游戏音频,包括背景音乐和效果音效,并介绍实现这些功能的具体步骤。 ... [详细]
  • 深入理解线程池及其基本实现
    本文探讨了线程池的概念、优势及其在Java中的应用。通过实例分析不同类型的线程池,并指导如何构建一个简易的线程池。 ... [详细]
  • Asynchronous JavaScript and XML (AJAX) 的流行很大程度上得益于 Google 在其产品如 Google Suggest 和 Google Maps 中的应用。本文将深入探讨 AJAX 在 .NET 环境下的工作原理及其实现方法。 ... [详细]
  • 本文探讨了异步编程的发展历程,从最初的AJAX异步回调到现代的Promise、Generator+Co以及Async/Await等技术。文章详细分析了Promise的工作原理及其源码实现,帮助开发者更好地理解和使用这一重要工具。 ... [详细]
  • ASP.NET 进度条实现详解
    本文介绍了如何在ASP.NET中使用HTML和JavaScript创建一个动态更新的进度条,并通过Default.aspx页面进行展示。 ... [详细]
author-avatar
pbird
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有