leetcode刷题(2)

简介: 各位朋友们,又是新的一天,不知道大家过得怎样?今天是我leedcode刷题系列的第二篇,那么废话不多说,直接进入我们今天的主题。

有效的括号

leetcode之有效的括号


题目要求


给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。

左括号必须以正确的顺序闭合。

每个右括号都有一个对应的相同类型的左括号。


用例输入


示例 1:

输入:s = “()”

输出:true


示例 2:

输入:s = “()[]{}”

输出:true


示例 3:

输入:s = “(]”

输出:false


做题思路


这道题的要求是需要我们判断给的括号是否合法,意思就是当我们遇到有括号的时候,我们需要判断左边最近的左括号是否跟这个右括号匹配。我们可以使用一种数据结构:栈来解决这个问题,因为栈是一端进,一端出,这一端被称为栈顶,先进后出,后进先出。所以我们把左括号都放在栈中,当遇到右括号时,我们就从栈顶取出左括号,看是否跟这个右括号匹配,匹配就继续下一个字符,不匹配就返回true。当这个字符串遍历完后,如果栈中不为空,说明有左括号未匹配,返回false,否则返回true。


代码实现

bool isValid(char * s){
    int len = strlen(s);
    //当字符串中没有或者只有一个字符时就直接返回false
    if(len <= 1)
    return false;
    //字符个数为奇数就说明一定有一个未匹配所以就直接返回
    if(len%2 == 1)
    return false;
    //tail记录栈顶的位置
    int tail = 0;
    char* arr = (char*)malloc(len*sizeof(char));
    int i = 0;
    for(int i = 0; i<len; i++)
    {
        if(s[i] == '(' || s[i] == '[' || s[i] == '{')
        {
          arr[tail++] = s[i];
        }
        else
        {
            if(tail == 0)
            return false;
            if(s[i] == ')')
            {
                if(arr[tail-1] != '(')
                return false;
            }
            else if(s[i] == ']')
            {
                if(arr[tail-1] != '[')
                {
                    return false;
                }
            }
            else
            {
                if(arr[tail-1] != '{')
                {
                    return false;
                }
            }
            tail--;
        }
    }
    if(tail == 0)
    return true;
    return false;
}

image.png


环形链表

leetcode之环形链表


题目要求


给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。


用例输入

示例 1:

43.png

输入:head = [3,2,0,-4], pos = 1

输出:true

解释:链表中有一个环,其尾部连接到第二个节点。


示例 2:

44.png

输入:head = [1,2], pos = 0

输出:true

解释:链表中有一个环,其尾部连接到第一个节点。


示例 3:

45.png

输入:head = [1], pos = -1

输出:false

解释:链表中没有环。


做题思路

如果该链表是有环的,那么我们使用两个指针:快指针跟慢指针,慢指针一次走一个结点,快指针走两个结点,他们最终一定会相遇。


代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
bool hasCycle(struct ListNode *head) {
    struct ListNode* low = head;
    struct ListNode* fast = head;
    while(fast && fast->next)
    {
        low = low->next;
        fast = fast->next->next;
        if(low == fast)
        return true;
    }
    return false;
}

46.png


环形链表 II

leetcode之环形链表 ||


题目要求

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

不允许修改 链表。


用例输入

示例 1:

image.png

输入:head = [3,2,0,-4], pos = 1

输出:返回索引为 1 的链表节点

解释:链表中有一个环,其尾部连接到第二个节点。


示例 2:

48.png

输入:head = [1,2], pos = 0

输出:返回索引为 0 的链表节点

解释:链表中有一个环,其尾部连接到第一个节点。


示例 3:

49.png

输入:head = [1], pos = -1

输出:返回 null

解释:链表中没有环。


做题思路


我们这个题还得需要上面的判断是否是环形链表的知识,有一个结论:当快慢指针相遇的时候,让指针分别在链表的头结点跟相遇的结点开始走,每次走一个结点,他们最终会在环形链表的入口处相遇。


代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode* slow = head;
    struct ListNode* fast = head;
    while(fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
        if(slow == fast)
        {
            struct ListNode* meet = slow;
            while(head != meet)
            {
                meet = meet->next;
                head = head->next;
            }
            return meet;
        }
    }
    return NULL;
}

50.png

相关文章
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
57 6
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
50 4
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
114 2
|
20天前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
16 1
|
2月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
3月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
56 7
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
28 4
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
54 5
|
3月前
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
51 3