1381. Design a Stack With Increment Operation

Information

  • Diffculty: Medium

  • Created: 2020-03-15 11:55:07

  • Last Motified: 2020-03-15 11:55:07

  • Tags: Stack, Design

Intuition

For each operation, my solution would only use O(1) time. Since each time we would only increase the bottom k values, we could just mark the k and when we need to pop, do the increase.

Solution

class CustomStack:
    def __init__(self, maxSize: int):
        self.stack = []
        self.size = maxSize
        self.increase = []

    def push(self, x: int) -> None:
        if len(self.stack) == self.size:
            return
        self.stack.append(x)
        self.increase.append(0)

    def pop(self) -> int:
        if not self.stack:
            return -1

        inc = self.increase.pop()
        if self.increase:
            self.increase[-1] += inc
        return inc + self.stack.pop()

    def increment(self, k: int, val: int) -> None:
        if not self.stack or k == 0:
            return

        if k > len(self.stack):
            self.increase[-1] += val
        else:
            self.increase[k - 1] += val


# Your CustomStack object will be instantiated and called as such:
# obj = CustomStack(maxSize)
# obj.push(x)
# param_2 = obj.pop()
# obj.increment(k,val)