题外话:
五月真是充满可能性的一个月。突然发现Leetcode在151-200这个区间Easy的题目好多!
题目:
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
- push(x) -- Push element x onto stack.
- pop() -- Removes the element on top of the stack.
- top() -- Get the top element.
- getMin() -- Retrieve the minimum element in the stack.
Example:
MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> Returns -3. minStack.pop(); minStack.top(); --> Returns 0. minStack.getMin(); --> Returns -2.
解题思路:
实现一个类似于栈的类,可以进行push、pop、top操作,除此之外还可以获取当前栈内元素的最小值getMin。如果使用vector实现,除了对栈内数据进行记录之外,还需要记录当前的最小值,即发生push和pop操作时,需要相应更新最小值,为了方便同样可以使用vector进行处理。
代码:
class MinStack {
public:
/** initialize your data structure here. */
vector<int> nums;
vector<int> min;
MinStack() {
nums.clear();
min.clear();
}
void push(int x) {
nums.insert(nums.begin(), x);
if(min.size() < 1)
min.push_back(x);
else
{
if(x < min[0])
min.insert(min.begin(), x);
else
min.insert(min.begin(), min[0]);
}
}
void pop() {
nums.erase(nums.begin());
min.erase(min.begin());
}
int top() {
return nums[0];
}
int getMin() {
return min[0];
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
代码的整体效率不高,然后改成vector的最后一个元素进行操作快了很多,优于98%+的C++代码。这跟vector插入元素的规则有关。优化代码如下:
class MinStack {
public:
/** initialize your data structure here. */
vector<int> nums;
vector<int> min;
int n; // element number
MinStack() {
nums.clear();
min.clear();
n = 0;
}
void push(int x) {
nums.push_back(x);
if(n < 1)
min.push_back(x);
else
{
if(x < min[n - 1])
min.push_back(x);
else
min.push_back(min[n - 1]);
}
n++;
}
void pop() {
nums.pop_back();
min.pop_back();
n--;
}
int top() {
return nums[n-1];
}
int getMin() {
return min[n-1];
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/
第一种思路,使用vector的insert接口,插入到vector的第一个元素,每进行插入操作就要将整个vector现有的所有元素都向后平移一个单位,每次进行erase操作,都要将剩余元素向前平移一个单位。因此,修改为从末尾开始操作效率会大幅提升。
题外话:
最近入坑一部新剧JA:QSDRDCL(没能抵制住>.<,上集末尾女主的一句话很对,我们总是在计划生活、计划我们的人生,然而生活中充满了意外,不可预测,而我们可以做的就是尽自己的努力去接受,然后继续向前。又鸡汤了~!