LeetCode 题解工作台
设计一个支持增量操作的栈
请你设计一个支持对其元素进行增量操作的栈。 实现自定义栈类 CustomStack : CustomStack(int maxSize) :用 maxSize 初始化对象, maxSize 是栈中最多能容纳的元素数量。 void push(int x) :如果栈还未增长到 maxSize ,就将 x…
3
题型
5
代码语言
3
相关题
当前训练重点
中等 · 栈·状态
答案摘要
我们可以用一个数组 来模拟栈,用一个整数 表示下一个入栈的元素位置。另外,我们还需要一个数组 来记录每个位置上的增量累加值。 调用 时,如果 $i \lt maxSize$,我们将 放入 中,并将 加一。
Interview AiBoxInterview AiBox 实时 AI 助手,陪你讲清 栈·状态 题型思路
题目描述
请你设计一个支持对其元素进行增量操作的栈。
实现自定义栈类 CustomStack :
CustomStack(int maxSize):用maxSize初始化对象,maxSize是栈中最多能容纳的元素数量。void push(int x):如果栈还未增长到maxSize,就将x添加到栈顶。int pop():弹出栈顶元素,并返回栈顶的值,或栈为空时返回 -1 。void inc(int k, int val):栈底的k个元素的值都增加val。如果栈中元素总数小于k,则栈中的所有元素都增加val。
示例:
输入: ["CustomStack","push","push","pop","push","push","push","increment","increment","pop","pop","pop","pop"] [[3],[1],[2],[],[2],[3],[4],[5,100],[2,100],[],[],[],[]] 输出: [null,null,null,2,null,null,null,null,null,103,202,201,-1] 解释: CustomStack stk = new CustomStack(3); // 栈是空的 [] stk.push(1); // 栈变为 [1] stk.push(2); // 栈变为 [1, 2] stk.pop(); // 返回 2 --> 返回栈顶值 2,栈变为 [1] stk.push(2); // 栈变为 [1, 2] stk.push(3); // 栈变为 [1, 2, 3] stk.push(4); // 栈仍然是 [1, 2, 3],不能添加其他元素使栈大小变为 4 stk.increment(5, 100); // 栈变为 [101, 102, 103] stk.increment(2, 100); // 栈变为 [201, 202, 103] stk.pop(); // 返回 103 --> 返回栈顶值 103,栈变为 [201, 202] stk.pop(); // 返回 202 --> 返回栈顶值 202,栈变为 [201] stk.pop(); // 返回 201 --> 返回栈顶值 201,栈变为 [] stk.pop(); // 返回 -1 --> 栈为空,返回 -1
提示:
1 <= maxSize, x, k <= 10000 <= val <= 100- 每种方法
increment,push以及pop分别最多调用1000次
解题思路
方法一:数组模拟
我们可以用一个数组 来模拟栈,用一个整数 表示下一个入栈的元素位置。另外,我们还需要一个数组 来记录每个位置上的增量累加值。
调用 时,如果 ,我们将 放入 中,并将 加一。
调用 时,如果 ,说明栈为空,返回 。否则我们将 减一,答案为 ,然后我们将 加上 ,并将 清零。最后返回答案。
调用 时,如果 ,我们将 加上 。
时间复杂度 ,空间复杂度 。其中 是栈的最大容量。
class CustomStack:
def __init__(self, maxSize: int):
self.stk = [0] * maxSize
self.add = [0] * maxSize
self.i = 0
def push(self, x: int) -> None:
if self.i < len(self.stk):
self.stk[self.i] = x
self.i += 1
def pop(self) -> int:
if self.i <= 0:
return -1
self.i -= 1
ans = self.stk[self.i] + self.add[self.i]
if self.i > 0:
self.add[self.i - 1] += self.add[self.i]
self.add[self.i] = 0
return ans
def increment(self, k: int, val: int) -> None:
i = min(k, self.i) - 1
if i >= 0:
self.add[i] += 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)
复杂度分析
| 指标 | 值 |
|---|---|
| 时间 | O(1) |
| 空间 | O(\text{maxSize}) |
面试官常问的追问
外企场景- question_mark
Checking if you optimize increment to avoid O(n) per operation.
- question_mark
Expecting proper handling of maxSize and empty stack cases.
- question_mark
Looking for clear separation of array state and increment tracking to ensure correctness.
常见陷阱
外企场景- error
Applying increment directly on all k elements causes O(n) time per increment.
- error
Forgetting to check stack size before push, causing overflow.
- error
Returning wrong value on pop when stack is empty instead of -1.
进阶变体
外企场景- arrow_right_alt
Implement the stack without using extra increment array but with higher increment time complexity.
- arrow_right_alt
Allow decrement operations for the bottom k elements instead of increment.
- arrow_right_alt
Support dynamic resizing of the stack beyond a fixed maxSize while keeping increment efficient.