1. 问题分析与需求拆解
今天我们来深入探讨LeetCode第1381题——设计一个支持增量操作的栈。这道题看似简单,但其中蕴含着对栈这种基础数据结构的深刻理解和灵活运用。
首先明确题目要求:我们需要实现一个自定义栈结构,除了常规的push和pop操作外,还需要支持一个特殊操作——increment(k, val),该操作能够将栈底的前k个元素都增加val值。如果栈中元素不足k个,则对所有元素进行增量操作。
这个问题的核心挑战在于:
- 如何在保证常规栈操作O(1)时间复杂度的情况下
- 高效实现increment操作
- 处理各种边界条件(空栈、k值过大等)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础实现方案解析
2.1 直接遍历法
最直观的解决方案就是题目中给出的基于vector的实现:
cpp复制class CustomStack {
public:
vector<int> tr;
int ms;
CustomStack(int maxSize) {
ms = maxSize;
}
void push(int x) {
if(tr.size() < ms) tr.push_back(x);
}
int pop() {
if(tr.size() == 0) return -1;
int a = tr.back();
tr.pop_back();
return a;
}
void increment(int k, int val) {
int r = min(k, (int)tr.size());
for(int i = 0; i < r; i++) tr[i] += val;
}
};
这个实现的特点:
- 使用vector作为底层存储
- push和pop操作都是O(1)时间复杂度
- increment操作在最坏情况下是O(n)时间复杂度
注意:这里pop操作在栈为空时返回-1,这是一个常见的错误处理方式,但实际工程中可能需要更明确的错误处理机制。
2.2 复杂度分析
让我们分析一下这个实现
