初识Leetcode----学习(十六)【环形链表、最小栈】

环形链表

给定一个链表,判断链表中是否有环。

1.使用快慢指针,一个走两步,一个走一步,判断能否相撞,如果相撞则说明有环:

class Solution {
public:
    //快慢指针的应用
    bool hasCycle(ListNode *head) {
        ListNode *fast = head;
        ListNode *slow = head;
        while (fast != NULL && fast->next != NULL)
        {
            fast = fast->next->next;   //快指针走两步
            slow = slow->next;         //慢指针走一步
            if (fast == slow)          //判断是否相撞,相撞则说明有环
                return true;
        }
        return false;
    }
};

最小栈

设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。

  • push(x) -- 将元素 x 推入栈中。
  • pop() -- 删除栈顶的元素。
  • top() -- 获取栈顶元素。
  • getMin() -- 检索栈中的最小元素。

示例:

MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin();   --> 返回 -3.
minStack.pop();
minStack.top();      --> 返回 0.
minStack.getMin();   --> 返回 -2.

1.使用两个栈,一个栈用来顺序存储push进来的数据,另一个存储出现过的最小值:

具体分析:

若push入栈-2,0,-3

则push操作之后s1栈中元素为-2,0,-3

s2栈中元素为-2,-3

此时getMin()操作得到s2栈顶元素-3即为元素最小值

经pop操作,比较s1栈顶元素与s2栈顶元素是否相同,如果相同则将两个栈中的栈顶元素都出栈,否则s1栈顶元素出栈

此时top操作得到0

最后getMin操作得到栈s2中栈顶元素-2,即为最小值

class MinStack {
public:
    /** initialize your data structure here. */
    MinStack() {
        
    }
    
    void push(int x) {
        s1.push(x);   //s1保存顺序push的元素
        if (s2.empty() || x <= s2.top())   //s2保存出现过的最小值
            s2.push(x);
    }
    
    void pop() {
        if (s1.top() == s2.top())   //如果顺序保存的值与s2中保存的值相等,说明s2中保存的值不是最小值,弹出栈
            s2.pop();
        s1.pop();
    }
    
    int top() {
        return s1.top();     //返回s1顺序保存的栈顶元素
    }
    
    int getMin() {
        return s2.top();    //返回s2中得到的最小值
    }
private:
    stack<int> s1,s2;   //s1保存顺序push的值,s2保存出现过的最小值
};

2.使用一个栈保存顺序push的值,另设一个变量(min_val)存储最小值,具体思路与两个栈的思路差不多,只不过将代码修改一下:

具体分析:

若push入栈为-2,0,-3

则push操作之后栈元素为INT_MAX--(-2)--0--(-2)--(-3)

此时min_val = -3,同时getMin()操作得到最小值-3

经pop操作,此时栈顶元素-3被弹出栈与最小值比较,与最小值相等则将此时的栈顶元素(-2)赋給最小值,同时栈顶元素(-2)出栈

此时栈顶元素为0,则top操作输出为0

此时在getMin()操作得到当前最小值(-2)

class MinStack {
public:
    /** initialize your data structure here. */
    MinStack() {
        min_val = INT_MAX;   //初始化最小值min_val为int所能表示的最大值
    }
    
    void push(int x) {
       if (x <= min_val)    //如果x小于当前最小值则将最小值入栈
       {
           s1.push(min_val);
           min_val = x;
       }
        s1.push(x);        //将当前x值入栈
    }
    
    void pop() {
        int t = s1.top();   //取出栈顶元素
        s1.pop();
        if (t == min_val)   //将栈顶元素与最小值比较,如果一致则将此时的栈顶元素赋給min_val,同时将当前栈顶元素弹出
        {
            min_val = s1.top();
            s1.pop();
        }
    }
    
    int top() {
        return s1.top();  //得到栈顶元素
    }
    
    int getMin() {
        return min_val;
    }
private:  
    int min_val;     //存储最小值
    stack<int> s1;   //保存顺序push的值
};

猜你喜欢

转载自blog.csdn.net/qq_38790716/article/details/83281016