Brute force
class CustomStack:
def __init__(self, maxSize: int):
self.st = []
self.size = maxSize
def push(self, x: int) -> None:
if len(self.st) < self.size:
self.st.append(x)
def pop(self) -> int:
if len(self.st)> 0:
return self.st.pop()
else:
return -1
def increment(self, k: int, val: int) -> None:
for i in range(min(k,len(self.st))):
self.st[i] += val
Lazy incrementation
class CustomStack:
"""
main idea: lazy increment
use an additional array (self.inc) to record increment value. each time calling pop(), last item in self.inc need to add its value to its previous item before its popped out
"""
# tc O(1) sc O(1)
def __init__(self, maxSize: int):
self.st = []
self.size = maxSize
self.inc = [] # self.inc[i] : accumutive sum from self.st[0] ~ self.st[i](inclusive)
# tc O(1) sc O(N)
def push(self, x: int) -> None:
if len(self.st) < self.size:
self.st.append(x)
self.inc.append(0)
# tc O(1) sc O(N)
def pop(self) -> int:
if not self.st : return -1 # here inc's size is actually same as st
if len(self.st) > 1:
self.inc[-2] += self.inc[-1] # update second to last before popping last inc element out
return self.inc.pop() + self.st.pop()
# tc O(1) sc O(N)
def increment(self, k: int, val: int) -> None:
if self.inc:
self.inc[min(k,len(self.inc))-1] += val