• leetcode - 学习计划之剑指offer


    剑指 Offer 30. 包含min函数的栈

    力扣,定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

    示例:

    MinStack minStack = new MinStack();
    minStack.push(-2);
    minStack.push(0);
    minStack.push(-3);
    minStack.min();   --> 返回 -3.
    minStack.pop();
    minStack.top();      --> 返回 0.
    minStack.min();   --> 返回 -2. 

     解题

    一:辅助栈,_memo记录元素,_help记录push后的最小元素,只需要将当前push进_memo的值与_help的栈顶元素比较取较小即可。出栈的时候,两个栈顶元素一起出,则pop后的栈顶元素依旧是原值,以及对应的最小值。

    1. class MinStack(object):
    2. def __init__(self):
    3. """
    4. initialize your data structure here.
    5. """
    6. self._memo = []
    7. self._help = []
    8. self._help.append(float("inf"))
    9. def push(self, x):
    10. """
    11. :type x: int
    12. :rtype: None
    13. """
    14. self._memo.append(x)
    15. self._help.append(min(x, self._help[-1]))
    16. def pop(self):
    17. """
    18. :rtype: None
    19. """
    20. self._memo.pop()
    21. self._help.pop()
    22. def top(self):
    23. """
    24. :rtype: int
    25. """
    26. return self._memo[-1]
    27. def min(self):
    28. """
    29. :rtype: int
    30. """
    31. return self._help[-1]

    二:只用一个栈

    • 存入(push):
      • _memo[-1] = 当前值x - 之前的最小值_min(_min【before push】)
      • 更新最小值_min = min(x, _min)
        •   当x >= _min【before push】时,_memo[-1] >= 0, _min【after push】= _min【before push】
        • 当x < _min【before push】时,_memo[-1] < 0, _min【after push】= x
    • 推出(pop):
      • _memo[-1](v) >= 0 时,_memo[-1]对应的push的原值x必然不小于之前的最小值,所以最小值无须更新
      • v < 0时,v 对应的push的原值x必然小于之前的最小值,也即当push之后,_min【after push】不再能代表最小值,需要还原该状态的最小值_min【before push】,该状态存入的栈顶元素v = x(_min【after push】) - 之前的最小值_min(_min【before push】),其中_min【after push】记录的就是_memo[-1]对应的push的原值x,则之前的最小值_min【before push】= _min【after push】- v
    • 栈顶top:
      •  _memo[-1] (v)>= 0时,此时的最小值_min【after push】就是push之前的最小值_min【before push】,所以依照存入反推x =  之前的最小值_min(_min【after push】)+ v
      • v < 0时,_min【after push】记录的就是_memo[-1]对应的push的原值x,则x = _min【after push】
    1. class MinStack(object):
    2. def __init__(self):
    3. """
    4. initialize your data structure here.
    5. """
    6. self._memo = []
    7. self._min = None
    8. def push(self, x):
    9. """
    10. :type x: int
    11. :rtype: None
    12. """
    13. if len(self._memo) == 0:
    14. self._memo.append(0)
    15. self._min = x
    16. else:
    17. self._memo.append(x - self._min)
    18. self._min = min(self._min, x)
    19. def pop(self):
    20. """
    21. :rtype: None
    22. """
    23. v = self._memo.pop()
    24. # v >= 0,代表加入的元素不大于未加入前的最小值,所以推出后,最小值不变
    25. # v < 0,代表加入的元素小于未加入前的最小值,则加入后最小值会更新为新加入的元素
    26. # 需要还原为未加入前的最小值
    27. # 存入栈的栈顶元素 = x[加入后最小值] - 未加入前的最小值
    28. # 未加入前的最小值(_min) = x[加入后最小值](_min) - 存入栈的栈顶元素(v)
    29. if v < 0:
    30. self._min = self._min - v
    31. def top(self):
    32. """
    33. :rtype: int
    34. """
    35. v = self._memo[-1]
    36. if v >= 0:
    37. return v + self._min
    38. else:
    39. return self._min
    40. def min(self):
    41. """
    42. :rtype: int
    43. """
    44. return self._min

     

  • 相关阅读:
    基于pytorch预训练模型使用Faster RCNN调用摄像头进行目标检测【无敌详细!简单!超少代码!】
    【springboot日志】logback.xml常用配置详解
    SpringBoot接受请求参数
    Svg Flow Editor 原生svg流程图编辑器(一)
    java计算机毕业设计基于安卓Android微信小程序的应急求救信息发布系统小程序uniAPP
    CentOS 7 安装 MySQL8.0
    【C++】适配器模式 - - stack/queue/deque
    springboot基础(34):Elasticsearch的基本操作
    【博客475】alertmanager集群如何同步数据
    如何低门槛开发有趣实用的ZigBee产品?
  • 原文地址:https://blog.csdn.net/qq_xuanshuang/article/details/126110828