- 博客(30)
- 收藏
- 关注
原创 设计循环队列
而当所有队列空间全占满时,也有 front=rear。为了区别这两种情况,假设队列使用的数组有 capacity 个存储空间,则此时规定循环队列最多只能有capacity−1 个队列元素,当循环队列中只剩下一个空存储单元时,则表示队列已满。根据以上可知,队列判空的条件是 front=rear,而队列判满的条件是 front=(rear+1)modcapacity。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。
2024-09-29 19:58:58 399
原创 用队列实现栈 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
一个队列为主队列,一个为辅助队列,当入栈操作时,先将主队列内容导入辅助队列,然后将入栈元素放入主队列队头位置,再将辅助队列内容,依次添加进主队列。
2024-09-29 19:55:33 129
原创 图书整理 书店店员有一张链表形式的书单,每个节点代表一本书,节点中的值表示书的编号。为更方便整理书架,店员需要将书单倒过来排列,就可以从最后一本书开始整理,逐一将书放回到书架上。请倒序返回这个
利用递归,先递推至链表末端;回溯时,依次将节点值加入列表,即可实现链表值的倒序输出。时,代表越过了链表尾节点,则返回空列表;
2024-09-29 19:51:52 170
原创 用栈实现队列 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty
加入队尾 push() : 将数字 val 加入栈 A。获取队首元素 peek() :当栈 B 不为空: B中仍有已完成倒序的元素,直接返回 B 的栈顶元素。否则当 A 为空: 即两个栈都为空,无元素,返回 -1。否则 将栈 A 元素全部转移至栈 B 中,实现元素倒序,并返回栈 B 的栈顶元素。弹出队首元素 pop() :执行 peek() ,获取队首元素。弹出 B 的栈顶元素。队列判空 empty() : 当栈 A 和 B 都为空时,队列为空。
2024-09-29 19:47:37 199
原创 简化路径 给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 ‘/‘ 开头),请你将其转化为 更加简洁的规范路径。
对于空字符串和一个点,无需对它们进行处理,因为空字符串没有任何含义,而一个点表示当前目录本身,无需切换目录。对于两个点或者目录名,可以用一个栈来维护路径中的每一个目录名。当遇到两个点时,需要将目录切换到上一级,只要栈不为空,就弹出栈顶的目录。当遇到目录名时,就把它放入栈。
2024-09-29 19:42:16 355
原创 验证栈序列 给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回
入栈操作 按照压栈序列的顺序执行;出栈操作 每次入栈后,循环判断 “栈顶元素 = 弹出序列的当前元素” 是否成立,将符合弹出序列顺序的栈顶元素全部弹出。stk.empty() && stk.top() == popped[i]) { // 循环判断与出栈。
2024-09-29 19:38:05 232
原创 基本计算器 给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1]
加号:将数字压入栈;减号:将数字的相反数压入栈;乘除号:计算数字与栈顶元素,并将栈顶元素替换为计算结果。
2024-09-29 19:33:52 283
原创 最长的有效括号 给你一个只包含 ‘(‘ 和 ‘)‘ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
遇到左括号'('就往栈里推一个1遇到右括号:如果栈头是1,代表是这种情况:"...("+')' ,那么就把栈头+1如果栈头不是1,但是倒数第二个是1,代表是这种情况:"..((())"+')' ,就把倒数第二个+1。
2024-09-29 19:27:09 199
原创 字符串解码 给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证
如果当前的字符为数位,解析出一个数字并进栈如果当前的字符为字母或者左括号,直接进栈如果当前的字符为右括号,开始出栈,一直到左括号出栈,出栈序列反转后拼接一个字符串,此时取出栈顶的数字,就是这个字符串应该出现的次数,根据这个次数和字符串构造出新的字符串并进栈。
2024-09-29 19:09:17 451
原创 有效的括号 给定一个只包括 ‘(‘,‘)‘,‘{‘,‘}‘,‘[‘,‘]‘ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合
后遇到的左括号要先闭合,可以将这个左括号放入栈顶。当遇到一个右括号时,需要将一个相同类型的左括号闭合。可以取出栈顶的左括号并判断它们是否是相同类型的括号。如果不是相同的类型,或者栈中并没有左括号,那么字符串 s 无效,返回 False。为了快速判断括号的类型,可以使用哈希表存储每一种括号。哈希表的键为右括号,值为相同类型的左括号。在遍历结束后,如果栈中没有左括号,说明将字符串 s 中的所有左括号闭合,返回 True,否则返回 False。
2024-09-29 19:02:25 159
原创 最小栈 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。实现 MinStack 类:MinStack() 初始化堆栈对象。void push(int
可以创建两个栈,一个栈是主栈 stack,另一个是辅助栈 minStack,用于存放对应主栈不同时期的最小值。
2024-09-29 18:57:32 121
原创 删除字符串中的所有相邻重复项 给出由小写字母组成的字符串 s,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 s 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作
多组相邻重复项,无论先删除哪一项,都不会影响最终结果。删除当前项是需要拿上一项出来对比的,所以需要用临时栈存放之前的内容。当前项和栈顶一致,弹出栈顶抵消即可。若不一致,压入栈留存,后续使用。
2024-09-29 18:53:57 148
原创 设计链表 你可以选择使用单链表或者双链表,设计并实现自己的链表。
初始化时,创建头节点 head 和 size ,实现 get(index) 时,先判断有效性,再通过循环来找到对应的节点的值,实现 addAtIndex(index, val) 时,如果 index 是有效值,则需要找到原来下标为 index 的节点的前驱节点 pred,并创建新节点 to_add,将to_add 的后继节点设为 pred 的后继节点,将 pred 的后继节点更新为 to_add,这样就将 to_add 插入到了链表中。以指示链表中的上一个节点。是指向下一个节点的指针/引用。
2024-09-17 21:35:55 647
原创 螺旋矩阵2 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
螺旋矩阵按照从左到右,从上到下,从右到左,从下到上的顺序将数组填充完整。
2024-09-17 21:23:06 186
原创 旋转图像 给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转
矩阵顺顺时针旋转90度后得到的图形就等于原图形先沿对角线翻转后每行逆序输出。
2024-09-17 21:16:46 197
原创 对角线遍历 给你一个大小为 m x n 的矩阵 mat ,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素
设对角线从上到下的编号为 i∈[0,m+n−2]:当 i 为偶数时,第 i 条对角线的走向是从下往上遍历;当 i 为奇数时,第 i 条对角线的走向是从上往下遍历;从下往上遍历:当 i<m 时,对角线遍历的起点位置为 (i,0);当 i≥m 时,对角线遍历的起点位置为 (m−1,i−m+1);从上往下遍:当 i<n 时,对角线遍历的起点位置为 (0,i);当 i≥n 时,对角线遍历的起点位置为 (i−n+1,n−1);
2024-09-17 20:54:18 273
原创 矩阵置零 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用原地算法。
遍历该数组一次,如果某个元素为 0,那么就将该元素所在的行和列所对应标记数组的位置置为 true。最后再次遍历该数组,用标记数组更新原数组。
2024-09-16 22:27:07 201
原创 螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
设定上下左右边界,其次向右移动到最右,此时第一行因为已经使用过了,可以将其从图中删去,体现在代码中就是重新定义上边界,判断若重新定义后,上下边界交错,表明螺旋矩阵遍历结束,跳出循环,若上下边界不交错,则遍历还未结束,接着向下向左向上移动,操作过程与第一,二步同理,不断循环以上步骤,直到某两条边界交错,跳出循环。
2024-09-16 22:15:49 302
原创 旋转链表 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
设定链表的长度为 n,当向右移动的次数 k≥n 时,需要向右移动 k mod n 次,新链表的最后一个节点为原链表的第 (n−1)−(kmodn) 个节点。
2024-09-08 20:34:02 283
原创 删除排序链表中的重要元素2 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
给定的链表是排好序的,只要对链表进行一次遍历,就可以删除重复元素。我们从指针 cur 指向链表的头节点,开始对链表进行遍历,如果当前 cur .next与 cur.next.next 对应的元素相同,那么就将 cur.next .next从链表中移除,如果当前 cur.next 与 cur.next.next 对应的元素不相同,说明链表中只有一个元素值为 cur.next 的节点,就可以将 cur 指向 cur.next,当遍历完整个链表之后,返回链表的的哑节点的下一个节点 dummy.next。
2024-09-08 20:26:28 289
原创 回文链表 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
指向当前节点,使用双指针法来比较两端的元素,并向中间移动,一个指针从起点向中间移动,另一个指针从终点向中间移动。遍历链表将值复制到数组列表中用。
2024-09-08 20:18:52 148
原创 移除链表元素 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
先对除了头节点 head 以外的节点进行删除操作,然后判断 head 的节点值是否等于给定的 val,。如果 head 的节点值等于 val,则 head 需要被删除,如果 head 的节点值不等于 val,则 head 保留,删除操作后的头节点还是 head。
2024-09-08 20:11:45 124
原创 反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表
在遍历链表时,将当前节点的 next 指针改为指向前一个节点,由于节点没有引用其前一个节点,事先存储其前一个节点,存储后一个节点。最后返回新的头引用。
2024-09-07 22:19:58 221
原创 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
给定的链表是排好序的,只要对链表进行一次遍历,就可以删除重复元素。我们从指针 cur 指向链表的头节点,开始对链表进行遍历,如果当前 cur 与 cur.next 对应的元素相同,那么就将 cur.next 从链表中移除。
2024-09-07 21:19:16 216
原创 除自身以外数组的乘积 给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。题目数据 保证 数组 num
利用前缀和的思想,分别从前 后两个方向计算各个数累乘结果并记录,这样如果我们想要在总的乘积中除以一个数nums[i],那就等价于nums[0]nums[1]...nums[i-1]和 nums[i+1]nums[i+2]...nums[n-1]的乘积,我们只需要对这些乘积有所记录,那么想要用的时候直接用就可以了。
2024-09-03 22:16:57 277
原创 轮转数组 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
我们可以使用额外的数组来将每个元素放至正确的位置。用 n 表示数组的长度,我们遍历原数组,将原数组下标为 i 的元素放至新数组下标为 (i+k)modn 的位置,最后将新数组拷贝至原数组即可。
2024-09-03 21:40:05 216
原创 寻找数组的中心下标 给你一个整数数组 nums ,请计算数组的 中心下标 。数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。如果中心下标位于数组最左端,那么左
记数组的全部元素之和为 total,当遍历到第 i 个元素时,设其左侧元素之和为 sum,则其右侧元素之和为 total−nums i −sum。左右侧元素相等即为 sum=total−nums i−sum,2×sum+nums i =total。
2024-09-01 15:50:39 226
原创 加一 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。
对数组 digits 进行一次逆序遍历,找出第一个不为 9 的元素,将其加一并将后续所有元素置零即可。如果 digits 中所有的元素均为 9.如果 digits 的所有元素都是 9,例如 [9,9,9,9,9],那么答案为 [1,0,0,0,0,0]。我们只需要构造一个长度比 digits 多 1 的新数组,将首元素置为 1,其余元素置为 0。// digits 中所有的元素均为 9。
2024-09-01 15:04:10 129
原创 最大连续1的个数 给定一个二进制数组 nums , 计算其中最大连续 1 的个数。
i < n;i++) {count++;} else {count = 0;
2024-09-01 14:06:45 115
原创 数据结构内容
线性表基本运算:修改、插入、删除、查找、排序 空表 顺序存储结构 链式存储结构 索引存储。算法A1,算法A2,算法B1,算法B2 函数渐进增长 O()队列 先进先出 只能在表的前端进行删除操作,在表后进行插入操作。单链表 头插法 尾插法 双链表。顺序表插入删除算法平均空间复杂度为O(1)栈 顺序存储 链式存储 后进先出。顺序表修改时间效率为O(1)
2024-08-23 13:06:47 189
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人