
Leetcode
刷题记录
磨叽墨迹墨迹
这个作者很懒,什么都没留下…
展开
-
基础排序算法
例题:给你一个整数数组nums,请你将该数组升序排列。n为数组大小。1、选择排序法思路:每一轮选出未排序部分的最小元素,交换到未排序部分的最开头。即先选出最小的,然后是第二小的,以此类推。复杂度分析:时间复杂度:O(N^2),这里N是数组的长度; 空间复杂度:O(1),使用到常数个临时变量。C++实现如下:class Solution {public: vector<int> sortArray(vector<int>& nums...原创 2021-03-25 14:22:26 · 138 阅读 · 0 评论 -
动态规划模板
状态定义:定义dp[i]ordp[i][j],确定dp数组代表的意义;转移方程:根据dp数组意义,确定状态转移方程,即由已知的dp[i-1]求dp[i]的过程;初始状态:确定dp数组的初始状态,一般是dp[0]ordp[0][0]ordp[0][...]等;返回值:根据最终求得的dp数组求需要的返回值;优化:有的时候可以对时间或者空间复杂度进一步优化。例题:连续子数组的最大和题目:输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O原创 2021-03-09 19:12:48 · 185 阅读 · 0 评论 -
494. 目标和
原题链接:494. 目标和题目:给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号+和-。对于数组中的任意一个整数,你都可以从+或-中选择一个符号添加在前面。返回可以使最终数组和为目标数 S 的所有添加符号的方法数。思路:动态规划。首先,如果我们把nums划分成两个子集A和B,分别代表分配+的数和分配-的数,那么他们和target存在如下关系:sum(A) - sum(B) = targetsum(A) = t...原创 2021-03-05 14:59:00 · 220 阅读 · 0 评论 -
347. 前 K 个高频元素
原题链接:347. 前 K 个高频元素题目:给定一个非空的整数数组,返回其中出现频率前k高的元素。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]提示:你可以假设给定的k总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。你的算法的时间复杂度必须优于 O(n log n) ,n是数组的大小。题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集...原创 2021-03-02 20:12:56 · 102 阅读 · 0 评论 -
841. 钥匙和房间
原题链接:841.钥匙和房间题目:有 N 个房间,开始时你位于 0 号房间。每个房间有不同的号码:0,1,2,...,N-1,并且房间里可能有一些钥匙能使你进入下一个房间。在形式上,对于每个房间 i 都有一个钥匙列表 rooms[i],每个钥匙 rooms[i][j] 由 [0,1,...,N-1] 中的一个整数表示,其中 N = rooms.length。 钥匙 rooms[i][j] = v 可以打开编号为 v 的房间。最初,除 0 号房间外的其余所有房间都被锁住。你可以自由地在房间原创 2021-02-24 17:46:27 · 236 阅读 · 0 评论 -
394. 字符串解码
原题链接:394. 字符串解码题目:给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像3a或2[4]的输入。思路:参考字符串解码(辅助栈法 / 递归法,清晰图解)...原创 2021-02-23 14:41:19 · 96 阅读 · 0 评论 -
133. 克隆图
原题链接:133. 克隆图题目:给你无向连通图中一个节点的引用,请你返回该图的深拷贝(克隆)。图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。class Node { public int val; public List<Node> neighbors;}思路1:DFS。C++实现如下:/*// Definition for a Node.class Node {public: int v...原创 2021-02-22 09:59:18 · 104 阅读 · 0 评论 -
739. 每日温度
原题链接:739. 每日温度题目:请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用0 来代替。例如,给定一个列表temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是[1, 1, 4, 2, 1, 1, 0, 0]。提示:气温 列表长度的范围是[1, 30000]。每个气温的值的均为华氏度,都是在[30, 100]范围内的整数。思路...原创 2021-02-21 14:00:33 · 117 阅读 · 0 评论 -
752. 打开转盘锁
原题链接:752. 打开转盘锁题目:你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字:'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'。每个拨轮可以自由旋转:例如把'9'变为'0','0'变为'9'。每次旋转都只能旋转一个拨轮的一位数字。锁的初始数字为'0000',一个代表四个拨轮的数字的字符串。列表deadends包含了一组死亡数字,一旦拨轮的数字和列表里的任何一个元素相同,这个锁将会被永久锁定,无法再被旋转。...原创 2021-02-20 14:19:59 · 111 阅读 · 0 评论 -
200. 岛屿数量
原题链接:岛屿数量题目:给你一个由'1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。思路:BFS算法。递归解法C++实现如下:class Solution {public: int numIslands(vector<vector<char>>& grid) { int nums = 0; .原创 2021-02-20 14:16:14 · 167 阅读 · 0 评论 -
平衡二叉树
原题链接:平衡二叉树题目:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1 。思路:参考110. 平衡二叉树(从底至顶,从顶至底)。C++实现如下:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *righ.原创 2021-02-13 12:38:48 · 73 阅读 · 0 评论 -
二叉搜索树的最近公共祖先
原题链接:二叉搜索树的最近公共祖先题目:给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”思路:递归。考虑两个节点的值,如果两个节点的值都是大于root的值,那么公共祖先在root的右子树中;如果两个节点的值都是小于root的值,那么公共祖先在root的左子树中;否则,说明两个节点的值一个大于root原创 2021-02-13 11:03:44 · 100 阅读 · 0 评论 -
701. 二叉搜索树中的插入操作
原题链接:701. 二叉搜索树中的插入操作题目:给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。思路:迭代C++实现如下:/** * Definition for a binary tree node. * struct TreeNode { * int原创 2021-02-09 12:37:57 · 114 阅读 · 0 评论 -
700. 二叉搜索树中的搜索
原题链接:700. 二叉搜索树中的搜索题目:给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。例如,给定二叉搜索树: 4 / \ 2 7 / \ 1 3和值: 2你应该返回如下子树: 2 / \ 1 3思路1:递归C++实现如下:/** * Definit...原创 2021-02-09 12:24:50 · 76 阅读 · 0 评论 -
173. 二叉搜索树迭代器
原题链接:二叉搜索树迭代器题目:实现一个二叉搜索树迭代器。你将使用二叉搜索树的根节点初始化迭代器。调用next()将返回二叉搜索树中的下一个最小的数。示例:BSTIterator iterator = new BSTIterator(root);iterator.next(); // 返回 3iterator.next(); // 返回 7iterator.hasNext(); // 返回 trueiterator.next(); // 返回 9i...原创 2021-02-08 14:33:22 · 77 阅读 · 0 评论 -
98. 验证二叉搜索树
原题链接:98. 验证二叉搜索树题目:给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。思路:中序遍历二叉树得到一个序列。判断这个序列是不是递增的,是的话即为二叉搜索树,否则不是。C++实现如下:/** * Definition for a binary tree node. * struct TreeNode { *原创 2021-02-08 12:58:43 · 70 阅读 · 0 评论 -
236. 二叉树的最近公共祖先
原题链接:236. 二叉树的最近公共祖先题目:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”思路:参考【C++ 经典递归】思路非常好理解 时间复杂度O(n), 空间复杂度O(n)。这里的思路是主要有三种情况:①两个结点都存在的话,则找出他们的最近公共祖先;②一个结点存在,另一个结点不存在的话,则最近公共祖先原创 2021-02-07 13:23:40 · 73 阅读 · 0 评论 -
116. 填充每个节点的下一个右侧节点指针
原题链接:116. 填充每个节点的下一个右侧节点指针题目:给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有next 指针都被设置为 NULL。思路:BFS层序遍历。...原创 2021-02-06 14:24:51 · 185 阅读 · 0 评论 -
106. 从中序与后序遍历序列构造二叉树 和 105. 从前序与中序遍历序列构造二叉树
题目:根据一棵树的中序遍历与后序遍历构造二叉树。思路:递归法。C++实现如下:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x)原创 2021-02-06 14:22:39 · 73 阅读 · 0 评论 -
112. 路径总和
原题链接:路径总和题目:给你二叉树的根节点root 和一个表示目标和的整数targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和targetSum 。叶子节点 是指没有子节点的节点。思路1:递归C++实现:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNo...原创 2021-02-05 14:31:28 · 103 阅读 · 0 评论 -
101. 对称二叉树
原题链接:对称二叉树题目:给定一个二叉树,检查它是否是镜像对称的。例如,二叉树[1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2/ \ / \3 4 4 3但是下面这个[1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3思路1:递归C++实现:/** * Definition for a binary tree node. ...原创 2021-02-05 14:22:14 · 77 阅读 · 0 评论 -
199. 二叉树的右视图
原题链接:二叉树的右视图题目:给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例:输入:[1,2,3,null,5,null,4]输出:[1, 3, 4]解释: 1 <---/ \2 3 <---\ \ 5 4 <---思路:采用从右至左的层序遍历,BFS,将每层读到的第一个数据保存即可。C++实现如下:/** ...原创 2021-02-03 14:27:06 · 83 阅读 · 0 评论 -
103. 二叉树的锯齿形层序遍历
原题链接:https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal/题目:给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。例如:给定二叉树[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回锯齿形层序遍历如下:[ [3], [20,9],...原创 2021-02-02 16:53:22 · 99 阅读 · 0 评论 -
1162. 地图分析
原题链接:地图分析题目:你现在手里有一份大小为N x N 的 网格 grid,上面的每个 单元格 都用0和1标记好了。其中0代表海洋,1代表陆地,请你找出一个海洋单元格,这个海洋单元格到离它最近的陆地单元格的距离是最大的。我们这里说的距离是「曼哈顿距离」(Manhattan Distance):(x0, y0) 和(x1, y1)这两个单元格之间的距离是|x0 - x1| + |y0 - y1|。如果网格上只有陆地或者海洋,请返回-1。思路:采用BFS算法(广...原创 2021-02-02 16:19:26 · 110 阅读 · 0 评论 -
岛屿问题:网络结构中的dfs
参考:LeetCode 例题精讲 | 12 岛屿问题:网格结构中的 DFS例题1:岛屿的最大面积原题链接:695. 岛屿的最大面积题目:给定一个包含了一些0和1的非空二维数组grid。一个岛屿是由一些相邻的1(代表土地) 构成的组合,这里的「相邻」要求两个1必须在水平或者竖直方向上相邻。你可以假设grid的四个边缘都被0(代表水)包围着。找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为0。)C++实现如下:class Solut...原创 2021-02-01 19:15:18 · 157 阅读 · 0 评论 -
102. 二叉树的层序遍历
原题链接:二叉树的层序遍历题目:给你一个二叉树,请你返回其按层序遍历得到的节点值。 (即逐层地,从左到右访问所有节点)。思路:广度优先遍历(BFS)。参考: BFS 的使用场景总结:层序遍历、最短路径问题C++实现如下:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * Tr..原创 2021-01-31 10:30:35 · 88 阅读 · 0 评论 -
144. 二叉树的前序遍历、94. 二叉树的中序遍历、145. 二叉树的后序遍历
题目:实现二叉树的前序遍历、中序遍历和后序遍历。前序遍历:首先访问根结点,然后遍历左子树,最后遍历右子树(根->左->右)。中序遍历:首先遍历左子树,然后访问根节点,最后遍历右子树(左->根->右)。后序遍历:首先遍历左子树,然后遍历右子树,最后访问根节点(左->右->根)。解法1:递归C++实现如下:前序遍历/** * Definition for a binary tree node. * struct TreeNode { *原创 2021-01-30 16:20:43 · 389 阅读 · 0 评论 -
82.删除排序链表中重复元素Ⅱ
原题链接:删除链表中的重复元素题目:给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有重复出现的数字。示例1:输入: 1->2->3->3->4->4->5输出: 1->2->5示例2:输入: 1->1->1->2->3输出: 2->3思路:采用三个指针。slow指针指向第一个重复节点,fast指向最后一个重复节点,temp指向第一个重复节点的前一个节点。如果fast节...原创 2021-01-28 14:59:23 · 120 阅读 · 0 评论 -
24.两两交换链表中的节点
原题链接:两两交换链表中的节点题目:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。输入:head = [1,2,3,4]输出:[2,1,4,3]示例 2:输入:head = []输出:[]示例 3:输入:head = [1]输出:[1]提示:链表中节点的数目在范围 [0, 100] 内0 <= Node.val <= 100思路:采用三指针法。slow和fast分别指向需要交.原创 2021-01-28 14:19:23 · 168 阅读 · 1 评论 -
147. 对链表进行插入排序
原题链接:对链表进行插入排序题目:插入排序算法:插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。重复直到所有输入数据插入完为止。思路:对链表进行插入排序的具体过程如下。1、首先判断给定的链表是否为空,若为空,则不需要进行排序,直接返回。2、创建哑节点 dummyHead,令 dummyHead.next = head。引入哑节点是为了便于在 head 节点之原创 2021-01-27 16:05:38 · 222 阅读 · 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.思路1:将链表的各个节点存储在...原创 2021-01-27 15:06:56 · 224 阅读 · 0 评论 -
92. 反转链表 II
原题链接:反转链表题目:反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。说明:1 ≤m≤n≤ 链表长度。示例:输入: 1->2->3->4->5->NULL, m = 2, n = 4输出: 1->4->3->2->5->NULL思路:步步拆解:如何递归地反转链表的一部分C++实现如下:/** * Definition for singly-linked list. * struct ListN...原创 2021-01-24 18:21:20 · 65 阅读 · 0 评论 -
61. 旋转链表
原题链接:旋转链表。题目:给定一个链表,旋转链表,将链表每个节点向右移动k个位置,其中k是非负数。示例1:输入: 1->2->3->4->5->NULL, k = 2输出: 4->5->1->2->3->NULL解释:向右旋转 1 步: 5->1->2->3->4->NULL向右旋转 2 步: 4->5->1->2->3->NULL思路:快慢指针法C+...原创 2021-01-19 10:43:38 · 70 阅读 · 0 评论 -
138. 复制带随机指针的链表
原题链接:复制带随机指针的链表题目:给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的深拷贝。我们用一个由n个节点组成的链表来表示输入/输出中的链表。每个节点用一个[val, random_index]表示:val:一个表示Node.val的整数。random_index:随机指针指向的节点索引(范围从0到n-1);如果不指向任何节点,则为null。示例1:输入:head = [[7,null...原创 2021-01-18 15:27:37 · 78 阅读 · 0 评论 -
430. 扁平化多级双向链表
原题链接:扁平化多级双向链表。题目:多级双向链表中,除了指向下一个节点和前一个节点指针之外,它还有一个子链表指针,可能指向单独的双向链表。这些子列表也可能会有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。给你位于列表第一级的头节点,请你扁平化列表,使所有结点出现在单级双链表中。示例 1输入:head = [1,2,3,4,5,6,null,null,null,7,8,9,10,null,null,11,12]输出:[1,2,3,7,8,11,12,9,10,4,5,6原创 2021-01-18 10:44:29 · 76 阅读 · 0 评论 -
707. 设计双向链表
原题链接:设计链表题目:设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val和next。val是当前节点的值,next是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性prev以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。在链表类中实现这些功能:get(index):获取链表中第index个节点的值。如果索引无效,则返回-1。addAtHead(val):在链表的第一个元素之前添加一个值为val的节点...原创 2021-01-09 13:41:45 · 112 阅读 · 0 评论 -
234. 回文链表
原题链接:回文链表题目:请判断一个链表是否为回文链表。示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true进阶:你能否用O(n) 时间复杂度和 O(1) 空间复杂度解决此题?思路:采用快慢指针,慢指针一次走一个字节,快指针一次走两个结点,当快指针走到结尾时,慢指针刚好走到中间。同时设置一个结点pre,该结点记录slow所走过的结点,并将结点顺序反转过来。最后比较pre和slow两个链表的结点即可。C++.原创 2021-01-07 21:17:45 · 82 阅读 · 0 评论 -
链表刷题小结
1、要学会设置哨兵结点,有的时候在遍历链表结束时需要返回链表头结点,如果是用哨兵结点遍历的话这个时候就会很方便(不影响头结点)。比如说328.奇偶链表;2、链表的题要时刻注意结点为0的情况。...原创 2021-01-07 20:46:12 · 133 阅读 · 0 评论 -
328. 奇偶链表
原题链接:奇偶链表题目:给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。示例 1:输入: 1->2->3->4->5->NULL输出: 1->3->5->2->4->NULL示例 2:输入: 2->1->原创 2021-01-07 20:42:03 · 89 阅读 · 0 评论 -
203. 移除链表元素
原题链接:移除链表元素。题目:删除链表中等于给定值val的所有节点。示例:输入: 1->2->6->3->4->5->6, val = 6输出: 1->2->3->4->5。思路:由于头结点需要单独考虑,所以构建一个虚拟头结点,然后遍历整个链表即可。C++实现如下:/** * Definition for singly-linked list. * struct ListNode { * int ..原创 2021-01-07 10:40:16 · 120 阅读 · 0 评论