剑指offer
都是栈相关的题目,python里栈用数组实现,主要用到append()、pop()
设计题要在__init__(self)里定义数组,self.stack=[],在下边的函数中使用时也要带上self.
09. 用两个栈实现队列(简单)
解题方法:用辅助栈实现先进先出,辅助栈的栈顶(数组中最后一个元素)就是队列的队头
30. 包含min函数的栈(简单)
难点:min函数的实现,即如何找到栈中的最小值
解题方法:
- 使用额外空间:用辅助栈存储主栈中的非严格降序,将辅助栈的栈顶与主栈中遍历到的数x对比,若x更小则压入栈中,这一步在push()函数中就要实现,同时注意如果最小值被pop()了,辅助栈中也要一起pop()
- 不使用额外空间——保存差值法 :用minv存当前最小值,push(x)存的是传入参数x与当前最小值的差值。当pop()出的数是负数(说明最小值被pop())时,将minv更新为当前最小值 - 栈顶,即做还原操作。返回栈顶top()时,如果top非负(说明比最小值大),需要加上minv还原为原来的值;top小于0表示上一次x比min小,x的值已经被赋给min了,所以可以直接用min
Leetcode75
都是数组相关题目,主要解法是前缀和
1480. 一维数组的动态和(简单)
解法:nums[i]=nums[i-1]+nums[i]
724. 寻找数组的中心下标(简单)
解题核心:数组所有元素之和为total,nums[i]左侧元素之和为 sum,则其右侧元素之和为 total−nums[i]−sum。左右侧元素相等即为 sum=total−nums[i]−sum,即nums[i]=total-2*sum