leetcode
不爱喝水的大脸猫
这个作者很懒,什么都没留下…
展开
-
leetcode 387. 字符串中的第一个唯一字符
给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。输入: s = “loveleetcode”输出: 2class Solution {public: int firstUniqChar(string s) { int countArray[26] = {0}; for(int i = 0; i < s.size(); i++) { countArray[s[i]-原创 2022-02-27 20:08:50 · 441 阅读 · 0 评论 -
leetcode 917. 仅仅反转字母
给你一个字符串 s ,根据下述规则反转字符串:所有非英文字母保留在原有位置。所有英文字母(小写或大写)位置反转。返回反转后的 s 。class Solution {public: bool IsLetter(char ch) { if((ch >= 'A'&& ch <='Z') || (ch >='a' && ch <='z')) { return true;原创 2022-02-27 19:40:22 · 198 阅读 · 0 评论 -
leetcode 622.设计循环队列
设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。你的实现应该支持如下操作:MyCircularQueue(k): 构造器,设置队列长度为 k 。Front: 从队首获取元素。如果队列为空,返回 -1 。原创 2022-01-11 13:37:36 · 188 阅读 · 0 评论 -
leetcode 20.有效的括号
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。思路:遇到左括号,进栈,遇到右括号,出栈匹配考虑两种情况:1.遇到右括号,但是栈尾空2.右括号都匹配完了,栈中还有左括号typedef char STDataType;typedef struct Stack{ STDataType* a; int top; int capacity;}ST;vo原创 2022-01-09 22:39:02 · 184 阅读 · 4 评论 -
leetcode 138.复制带随机指针的链表
给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。思路:1.复制原链表的所有结点,将新结点各自插入到原结点的后面2.根据原结点的random原创 2022-01-07 22:05:41 · 365 阅读 · 1 评论 -
leetcode 142.环形链表II
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。不允许修改 链表。输入:head = [3,2,0,-4], pos = 1输出:返回索引为 1 的链表节点解释:链表中有一个环,其尾部连接到第二个节点。思路1:首先,判断链表是否有环,使用快慢指针来判断,如果有环,找到快慢指针相遇的结点其次,如果有环,定义两个指针,分别从链表头结点cur和快慢指针相遇的结点meet开始走,两个指针每次都走一步,那么这两个指针必然在入环第一个结点处相遇。struct ListN原创 2022-01-07 16:37:22 · 433 阅读 · 0 评论 -
leetcode 141.环形链表
给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中原创 2022-01-07 10:48:49 · 108 阅读 · 0 评论 -
leetcode 160. 相交链表
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。图示两个链表在节点 c1 开始相交:思路1:暴力求解(穷举法)依次取A链表中的每个结点和B链表中的所有结点进行比较,如果有地址相同的结点,就是相交,第一个相交的点。时间复杂度是O(N2N^2N2)思路2:时间复杂度优化到O(N)1.分别遍历两个链表,记住长度,如果两个链表的尾结点相同,则必然相交,否则不相交。2.找交点:让长的链表先走(走长度差),然原创 2022-01-06 20:15:57 · 290 阅读 · 1 评论 -
leetcode 21.合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]思路:依次比较两个链表结点,取小的那个结点尾插到新链表中。初始条件:要记住新链表的头结点,使用指针head来记录新链表的头结点使用指针tail来记录新链表的尾结点struct ListNode { int val; struct ListNode* next;};struct原创 2022-01-06 10:24:16 · 527 阅读 · 0 评论 -
leetcode 876.链表的中间结点
给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。示例 1:输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3,4,5])返回的结点值为 3 。示例 2:输入:[1,2,3,4,5,6]输出:此列表中的结点 4 (序列化形式:[4,5,6])由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。思路1:遍历链表,求出长度,再次遍历找到中间结点,需要遍历链表两次,时间复杂度O(N).思路2:要求原创 2022-01-06 08:53:05 · 451 阅读 · 0 评论 -
leetcode 206.反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]思路1:初始时,n1 = NULL, n2 = head, n3 = head->nextn2的next赋值为n1n1 赋值为n2, n2赋值为n3,n3赋值为n3->nextn2的next赋值为n1n1赋值为n2,n2赋值为n3,n3赋值为n3->next重复上述操作结束条件:n2 = NULLstruct原创 2022-01-05 21:40:09 · 234 阅读 · 0 评论 -
leetcode 203.移除链表元素
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足Node.val == val 的节点,并返回 新的头节点 。示例 1:输入:head = [1,2,6,3,4,5,6], val = 6输出:[1,2,3,4,5]示例 2:输入:head = [], val = 1输出:[]示例 3:输入:head = [7,7,7,7], val = 7输出:[]思路:使用两个指针,prev和cur,cur记录当前指针位置,prev记录前一个位置如果cur->原创 2022-01-05 15:43:01 · 245 阅读 · 0 评论 -
leetcode 88.合并两个有序数组
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。例1:输入:nums1 = [1,2,3,0,0,原创 2022-01-04 22:31:54 · 353 阅读 · 2 评论 -
leetcode 572.另外一棵树的子树
给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。思路:用subRoot和root的每一个子树进行比较。subRoot先和root比较,如果相等返回true,否则,subRoot和root->left比较,如果相等返回true,否则subRoot和roo原创 2021-11-14 12:22:56 · 257 阅读 · 0 评论 -
leetcode 145.二叉树的后序遍历
给定一个二叉树,返回它的 后序 遍历。/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; *//** * Note: The returned array must be malloced, assume caller calls free(). *//原创 2021-11-14 11:54:08 · 516 阅读 · 0 评论 -
leetcode 94.二叉树的中序遍历
给定一个二叉树的根节点 root ,返回它的 中序 遍历。/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; *//** * Note: The returned array must be malloced, assume caller calls free原创 2021-11-14 11:44:10 · 543 阅读 · 0 评论 -
leetcode 101.对称二叉树
给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:思路:把左右子树看成单独的两个树,两棵树进行比较(参考leetcode 100,链接)/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struc原创 2021-11-14 11:19:18 · 172 阅读 · 0 评论 -
leetcode 100.相同的树
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。先比较根,根相等,再比较左子树,左子树相等,再去比较右子树,如此一直比较下去,直到所有节点比较完。时间复杂度是O(N)/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct T原创 2021-11-14 10:55:50 · 340 阅读 · 0 评论 -
leetcode 144. 二叉树的前序遍历
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。原创 2021-11-14 10:35:05 · 370 阅读 · 0 评论 -
leetcode 965.单值二叉树
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true;否则返回 false。思路:父亲 = 左孩子父亲 = 右孩子父亲和左右孩子比,然后孩子作为父亲,再和它的左右孩子比/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right;原创 2021-11-14 10:33:27 · 58 阅读 · 0 评论 -
leetcode 225. 用队列实现栈
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。首先实现队列,创建两个队列实现入栈:向不为空的队列中入队,保持另一个队列为空实现出栈:依次出队将数据转移到空队列中保存,只剩最后一个数据出队列画图代码实现//队列数据类型typedef int QDataType;//队列中数据结构体typedef struct QueueNode{ struct QueueNode* next; QDataType d原创 2021-11-01 22:47:02 · 138 阅读 · 1 评论 -
leetcode 232. 用栈实现队列
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空,返回 true ;否则,返回 false一个栈用来入数据,一个栈用来出数据...原创 2021-11-01 22:42:51 · 72 阅读 · 0 评论 -
leetcode 27. 移除元素
给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。思路1:遍历数组,找到所有等于val的值,后面的元素全部前移时间复杂度:最坏情况下,O(N^2)思路2:重新开辟一个数组tmp,遍历原数组,把不是val的数全部放到新数组中tmp,再把tmp数组拷贝到原数组中时间复杂度)O(N)空间复杂度为:O(原创 2021-10-30 14:36:40 · 97 阅读 · 0 评论 -
189. 旋转数组
题目描述:给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。示例 1:输入: nums = [1,2,3,4,5,6,7], k = 3输出: [5,6,7,1,2,3,4]示例 2:输入:nums = [-1,-100,3,99], k = 2输出:[3,99,-1,-100]思路1:暴力求法1.每次把最后一个数拿出来,放在临时变量中2.剩余全其他所有元素后移一位3.把最后一个数放到第一个位置时间复杂度:O(N*k)空间复杂度:O(1)思路2:开辟额外空间,原创 2021-10-29 14:33:47 · 64 阅读 · 0 评论 -
面试题 17.04. 消失的数字
题目描述:数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?示例 1:输入:[3,0,1]输出:2示例 2:输入:[9,6,4,2,3,5,7,0,1]输出:8思路1:排序,使用qsort快排,时间复杂度是O(n*log2Nlog2^Nlog2N)思路2:(0+1+2+…+n) - (a[0]+a[1]+…+a[n-1]),时间复杂度是O(N),空间复杂度是O(1)int missingNumber(int* nums, in原创 2021-10-29 14:04:16 · 95 阅读 · 0 评论 -
leetcode 876. 链表的中间结点
给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。示例 1:输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3,4,5])返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。注意,我们返回了一个 ListNode 类型的对象 ans,这样:ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NU原创 2021-10-21 22:10:57 · 39 阅读 · 0 评论 -
leetcode 26.删除有序数组中的重复项
给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例 1:输入:nums = [1,1,2] 输出:2, nums = [1,2]解释:函数应该返回新的长度 2 ,并且原数组 nums的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。示例 2:输入:nums = [0,0,1,1,1,2,2,3,3,4] 输出:5, n原创 2021-10-14 23:43:12 · 503 阅读 · 0 评论 -
leetcode 88.合并两个有序数组
题目描述:给你两个按非递减顺序 排列的整数数组 nums1 和nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你合并nums2 到nums1中,使合并后的数组同样按非递减顺序排列。注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。示例 1:输入:nums1 = [1,2,3,0,0,原创 2021-10-14 22:53:54 · 149 阅读 · 0 评论