LeetCode刷题(2021-09-08)

本文介绍了两种算法问题的解决方案。第一部分讲解了如何使用unordered_set检测链表中的环路,通过遍历节点并存入集合,若发现节点已存在则表明存在环路。第二部分展示了栈的最小值问题的解决策略,通过维护一个辅助栈保存每个元素及其对应的最小值,使得获取栈的最小值操作能在O(1)的时间复杂度内完成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第九题:链表环路
我的思路:
遍历所有节点,不断存进unordered_set,如果unordered_set里面count出节点2次,那么说明有环(emplace可以用于插入)
代码:

  ListNode* cur=head;
        unordered_set<ListNode*> ocur={};
        while(cur!=NULL){
            if(!ocur.count(cur)) ocur.emplace(cur);
            else return cur;
            cur=cur->next;
        }
        return NULL;

官方思路(进阶):快慢指针
在这里插入图片描述
❄证明:1、快慢指针一定会相遇,且此时快指针(每次2步)一定走了n圈,慢指针(每次1步)还未满1圈
当快慢指针相遇的时候
快指针路程s1:a+n*(b+c)+b
慢指针路程s2:a+b
所以s1=2s2
→a=(n-1)
(b+c)+c
→a为n-1圈+c
→当快慢指针相遇的时候,让ptr指针从a开始走,步长为1,慢指针也继续走
当ptr达到入环点(交点)的时候,慢指针也走了n-1圈+c,最终到达入环点
♥统一往顺时针方向走
在这里插入图片描述
第十题:栈的最小值(要求时间复杂度为O(1))
别人的思路:
→利用C++原有的栈,题目要求O(1)
→所以不可能通过遍历的时候来知道最小值
→因此要在插入的时候,就把最小值也给记住
→每个栈的存储的数据形式应该是(数值,min)
❄此处min是栈底到其本身之间的最小值

class MinStack {
private:
    stack<pair<int,int>> S;//栈中存储(元素,栈底到其本身之间的最小值)---栈顶的second就是全栈最小值
public:
    MinStack() {

    }
    
    void push(int x) {
        if(S.empty()) S.emplace(x,x);//栈空的时候最小值:插入值
        else S.emplace(x,min(S.top().second,x));//栈不空的时候最小值:插入值和已经入栈的最小值

    }
    
    void pop() {
         S.pop();
    }
    
    int top() {
         return S.top().first;
    }
    
    int getMin() {
        return S.top().second;
    }
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值