Leetcode算法题解
文章平均质量分 68
记录Leetcode上有趣的算法题解
@Sup
学无止境!
展开
-
Leetcode406题:根据身高重建队列
我只想说,对于数组问题,先排个序,说不定就会有意想不到的惊喜,哈哈哈1.题目描述假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0].原创 2022-04-29 19:56:48 · 148 阅读 · 0 评论 -
Leetcode使用单调栈解决柱状图面积问题
今天刚做了两道Leetcode上难度为Hard的难题,使用到了单调栈的思想,这里将思路总结一下,便于后续复习。这两道题分别是:Leetcode 84. 柱状图中最大的矩形Leetcode 85. 最大矩形1.题目描述1.1 Leetcode84. 柱状图中最大的矩形给定n个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。示例1:输入:heights = [2,1,5,6,2,3]输出:..原创 2022-04-28 16:50:00 · 346 阅读 · 0 评论 -
Leetcode301题:删除无效的括号
1.题目描述给你一个由若干括号和字母组成的字符串 s ,删除最小数量的无效括号,使得输入的字符串有效。返回所有可能的结果。答案可以按任意顺序返回。示例1:输入:s = "()())()"输出:["(())()","()()()"]示例2:输入:s = ")("输出:[""]链接:https://leetcode-cn.com/problems/remove-invalid-parentheses/来源:力扣(LeetCode)2.思路分析这道题...原创 2022-04-28 11:10:10 · 537 阅读 · 0 评论 -
Leetcode647题:求回文子串的数目
这道题和回文子串题类似,但不同的是以往的题目都是要求计算回文子串的最长长度,而这里要求计算回文子串的数目,计算方式略微不同。1.题目描述给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。示例1:输入:s = "abc"输出:3解释:三个回文子串: "a", "b", "c"来源:原创 2022-04-27 11:17:11 · 2050 阅读 · 0 评论 -
Leetcode75题:颜色分类
本题是经典的「荷兰国旗问题」,由计算机科学家Edsger W. Dijkstra首先提出。1.题目描述给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。必须在不使用库的sort函数的情况下解决这个问题。示例1:输入:nums = [2,0,2,1,1,0]输出:[0,0,1,1,2,2]来源:力扣(LeetCode)链接..原创 2022-04-23 16:24:01 · 1898 阅读 · 0 评论 -
Leetcode208题:实现 Trie (前缀树/字典树)
1.题目描述Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。请你实现 Trie 类:Trie() 初始化前缀树对象。 void insert(String word) 向前缀树中插入字符串 word 。 boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。 boolea.原创 2022-04-22 11:33:00 · 207 阅读 · 0 评论 -
Leetcode拓扑排序系列问题
该问题也是面试中常考的题型,一般有两种解法:一种是正向思维,从入度考虑,类似广度优先搜索; 另一种是逆向思维,从出度考虑,类似深度优先搜索我推荐优先从入度考虑,这个方式比较符合多数人的思维逻辑一、Leetcode207题:课程表1.题目描述你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,原创 2022-04-21 17:25:06 · 926 阅读 · 0 评论 -
Leetcode接雨水系列问题
目前遇到的有以下相似题目,后续会持续更新......Leetcode11. 盛最多水的容器Leetcode42. 接雨水一、Leetcode11题:盛最多水的容器1.题目描述给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i,height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。示例1:输入:[1,8,6,2,5,原创 2022-04-21 11:00:14 · 2373 阅读 · 0 评论 -
Leetcode48题:旋转图像
1.题目描述给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。示例1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[[7,4,1],[8,5,2],[9,6,3]]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/rotate-image原创 2022-04-18 20:42:38 · 345 阅读 · 0 评论 -
Leetcode岛屿问题系列分析
在 LeetCode 中,「岛屿问题」是一个系列系列问题,比如:200. 岛屿数量(Medium) 463. 岛屿的周长(Easy) 695. 岛屿的最大面积(Medium) 827. 最大人工岛(Hard)我们所熟悉的 DFS(深度优先搜索)问题通常是在树或者图结构上进行的。而我们今天要讨论的 DFS 问题,是在一种「网格」结构中进行的。岛屿问题是这类网格 DFS 问题的典型代表。网格结构遍历起来要比二叉树复杂一些,如果没有掌握一定的方法,DFS 代码容易写得冗长繁杂。本文将以...原创 2022-04-14 16:02:49 · 1981 阅读 · 0 评论 -
牛客网笔试系统ACM模式下的程序输入格式总结
Java提供两种方式进行键盘的输入,BufferedReader 和 Scanner一.用BufferedReader进行输入提供的方法有:readLine(); // 以enter为结束标志,读取一行数据,返回一个字符串,注意点1:导入三个包(也可以直接import java.io.*; 美滋滋)import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;.原创 2022-04-13 17:22:16 · 3926 阅读 · 0 评论 -
剑指 Offer 19题:正则表达式匹配
1.题目描述请实现一个函数用来匹配包含'. '和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"和"ab*a"均不匹配。示例1:输入:s = "aa"p = "a"输出: false解释: "a" 无法匹配 "aa" 整个字符串。来源:力扣(LeetCode)链接:https://leetc原创 2022-04-07 19:24:41 · 472 阅读 · 0 评论 -
剑指 Offer 60题:n个骰子的点数
1.题目描述把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。示例1:输入: 1输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/nge-tou-zi-de-dian原创 2022-04-07 17:24:51 · 154 阅读 · 0 评论 -
剑指 Offer 49题:丑数
1.题目描述我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。示例1:输入: n = 10输出: 12解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/chou-shu-lcof/2.思路分析丑数的递推性质: 丑数只包含因子 2, 3, 5 ,因此有 “丑数 = 某较小原创 2022-04-07 16:38:59 · 606 阅读 · 0 评论 -
剑指 Offer 36题:二叉搜索树与双向链表
1.题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。为了让您更好地理解问题,以下面的二叉搜索树为例:我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。特别地,我们希望可以就地完成转换操作。当转化完成以原创 2022-04-04 16:06:20 · 135 阅读 · 0 评论 -
剑指 Offer 45题:把数组排成最小的数
1.题目描述输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。示例 1:输入:[10,2]输出:“102”示例 2:输入:[3,30,34,5,9]输出:“3033459"2.思路分析此题求拼接起来的最小数字,本质上是一个排序问题。设数组 nums 中任意两数字的字符串为 x和 y,则规定 排序判断规则 为:若拼接字符串 x + y > y + x ,则 x“大于” y ; 反之,若 x + y <...原创 2022-04-04 09:05:59 · 514 阅读 · 0 评论 -
剑指 Offer 41题:数据流中的中位数
1.题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。例如,[2,3,4] 的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。 double findMedian() - 返回目前所有元素的中位数。示原创 2022-04-03 17:34:18 · 86 阅读 · 0 评论 -
剑指 Offer 35题:复杂链表的复制
一.题目描述请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。示例1:输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]示例2:输入:head = [[1,1],[2,1]]输出:[[1,1],[2,1]]原创 2022-04-01 15:22:26 · 68 阅读 · 0 评论 -
剑指 Offer 59题:队列的最大值
1.题目描述请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1示例1:输入:["MaxQueue","push_back","push_back","max_value","pop_front","max_value"][[],[1],[2],[],[],[]]输出:[null,null,n..原创 2022-03-29 17:24:10 · 1262 阅读 · 0 评论 -
剑指 Offer 62题:约瑟夫环问题
这道题是著名的约瑟夫环问题,解法比较有意思,所以记录一下,说不定后面玩游戏能用到呢hhh1.题目描述0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。示例1:输入: n = 5, m = 3输出:3来源:力扣(LeetCod..原创 2022-03-29 11:01:24 · 2711 阅读 · 0 评论 -
剑指 Offer 51题:数组中的逆序对
1.题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。示例1:输入: [7,5,6,4]输出: 5来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/shu-zu-zhong-de-ni-xu-dui-lcof/2.思路分析「归并排序」与「逆序对」是息息相关的。归并排序体现了 “分而治之” 的算法思想,具体为:分: 不断将数组从中点位置划原创 2022-03-28 16:19:24 · 220 阅读 · 0 评论 -
Leetcode 72 题:编辑距离
1.题目描述给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符 删除一个字符 替换一个字符示例1:输入:word1 = "horse", word2 = "ros"输出:3解释:horse -> rorse (将 'h' 替换为 'r')rorse -> rose (删除 'r')rose -> ros (删除 'e')示例2:输入:word原创 2022-03-27 18:57:44 · 1104 阅读 · 0 评论 -
剑指 Offer 43题:1~n 整数中 1 出现的次数
1.题目描述输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。示例1:输入:n = 12输出:5示例2:输入:n = 13输出:6来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/1nzheng-shu-zhong-1chu-xian-de-ci-shu-lcof2.思路分析根据题目要求,我..原创 2022-03-27 15:51:19 · 131 阅读 · 0 评论 -
剑指 Offer 44题:数字序列中某一位的数字
1.题目描述数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。示例1:输入:n = 3输出:3示例2:输入:n = 11输出:0来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/shu-zi-xu-lie-zhong-mou-yi-wei-de-shu-zi-原创 2022-03-27 15:33:32 · 189 阅读 · 0 评论 -
剑指 Offer 38题:字符串的排列
1.题目描述输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例1:输入:s = "abc"输出:["abc","acb","bac","bca","cab","cba"]2.思路这道题和数值的全排列问题基本一致,唯一的不同是这道题要求不能包含重复的字符串。除此之外用LinkedList记录路径时,不能直接进行剪枝,因此需要用额外的数组进行记录。3.解答class Solution { //回.原创 2022-03-26 16:02:54 · 108 阅读 · 0 评论 -
剑指 Offer 37题:序列化二叉树
这道题 Leetcode 上标的是 Hard 难度,但我觉得只要理解了解题思路,实现起来还是很简单的 1.题目描述请实现两个函数,分别用来序列化和反序列化二叉树。你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/xu-lie-hua-er-cha-shu-lc原创 2022-03-25 17:06:44 · 962 阅读 · 0 评论 -
剑指 Offer 20题. 表示数值的字符串
1.题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。数值(按顺序)可以分成以下几个部分:若干空格 一个小数或者整数 (可选)一个'e'或'E',后面跟着一个整数 若干空格小数(按顺序)可以分成以下几个部分:(可选)一个符号字符('+' 或 '-') 下述格式之一: 至少一位数字,后面跟着一个点 '.' 至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字 一个点 '.' ,后面跟着至少一位数字整数(按顺序)可以分成以下几个部分:...原创 2022-03-24 15:58:44 · 366 阅读 · 0 评论 -
Leetcode 354题:俄罗斯套娃信封问题
1.题目描述给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。请计算 最多能有多少个 信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。注意:不允许旋转信封。示例1输入:envelopes = [[5,4],[6,4],[6,7],[2,3]]输出:3解释:最多信封的个数为 3,原创 2022-03-23 19:01:30 · 1166 阅读 · 0 评论 -
剑指 Offer 17. 打印从1到最大的n位数(主要考察大数问题越界情况)
首先,按照剑指offer设置这道题的目的,这道题绝对不可能是一道简单题,绝对是保medium冲hard的水平。之所以是简单题,是因为leetcode没有把它当作一道大数问题来考我们。一般在面试中如果考察到的话,大概率是要求考虑大数越界情况,且返回字符型数组而不是整型数组。1.题目描述输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。示例 1:输入: n = 1输出: [1,2,3,4,5,6,7,8,9].原创 2022-03-23 16:58:48 · 148 阅读 · 0 评论 -
Leetcode 887题:鸡蛋掉落问题
这道题难度为hard,问题求解相对复杂,但也是面试高频题,因此有必要总结一下。1.题目描述给你 k 枚相同的鸡蛋,并可以使用一栋从第 1 层到第 n 层共有 n 层楼的建筑。已知存在楼层 f ,满足 0 <= f <= n ,任何从 高于 f 的楼层落下的鸡蛋都会碎,从 f 楼层或比它低的楼层落下的鸡蛋都不会破。每次操作,你可以取一枚没有碎的鸡蛋并把它从任一楼层 x 扔下(满足 1 <= x <= n)。如果鸡蛋碎了,你就不能再次使用它。如果某枚鸡蛋扔下后没有摔碎,则原创 2022-03-20 18:58:51 · 1831 阅读 · 0 评论 -
Leetcode 651题:4键键盘问题
Leetcode网站中的这道题是Plus会员专享题,为了加深记忆特此将思路及解法记录下来,便于后期复习(好吧,就是因为贫穷开不起会员)1.题目描述2.思路这个算法基于这样⼀个事实,最优按键序列⼀定只有两种情况:(1)要么⼀直按 A :A,A,...A(当 N ⽐较⼩时)。(2)要么是这么⼀个形式:A,A,...C-A,C-C,C-V,C-V,...C-V(当 N ⽐较⼤时)。因为字符数量少(N ⽐较⼩)时, C-A C-C C-V 这⼀套操作的代价相对⽐较⾼,可能不如⼀个个按 A.原创 2022-03-18 17:41:41 · 1145 阅读 · 0 评论