LeetCode
文章平均质量分 73
饥渴的小苹果
很天然牛奶糖然后天然 很天然天然图画
展开
-
【双指针】26. 删除有序数组中的重复项 & 27. 移除元素 & 80. 删除排序数组中的重复项 II & 283. 移动零
26. 删除有序数组中的重复项题目26. 删除有序数组中的重复项给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例 1:输入:nums = [1,1,2]输出:2, nums = [1,2]解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。示例 2:输原创 2021-03-22 13:04:09 · 294 阅读 · 0 评论 -
【DFS】200. 岛屿数量 & 130. 被围绕的区域 & 463. 岛屿的周长 & 695. 岛屿的最大面积 & 733. 图像渲染
200. 岛屿数量题目200. 岛屿数量给你一个由 ‘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:输入:g转载 2021-03-17 23:58:54 · 406 阅读 · 0 评论 -
【单调栈】84. 柱状图中最大的矩形 & 85. 最大矩形
84. 柱状图中最大的矩形85. 最大矩形原创 2021-03-16 23:12:44 · 271 阅读 · 0 评论 -
【二分法】153. 寻找旋转排序数组中的最小值 & 剑指 Offer 11. 旋转数组的最小数字 & 154 & 33. 搜索旋转排序数组 & 81. 搜索旋转排序数组 II
剑指 Offer 11. 旋转数组的最小数字153. 寻找旋转排序数组中的最小值154. 寻找旋转排序数组中的最小值 II33. 搜索旋转排序数组原创 2021-03-14 23:16:21 · 143 阅读 · 0 评论 -
【动态规划】509. 斐波那契数 & 70. 爬楼梯 & 1137. 第 N 个泰波那契数
509. 斐波那契数题目509. 斐波那契数剑指 Offer 10- I. 斐波那契数列斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:F(0) = 0,F(1) = 1F(n) = F(n - 1) + F(n - 2),其中 n > 1给你 n ,请计算 F(n) 。示例 1:输入:2输出:1解释:F(2) = F(1) + F(0) = 1 + 0 = 1示例 2:输入:3输转载 2021-03-14 22:54:31 · 160 阅读 · 0 评论 -
【二分查找】35. 搜索插入位置 & 278. 第一个错误的版本 & 374. 猜数字大小 & 34. 在排序数组中查找元素的第一个和最后一个位置
35. 搜索插入位置278. 第一个错误的版本374. 猜数字大小34. 在排序数组中查找元素的第一个和最后一个位置原创 2021-03-11 12:41:22 · 253 阅读 · 0 评论 -
【二分查找】74. 搜索二维矩阵 & 剑指 Offer 04. 二维数组中的查找 & 240. 搜索二维矩阵 II
74. 搜索二维矩阵题目74. 搜索二维矩阵编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:每行中的整数从左到右按升序排列。每行的第一个整数大于前一行的最后一个整数。解法注意到输入的 m x n 矩阵可以视为长度为 m x n的有序数组。该二维数组可以拉长为一个有序的一维数组。由于该 虚 数组的序号可以由下式方便地转化为原矩阵中的行和列 (我们当然不会真的创建一个新数组) ,该有序数组非常适合二分查找。row = idx // n , col =转载 2021-03-10 01:26:24 · 185 阅读 · 0 评论 -
【数组】剑指 Offer 03. 数组中重复的数字 & 217. 存在重复元素 & 219. 存在重复元素 II & 220. 存在重复元素 III
剑指 Offer 03. 数组中重复的数字题目找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3解法Set辅助法由于只需要找出数组中任意一个重复的数字,因此遍历数组,遇到重复的数字即返回。为了判断一个数字是否重复遇到,使用集合存储已经遇到的数字,如果遇到的一个原创 2021-03-07 13:03:40 · 166 阅读 · 0 评论 -
【树】235. 二叉搜索树的最近公共祖先 & 236. 二叉树的最近公共祖先
235. 二叉搜索树的最近公共祖先236. 二叉树的最近公共祖先原创 2021-02-26 00:03:09 · 91 阅读 · 0 评论 -
【树】112. 路径总和 & 113. 路径总和 II & 129. 求根到叶子节点数字之和 & 257. 二叉树的所有路径 && 437. 路径总和 III & 687. 最长同值路径
112. 路径总和题目路径总和113. 路径总和 II题目路径总和 II124. 二叉树中的最大路径和题目二叉树中的最大路径和129. 求根到叶子节点数字之和题目求根到叶子节点数字之和257. 二叉树的所有路径题目二叉树的所有路径437. 路径总和 III题目路径总和 III687. 最长同值路径题目最长同值路径...转载 2021-02-26 00:00:41 · 136 阅读 · 0 评论 -
【树】104. 二叉树的最大深度 & 111. 二叉树的最小深度 & 559. N 叉树的最大深度 & 110. 平衡二叉树
104. 二叉树的最大深度题目104. 二叉树的最大深度给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7],3/ 9 20/ 15 7返回它的最大深度 3 。111. 二叉树的最小深度题目二叉树的最小深度559. N 叉树的最大深度题目N 叉树的最大深度110. 平衡二叉树题目平衡二叉树...转载 2021-02-25 16:00:27 · 189 阅读 · 0 评论 -
【树】100. 相同的树 & 101. 对称二叉树 & 226. 翻转二叉树
100. 相同的树题目给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。示例 1:输入:p = [1,2,3], q = [1,2,3]输出:true示例 2:输入:p = [1,2], q = [1,null,2]输出:false解法深度优先搜索如果两个二叉树都为空,则两个二叉树相同。如果两个二叉树中有且只有一个为空,则两个二叉树一定不相同。如果两个二叉树都不为空,那么首先判断它们的根节转载 2021-02-24 10:13:05 · 137 阅读 · 0 评论 -
【单调栈】316. 去除重复字母 & 402. 移掉K位数字
316. 去除重复字母题目316. 去除重复字母给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。注意:该题与 1081 相同示例 1:输入:s = “bcabc”输出:“abc”示例 2:输入:s = “cbacdcbc”输出:“acdb”解法字典序是指按照单词出现在字典的顺序比较两个字符串的方法。例如“abc”的字典序在“acbd”的前面。如果一个字母只出现一次,这个字母必须被选取。按照转载 2021-02-20 09:54:43 · 188 阅读 · 0 评论 -
【栈】227. 基本计算器 II & 224. 基本计算器
227. 基本计算器 II题目227. 基本计算器 II实现一个基本的计算器来计算一个简单的字符串表达式的值。字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。示例 1:输入: “3+2*2”输出: 7示例 2:输入: " 3/2 "输出: 1示例 3:输入: " 3+5 / 2 "输出: 5解法栈利用栈将四则运算化简成加法运算此算法的思路很简单,先把乘除法的值计算出来,最终将所有的运算简化成只有加法。先跳过空格出现了数字转载 2021-02-14 14:08:18 · 146 阅读 · 0 评论 -
【栈 & 双指针】844. 比较含退格的字符串
844. 比较含退格的字符串题目844. 比较含退格的字符串给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。注意:如果对空文本输入退格字符,文本继续为空。示例 1:输入:S = “ab#c”, T = “ad#c”输出:true解释:S 和 T 都会变成 “ac”。示例 2:输入:S = “ab##”, T = “c#d#”输出:true解释:S 和 T 都会变成 “”。示例 3:输入:S = “a##c”,转载 2021-02-14 12:37:02 · 190 阅读 · 0 评论 -
【栈】1021. 删除最外层的括号
1021. 删除最外层的括号题目1021. 删除最外层的括号如果有效字符串 S 非空,且不存在将其拆分为 S = A+B 的方法,我们称其为原语(primitive),其中 A 和 B 都是非空有效括号字符串。给出一个非空有效字符串 S,考虑将其进行原语化分解,使得:S = P_1 + P_2 + … + P_k,其中 P_i 是有效括号字符串原语。对 S 进行原语化分解,删除分解中每个原语字符串的最外层括号,返回 S 。示例 1:输入:"(()())(())"输出:"()()()"解释:转载 2021-02-14 11:15:17 · 130 阅读 · 0 评论 -
【栈】71. 简化路径
71. 简化路径题目71. 简化路径给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 ‘/’ 开头),请你将其转化为更加简洁的规范路径。在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,’//’)都被视为单个斜杠 ‘/’ 。 对于此问题,任何其他格式的点(例如,’…’)均被视为文件/目录名称。请注意,返回的 规范路径 必须遵循下述格转载 2021-02-09 11:47:28 · 372 阅读 · 0 评论 -
【栈】1047. 删除字符串中的所有相邻重复项 & 1544. 整理字符串
1047. 删除字符串中的所有相邻重复项题目1047. 删除字符串中的所有相邻重复项给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。示例:输入:“abbaca”输出:“ca”解释:例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “原创 2021-02-07 22:49:06 · 196 阅读 · 0 评论 -
【栈】150. 逆波兰表达式求值
150. 逆波兰表达式求值题目150. 逆波兰表达式求值根据 逆波兰表示法,求表达式的值。有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:整数除法只保留整数部分。给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。示例 1:输入: [“2”, “1”, “+”, “3”, “*”]输出: 9解释: 该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9示例 2:输入: [“4”,原创 2021-02-07 22:35:08 · 80 阅读 · 0 评论 -
【栈】682. 棒球比赛
682. 棒球比赛题目682. 棒球比赛你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表 ops,其中 ops[i] 是你需要记录的第 i 项操作,ops 遵循下述规则:x - 表示本回合新获得分数 x“+” - 表示本回合新获得的得分是前两次得分的总和。题目数据保证记录此操作时前面总是存在两个有效的分数。“D” - 表示本回合新获得的得分是前一次得分的两倍。题目数据保证记原创 2021-02-07 21:29:25 · 125 阅读 · 0 评论 -
【单调栈】496. 下一个更大元素 I & 739. 每日温度
496. 下一个更大元素 I题目496. 下一个更大元素 I给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。示例 1:输入: nums1 = [4,1,2], nums2 = [1,3,4,2].输出: [-1,3,-1]解释转载 2021-02-07 19:30:19 · 103 阅读 · 0 评论 -
【栈】225. 用队列实现栈 & 232. 用栈实现队列
225. 用队列实现栈题目请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通队列的全部四种操作(push、top、pop 和 empty)。实现 MyStack 类:void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元素。int top() 返回栈顶元素。boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。注意:你只能使用队列的基本操作 —— 也就是 push to back、peek/pop转载 2021-02-06 16:53:50 · 211 阅读 · 0 评论 -
【链表】155.最小栈
155.最小栈题目155.最小栈设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。示例:输入:[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”][[],[-2],[0],[-3],[],[],[],[]]输出:[n原创 2021-02-04 19:44:22 · 107 阅读 · 0 评论 -
【栈】20. 有效的括号
20. 有效的括号题目20. 有效的括号给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。示例 1:输入:s = “()”输出:true示例 2:输入:s = “()[]{}”输出:true示例 3:输入:s = “(]”输出:false示例 4:输入:s = “([)]”输出:false示例 5:输入:s = “{[]}转载 2021-02-04 12:55:59 · 80 阅读 · 0 评论 -
【链表】【单调栈】1019. 链表中的下一个更大节点
1019. 链表中的下一个更大节点题目1019. 链表中的下一个更大节点给出一个以头节点 head 作为第一个节点的链表。链表中的节点分别编号为:node_1, node_2, node_3, … 。每个节点都可能有下一个更大值(next larger value):对于 node_i,如果其 next_larger(node_i) 是 node_j.val,那么就有 j > i 且 node_j.val > node_i.val,而 j 是可能的选项中最小的那个。如果不存在这样的 j原创 2021-02-04 00:52:11 · 133 阅读 · 1 评论 -
【链表】817. 链表组件
817. 链表组件题目817. 链表组件给定链表头结点 head,该链表上的每个结点都有一个 唯一的整型值 。同时给定列表 G,该列表是上述链表中整型值的一个子集。返回列表 G 中组件的个数,这里对组件的定义为:链表中一段最长连续结点的值(该值必须在列表 G 中)构成的集合。示例 1:输入:head: 0->1->2->3G = [0, 1, 3]输出: 2解释:链表中,0 和 1 是相连接的,且 G 中不包含 2,所以 [0, 1] 是 G 的一个组件,同理 [3转载 2021-02-02 12:54:29 · 160 阅读 · 0 评论 -
【链表】707. 设计链表
707. 设计链表题目707. 设计链表设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。在链表类中实现这些功能:get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。addAtHead(val):在链表的第一个元素之前添加一个值为转载 2021-01-30 17:31:44 · 181 阅读 · 0 评论 -
【链表】2.两数相加 & 445. 两数相加 II
题目2. 两数相加给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。输入: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-01-29 16:25:35 · 107 阅读 · 0 评论 -
【链表】24.两两交换链表中的节点 & 25. K 个一组翻转链表
fff转载 2021-01-29 11:44:32 · 156 阅读 · 0 评论 -
【链表】143. 重排链表
题目给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例 1:给定链表 1->2->3->4, 重新排列为 1->4->2->3.示例 2:给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.解法寻找链表中点 + 链表逆序 + 合并链表根据题意原创 2021-01-27 00:59:13 · 265 阅读 · 0 评论 -
【链表】1721. 交换链表中的节点
题目1721. 交换链表中的节点解法 public ListNode swapNodes(ListNode head, int k) { ListNode fast = head; ListNode slow = head; for (int i = 0; i < k - 1; i++) { fast = fast.next; } ListNode first = fast; while原创 2021-01-26 20:22:30 · 201 阅读 · 0 评论 -
【链表】328. 奇偶链表 & 61.旋转链表 & 86. 分隔链表 & 725 分隔链表
题目奇偶链表解法public ListNode oddEvenList(ListNode head) { if (head == null) { return head; } ListNode evenHead = head.next; ListNode odd = head; ListNode even = head.next; while (even != null &转载 2021-01-26 20:03:00 · 178 阅读 · 0 评论 -
【链表】1290. 二进制链表转整数
题目1290. 二进制链表转整数给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。请你返回该链表所表示数字的 十进制值 。示例 1:输入:head = [1,0,1]输出:5解释:二进制数 (101) 转化为十进制数 (5)示例 2:输入:head = [0]输出:0示例 3:输入:head = [1]输出:1示例 4:输入:head = [1,0,0,1,0,0,1,1,1,0,0,0,0,0,0]输出:1原创 2021-01-25 15:18:01 · 104 阅读 · 0 评论 -
【链表】21. 合并两个有序链表 & 147. 对链表进行插入排序 & 148. 排序链表
题目21. 合并两个有序链表剑指 Offer 25. 合并两个排序的链表将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例 1:输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]示例 2:输入:l1 = [], l2 = []输出:[]示例 3:输入:l1 = [], l2 = [0]输出:[0]解法迭代我们可以用迭代的方法来实现上述算法。当 l1 和 l2 都不是空链表时,判断 l1转载 2021-01-25 14:42:53 · 247 阅读 · 0 评论 -
【链表】相交链表
题目面试题 02.07. 链表相交160. 相交链表编写一个程序,找到两个单链表相交的起始节点。如下面的两个链表:在节点 c1 开始相交。题解一图胜千言,看图你就明白了空间复杂度 O(1) 时间复杂度为 O(n)这里使用图解的方式,解释比较巧妙的一种实现。根据题目意思如果两个链表相交,那么相交点之后的长度是相同的我们需要做的事情是,让两个链表从同距离末尾同等距离的位置开始遍历。这个位置只能是较短链表的头结点位置。为此,我们必须消除两个链表的长度差指针 pA 指向 A 链表,指原创 2021-01-23 14:52:48 · 98 阅读 · 0 评论 -
【链表】141. 环形链表 & 面试题 02.08. 环路检测
题目141. 环形链表给定一个链表,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。进阶:你能用 O(1)(即,常量)内存解决此问题吗?示例 1:输入:head =原创 2021-01-23 14:22:44 · 116 阅读 · 0 评论 -
【链表】回文链表
题目在leetcode上有两个题234. 回文链表面试题 02.06. 回文链表原创 2021-01-21 17:00:55 · 159 阅读 · 0 评论 -
【链表】83. 删除排序链表中的重复元素 & 82. 删除排序链表中的重复元素 II
的原创 2021-01-21 15:51:43 · 87 阅读 · 0 评论 -
【链表】876. 链表的中间结点
题目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.nex原创 2021-01-21 15:45:34 · 85 阅读 · 0 评论 -
【链表】面试题 02.01. 移除重复节点
题目面试题 02.01. 移除重复节点编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。示例1:输入:[1, 2, 3, 3, 2, 1]输出:[1, 2, 3]示例2:输入:[1, 1, 1, 1, 2]输出:[1, 2]提示:链表长度在[0, 20000]范围内。链表元素在[0, 20000]范围内。进阶:如果不得使用临时缓冲区,该怎么解决?解法使用辅助set法建立一个辅助的数据结构,用来保存节点值搞一个虚拟头节点来遍历所有的节点class Solution原创 2021-01-21 14:59:38 · 106 阅读 · 2 评论