LeetCode 1381. 设计一个支持增量操作的栈
题目描述
思路分析
解法一:栈 + 延迟增量数组(推荐)
核心思路:
- 用数组保存栈元素,用
inc[i]记录对前 i 个元素的延迟增量。increment(k, val)只在inc[k-1]处累加,等出栈时再下放。pop时把inc[top]加到元素上,并将增量传递给inc[top-1]。
复杂度分析:
- 时间复杂度:O(1) 每次操作。
- 空间复杂度:O(n)。
class CustomStack {
private final int[] stack;
private final int[] inc;
private int size;
public CustomStack(int maxSize) {
stack = new int[maxSize];
inc = new int[maxSize];
size = 0;
}
public void push(int x) {
if (size == stack.length) {
return;
}
stack[size++] = x;
}
public int pop() {
if (size == 0) {
return -1;
}
int i = size - 1;
int res = stack[i] + inc[i];
if (i > 0) {
inc[i - 1] += inc[i];
}
inc[i] = 0;
size--;
return res;
}
public void increment(int k, int val) {
int i = Math.min(k, size) - 1;
if (i >= 0) {
inc[i] += val;
}
}
}
type CustomStack struct {
stack []int
inc []int
size int
}
func Constructor(maxSize int) CustomStack {
return CustomStack{
stack: make([]int, maxSize),
inc: make([]int, maxSize),
size: 0,
}
}
func (cs *CustomStack) Push(x int) {
if cs.size == len(cs.stack) {
return
}
cs.stack[cs.size] = x
cs.size++
}
func (cs *CustomStack) Pop() int {
if cs.size == 0 {
return -1
}
i := cs.size - 1
res := cs.stack[i] + cs.inc[i]
if i > 0 {
cs.inc[i-1] += cs.inc[i]
}
cs.inc[i] = 0
cs.size--
return res
}
func (cs *CustomStack) Increment(k int, val int) {
i := k
if i > cs.size {
i = cs.size
}
i--
if i >= 0 {
cs.inc[i] += val
}
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 155. 最小栈 | 中等 | 栈 |
| 716. 最大栈 | 困难 | 栈 |
| 225. 用队列实现栈 | 简单 | 设计 |
| 232. 用栈实现队列 | 简单 | 设计 |
| 146. LRU 缓存 | 中等 | 设计 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!