• [Leetcode][Algo]155. Min Stack


    这道题目跟之前那个MAX stack是一毛一样的。

    从去年10月份自己写过一会以后前两天都没有重写一遍。今天按照之前的思路写了一下这个min stack,发现思路上出现很多问题。

    1. 试图用min_value 作为最小值是否被弹出的依据。这样总是出错,最小值有可能不唯一。好比说栈里面有多个相等的最小值。

    2. 记录上一个最小的index思维混乱了。应该要建立一个数组:

    link2NextMinValue[], 里面的index-索引,应该是当前插入元素在栈内位置,也就是说这个数组应该是和栈数组同步增长的。

    而这个数组的内容,应该是上一个最小值的index。如果该位置元素不是最小值,就赋值为-1.

    然后一直保存一个局部变量,是当前最小值的index。

    3. 每次弹出的时候,只要判断当前栈顶是否是最小index,如果是,就把当前的最小值index更新成link2NextMinValue[]里存的前一个最小值index就可以。

    4. 用数组实现栈,其实操作数组的下标。pop操作,并不会真的删除。但是如果pop后重新写入了,那个原来的元素会被覆盖。

    5. 还有一个边界值的问题。

    minValue的默认值是INT_MAX

    如果第一个入队的就是INT_MAX, 高亮的判断条件如果是"<" 不是"<="的话,minValueIndex就不会被赋值,就是-1,那么后面再用这个作为index取最小值的时候就会出错

     void push(int x) {
    
            stackValue[++stackTop] = x;
            if(x <= minValue()){
                link2NextMinValue[stackTop] = minValueIndex;
                minValueIndex = stackTop;
            }
            else
                link2NextMinValue[stackTop] = -1;
        }
        int minValue(){
            if(minValueIndex >= 0){
                return stackValue[minValueIndex]; //返回当前最大值
            }
            else{
                return INT_MAX;
            }
        } 
  • 相关阅读:
    JVM内存区域类别
    ConcurrentHashMap初探
    一张图理解RACSignal的Subscription过程
    ObjC的Block中使用weakSelf/strongSelf @weakify/@strongify
    自己写简单CoreDataManager封装对CoreData操作
    [转]layoutSubviews总结
    [转]日期格式化(yyyy-MM-dd)中,为什么 M 多大写?
    Native App执行JS
    Mac下配置Maven
    Mac OS X中配置Apache
  • 原文地址:https://www.cnblogs.com/hopping/p/8627911.html
Copyright © 2020-2023  润新知