LeetCode | 155. Min Stack


题外话:

    五月真是充满可能性的一个月。突然发现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(没能抵制住>.<,上集末尾女主的一句话很对,我们总是在计划生活、计划我们的人生,然而生活中充满了意外,不可预测,而我们可以做的就是尽自己的努力去接受,然后继续向前。又鸡汤了~!









猜你喜欢

转载自blog.csdn.net/iLOVEJohnny/article/details/80515917