
算法刷题
文章平均质量分 57
写点Oj
蓝色搓澡巾
这个作者很懒,什么都没留下…
展开
-
LeetBook——栈和队列——克隆图
克隆图给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。class Node {public int val;public List neighbors;}测试用例格式:简单起见,每个节点的值都和它的索引相同。例如,第一个节点值为 1(val = 1),第二个节点值为 2(val = 2),以此类推。该图在测试用例中使用邻接列表表示。邻接列表 是用于表示有限图的无序列表的集合。每个列表都原创 2021-07-26 17:21:42 · 263 阅读 · 0 评论 -
LeetBook——栈和队列——逆波兰表达式求值
逆波兰表达式求值根据 逆波兰表示法,求表达式的值。有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:整数除法只保留整数部分。给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。示例 1:输入:tokens = [“2”,“1”,"+",“3”,"*"]输出:9解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9示例 2:输入:tokens = [“4”,“13”,“5”,"/","+"原创 2021-07-06 20:43:01 · 210 阅读 · 0 评论 -
LeetBook——栈和队列——每日温度
每日温度请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。 public int[] da原创 2021-07-05 09:59:11 · 126 阅读 · 0 评论 -
LeetBook——栈和队列——有效的括号
有效的括号给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。示例 1:输入:s = “()”输出:true示例 2:输入:s = “()[]{}”输出:true示例 3:输入:s = “(]”输出:false示例 4:输入:s = “([)]”输出:false示例 5:输入:s = “{[]}”输出:true提示:1 <= s.le原创 2021-07-04 16:57:04 · 109 阅读 · 0 评论 -
LeetBook——栈和队列——最小栈
最小栈设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。示例:输入:[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”][[],[-2],[0],[-3],[],[],[],[]]输出:[null,null,null,null原创 2021-07-04 16:34:01 · 143 阅读 · 0 评论 -
LeetBook——栈和队列——完全平方数
完全平方数给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。给你一个整数 n ,返回和为 n 的完全平方数的 最少数量 。完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。示例 1:输入:n = 12输出:3解释:12 = 4 + 4 + 4示例 2:输入:n = 13输出:2解释:13 = 4 +原创 2021-07-03 10:28:17 · 162 阅读 · 0 评论 -
LeetBook——栈和队列——岛屿数量
岛屿数量给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例 1:输入:grid = [[“1”,“1”,“1”,“1”,“0”],[“1”,“1”,“0”,“1”,“0”],[“1”,“1”,“0”,“0”,“0”],[“0”,“0”,“0”,“0”,“0”]]输出:1示例 2:输入:grid = [[“1”,“1”,“原创 2021-07-02 19:27:05 · 133 阅读 · 0 评论 -
LeetBook——栈和队列——打开转盘锁
打开转盘锁你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字: ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’ 。每个拨轮可以自由旋转:例如把 ‘9’ 变为 ‘0’,‘0’ 变为 ‘9’ 。每次旋转都只能旋转一个拨轮的一位数字。锁的初始数字为 ‘0000’ ,一个代表四个拨轮的数字的字符串。列表 deadends 包含了一组死亡数字,一旦拨轮的数字和列表里的任何一个元素相同,这个锁将会被永久锁定,无法再被旋转。字符串 target 代表可以解锁原创 2021-07-02 19:19:33 · 145 阅读 · 0 评论 -
LeetBook——栈和队列——设计循环队列
设计循环队列设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。你的实现应该支持如下操作:MyCircularQueue(k): 构造器,设置队列长度为 k 。Front: 从队首获取元素。如果队列为空,原创 2021-06-27 18:37:55 · 227 阅读 · 0 评论 -
扁平化多级双向链表
扁平化多级双向链表照抄官方题解,只是加些注释本质上是将一个二叉树进行先序遍历,遍历时的操作是将当前节点与前驱连接起来,根节点没有前驱,所以给根节点加一个假头节点。操作顺序为,处理根节点处理左子树处理右子树// 递归版 public Node flatten(Node head) { if(head == null ) { return head; //如果传入的是空表,不需要处理,直接返回 }原创 2021-06-25 19:08:38 · 123 阅读 · 0 评论 -
LeetBook——链表——旋转列表
旋转列表首先明确该题目的链表是无头结点的单链表,因此旋转的操作可以通过先将链表改为循环单链表,然后在恰当的地方断开来完成要求第一步: 判断是否需要处理,不需要的直接原样返回第二步: 如果需要处理,那么遍历链表。 作用一、统计链表结点个数,方便下一步操作,作用二,找到表尾节点,方便成环第三步: 通过对K取余,将K>链表长度的情况转变为K<链表长度的情况,这样就只需要考虑k<链表长度的情况了第四步: 链表长度-k。得到的就是新的头节点应在的位置第五步原创 2021-06-24 21:00:13 · 230 阅读 · 2 评论 -
LeetBook——链表——两数相加
两数相加给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例 1:输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807.示例 2:输入:l1 = [0], l2 = [0]输出:[0]示例 3:输入:l1 = [9,9,9,9,9,9,9],原创 2021-06-24 12:03:18 · 88 阅读 · 0 评论 -
LeetBook——链表——合并两个有序链表
设计链表题目传入的是无头结点的有序单链表,为了方便操作,搞个头节点先用传入的两个引用遍历传入的表,遍历过程中比较,将较小的节点尾插到解答链大概率不会同时处理完,剩下的那条链可以直接接在尾部public ListNode mergeTwoLists(ListNode l1, ListNode l2) { //传入的是无头结点的有序单链表 if( l1 == null ){ return l2; }else if(l2 ==原创 2021-06-23 22:13:04 · 152 阅读 · 1 评论 -
LeetBook——链表——双链表——设计链表
双链表——设计链表设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。在链表类中实现这些功能:get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新原创 2021-06-21 22:32:06 · 135 阅读 · 0 评论 -
LeetBook——链表——回文链表
回文链表请判断一个链表是否为回文链表。示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?解法找到链表中间节点,快指针法将后半部分链表逆转比较前半部分链表和后半部分链表再次逆置后半部分链表,修复链表,逆置链表直接用的以前写过的题的代码-时间复杂度:逆置两次后半部分的表(n),寻找中间节点需要遍历整个表一次,比对节点 也需要遍历整个表(n原创 2021-06-20 14:36:44 · 151 阅读 · 0 评论 -
LeetBook——链表——奇偶链表
奇偶链表给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。示例 1:输入: 1->2->3->4->5->NULL输出: 1->3->5->2->4->NULL示例 2:输入: 2->1->3->5->6-&g原创 2021-06-19 17:41:09 · 252 阅读 · 0 评论 -
LeetBook——链表——移除链表元素
移除链表元素给你一个链表的头节点 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输出:[]提示:列表中的节点数目在范围 [0, 104] 内1 <= Node.val <原创 2021-06-18 20:27:48 · 85 阅读 · 0 评论 -
LeetBook——链表——反转链表
反转链表给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例 1:输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]示例 2:输入:head = [1,2]输出:[2,1]示例 3:输入:head = []输出:[]提示:链表中节点的数目范围是 [0, 5000]-5000 <= Node.val <= 5000进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?迭代解法public ListNode re原创 2021-06-18 05:51:54 · 332 阅读 · 0 评论 -
LeetBook——链表——双指针技巧——删除链表的倒数第N个节点
删除链表的倒数第N个节点给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。进阶:你能尝试使用一趟扫描实现吗?示例 1:输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]示例 2:输入:head = [1], n = 1输出:[]示例 3:输入:head = [1,2], n = 1输出:[1]提示:链表中结点的数目为 sz1 <= sz <= 300 <= Node.val <= 1001 <= n原创 2021-06-18 04:33:19 · 295 阅读 · 0 评论 -
LeetBook——链表——双指针技巧——相交链表
相交链表给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。图示两个链表在节点 c1 开始相交:题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原始结构 。示例 1:输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3输出:Intersected at ‘8’解原创 2021-06-17 13:19:19 · 172 阅读 · 0 评论 -
LeetBook——链表——双指针技巧——环形链表(2)
环形链表(2)给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。说明:不允许修改给定的链表。进阶:你是否可以使用 O(1) 空间解决此题?示例 1:输入:head = [3,2,0,-4], pos = 1输出:返回索引为 1 的链表节点解释:链表中有一原创 2021-06-16 17:23:50 · 99 阅读 · 0 评论 -
LeetBook——链表——双指针技巧——环形链表(1)
给定一个链表,判断链表中是否有环如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。进阶:你能用 O(1)(即,常量)内存解决此问题吗?示例 1:输入:head = [3,2,0,-4], pos原创 2021-06-16 16:49:36 · 98 阅读 · 0 评论 -
LeetBook——链表——02单链表——设计链表
设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。在链表类中实现这些功能:get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第原创 2021-06-16 15:10:39 · 206 阅读 · 0 评论