![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
21天挑战赛打卡
文章平均质量分 79
_刘小雨
一枚普通而~~~
展开
-
leetcode 66. 加一(简单模拟题)
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。示例1:示例2:示例 3:此题方法是用模拟法过程是模拟人工加法的过程。从低位到高位,依次计算出每一位数字,过程中需要记录进位。如果最高位进位是1,则需要将整个数组后移一位,并在第0个位置写上1。执行结果:最多遍历n位, 时间复杂度为O(n)原创 2022-08-21 14:25:56 · 372 阅读 · 2 评论 -
leetcode 64. 最小路径和
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例1:示例2:此题方法是用dp 表示从起点走到的路径和的最小值最后面有两个状态能走到, 分别是从上面走到、从左边走到从上面走到: 从左边走到: 下面给出分析图:执行结果:其中每个格子遍历一次, 时间复杂度为O(n2)原创 2022-08-21 13:56:42 · 317 阅读 · 0 评论 -
leetcode 63. 不同路径 II(dp)
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。示例1:示例2:此题和上一题方法一样,唯一不同就是增加一个障碍物。所以只需在递归时候判断一下是否满足条件,如没有障碍物,则加上此条路径;反之,跳过。执行结果:时间复杂度为O(m * n)原创 2022-08-20 13:19:05 · 1152 阅读 · 0 评论 -
leetcode 62. 不同路径(简单dp)
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?示例1:示例2:示例 3:此题方法是用dp我们画一个图,模拟一下不同路径由于是一个简单的dp,这里直接给出递归公式由于有特殊情况, 当时, ; 当 时,当然了 当 时, 上述做法需要一个大小为m x n的二维数组,空间复杂度为O(mn),但其实只会用到和,不会用到之前的数据,因此可原创 2022-08-20 13:09:39 · 642 阅读 · 0 评论 -
leetcode 61. 旋转链表
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。示例1:示例2:提示:链表中节点的数目在范围 [0, 500] 内-100原创 2022-08-20 11:26:36 · 441 阅读 · 0 评论 -
leetcode 60. 排列序列(困难、计数法)
给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:“123”“132”“213”“231”“312”“321”给定 n 和 k,返回第 k 个排列。示例1:示例2:示例 3:此题方法之一是用库函数说明: 是求当前排列的下一个排列。方法二:计数法算法分析:原理:因为集合n个数的排列有n!个不同排列, 确定一个数后,后面应该有(n - 1)! 个不同排列,根据此性质,可定位到第几位数字是几。举例:当原创 2022-08-21 07:00:00 · 1268 阅读 · 0 评论 -
leetcode 59. 螺旋矩阵 II
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。示例1:示例2:此题方法是模拟填数就行。可以看下之前的leetcode54 螺旋矩阵我们顺时针定义四个方向:上右下左。从左上角(0, 0)开始遍历,先往右走,走到不能走为止,然后更改到下个方向,再走到不能走为止,依次类推,遍历 n2 个格子后停止。执行结果:矩阵中每个格子遍历一遍,时间复杂度为O(n2)原创 2022-08-20 06:30:00 · 340 阅读 · 0 评论 -
leetcode 58. 最后一个单词的长度(双指针、简单)
给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。单词 是指仅由字母组成、不包含任何空格字符的最大子字符串示例1:示例2:示例 3:此题方法是用双指针两种方法:算法步骤:算法步骤:算法二执行结果:其中遍历一次, 时间复杂度为O(n)原创 2022-08-19 10:45:38 · 447 阅读 · 0 评论 -
leetcode 57. 插入区间
给你一个 无重叠的 ,按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。示例1:示例2:示例 3:示例 4:示例 5:此题方法是模拟题插入区间的题意理解如图示:我们只需要模拟一下即可。算法步骤:执行结果:其中遍历一次, 时间复杂度为O(n)............原创 2022-08-19 10:04:49 · 1881 阅读 · 0 评论 -
leetcode 56. 合并区间
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。示例1:示例2:此题方法是用贪心算法步骤:执行结果:排序了一次,后面是线性扫描, 所以时间复杂度为O(nlogn)...原创 2022-08-19 06:00:00 · 316 阅读 · 0 评论 -
leetcode 54. 螺旋矩阵
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。示例1:示例2:此题方法是用模拟题、语法题首先 需要确定4个方向,如图:按照题目意思, 需一直 →、↓、←、↑; →、↓、←、↑; 这个顺序来模拟遍历算法步骤:执行结果:其中遍历一次, 时间复杂度为O(n * m)...原创 2022-08-18 11:22:49 · 349 阅读 · 1 评论 -
leetcode 55. 跳跃游戏
给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。示例1:示例2:此题方法是用贪心类似 leetcode 45 题核心:尽可能跳到更远的位置算法步骤:执行结果:其中遍历一次, 时间复杂度为O(n)......原创 2022-08-18 11:02:47 · 868 阅读 · 0 评论 -
leetcode 53. 最大子数组和(简单dp)
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。示例1:示例2:示例 3:此题方法是用dp算法步骤:优化:其实可以将上面额外开辟的数组空间优化成一个常量记录下来,然后用常量迭代更新答案即可。见第二个代码。用额外数据空间记录,空间复杂度为 O(n)。用常量记录信息,空间复杂度为 O(1)。执行结果:其中遍历一次, 时间复杂度为O(n)。没有用额外的数组,空间复杂度为O(1)。......原创 2022-08-17 12:16:11 · 750 阅读 · 4 评论 -
leetcode 50. Pow(x, n) (快速幂)
实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。示例1:示例2:示例 3:提示:此题方法是用快速幂分析:注意:需要用类型的专门存的绝对值,因为范围是,若取到取绝对值后变成会爆范围核心:快速幂的核心思想:就是需要把n 拆分成二进制表示,然后就可以根据n 的二进制表示来加速计算如果n 的第k为1,则需要乘上x 的2k次方,计算x 的2k次方,自需每次将自身做平方即可。递归预处理二进制幂:示例:执行结果:只进行O(logn)次乘法运算,故时间复杂度为O(logn).原创 2022-08-17 10:49:27 · 701 阅读 · 2 评论 -
leetcode 47. 全排列 II(46题变形)
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。示例1:示例2:可先看leetcode 46 全排列此题方法是用dfs + 回溯这题剪枝的前提需要先排序,排序后所有相等的数全部都靠在一起另外,在遇到重复元素时,有两种情况:这题对比46题,主要是要改一下在遇到相同数字时,需要怎么的操作,我们只需要保证遇到相同数时,不重复搜索就行。下面的代码主要是这一行起作用:执行结果:时间复杂度: O(n * n !)...原创 2022-08-16 15:12:10 · 396 阅读 · 0 评论 -
leetcode 46. 全排列(经典)
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。示例1:示例2:示例 3:此题方法是用dfs该题就是一颗深度优先遍历的一颗树,我们的将它递归树枚举的状态画出来就是下面的样子那么我们应该想需要什么状态, 实际上这里就是函数的参数分析得: 需要知道填什么数字(vector 数组)、需要记录填到哪一位(int u 下标)、需要知道哪位数组已经填过了(标记数组bool st)算法步骤:下面实现跟上面差不多,数组形式改了执行结果:O(n * n !)搜原创 2022-08-16 11:34:40 · 417 阅读 · 0 评论 -
leetcode 45. 跳跃游戏 II(dp + 贪心)
给你一个非负整数数组 nums ,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。假设你总是可以到达数组的最后一个位置。示例1:示例2:此题方法是用dp + 贪心执行结果:数组的每个元素最多被遍历两次,故时间复杂度为 O(n)。...原创 2022-08-16 10:51:04 · 350 阅读 · 0 评论 -
leetcode 44. 通配符匹配(困难,dp)
给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。两个字符串完全匹配才算匹配成功。说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。示例1:示例2:示例 3:此题方法是用dp和leetcode 第10题 相似【注】: 第10题转移方程为: 本题转移方程为: 所以在代码实现的时候后面是没有&& 条件的执行结果:状态数为 O(nm),每次转移仅需常数时间,故总时间复杂度为 O原创 2022-08-15 11:51:47 · 270 阅读 · 7 评论 -
leetcode 10. 正则表达式匹配(dp)
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。示例1:示例2:示例3:此题方法是用dp执行结果:状态数为 O(nm),每次转移仅需常数时间,故总时间复杂度为 O(nm)。...原创 2022-08-15 10:25:33 · 207 阅读 · 0 评论 -
leetcode 43. 字符串相乘(高精度相乘)
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。示例1:示例2:模拟题直接模拟竖式计算, 乘积的最大长度为两个乘数的长度之和执行结果:设两个数字的位数分别是 n 和m,竖式乘法为两层循环错位相乘,故时间按复杂度是 O(nm)。...原创 2022-08-14 22:29:20 · 263 阅读 · 2 评论 -
leetcode 42. 接雨水(困难、单调栈的应用)
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例1:示例2:方法一:用单调栈思想算法步骤:方法二: 动态规划空间换时间 用两个额外数组left和right分别存储柱子i左边最大值和右边最大值三次遍历求得总雨水面积计算公式 执行结果:时间复杂度为O(n), 空间复杂度为O(n)...原创 2022-08-14 15:26:32 · 678 阅读 · 3 评论 -
leetcode 49. 字母异位词分组
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。示例1:示例2:示例 3:此题方法使用字符串哈希算法步骤:执行结果:时间复杂度:O(nklog k),其中 n 是 strs 中的字符串的数量,k 是 strs 中的字符串的的最大长度。需要遍历 n 个字符串,对于每个字符串,需要 O(klogk) 的时间进行排序以及 O(1)的时间更新哈希表,因此总时间复杂度是 O(nklogk)原创 2022-08-13 22:30:34 · 668 阅读 · 2 评论 -
leetcode 41. 缺失的第一个正数(困难,数组元素位置原地交换)
给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。示例1:示例2:示例 3:方法一:此题不考虑使用额外空间的话,可以直接用哈希表做法执行结果:哈希表使用,空间复杂度为O(n);时间复杂度:线性时间复杂度,O(n).........原创 2022-08-12 22:36:06 · 770 阅读 · 3 评论 -
leetcode 48. 旋转图像(对矩阵的对角、左右旋转)
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。示例1:示例2:此题是找到规律后比较好做分析得出可以先对角线翻转,然后左右翻转即可得到满足题意的方案执行结果:时间复杂度:O(N2),其中 N 是 matrix 的边长。......原创 2022-08-11 21:42:48 · 755 阅读 · 0 评论 -
leetcode 9. 回文数
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。示例1:示例2:示例 3:三种方法直接转化字符串进行比较用的库函数,在面试中可能不推荐,库函数的原理也是一个一个字符进行逆序转化逆序数字在进行比较(推荐)比较数字的一般字符上一种方法的优化,不过时间复杂度没有优化执行结果:其中数字遍历一次, 时间复杂度为O(n)...原创 2022-08-10 21:24:27 · 719 阅读 · 1 评论 -
leetcode 39. 组合总和(完全背包问题)
给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。对于给定的输入,保证和为 target 的不同组合数少于 150 个。示例1:示例2:示例 3:此题方法是用暴搜算法步骤:执行结果:暴搜,时间复杂度质数级别.原创 2022-08-09 16:22:05 · 790 阅读 · 1 评论 -
leetcode 38. 外观数列
给定一个正整数 n ,输出外观数列的第 n 项。「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。你可以将其视作是由递归公式定义的数字字符串序列:countAndSay(1) = “1”countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串。前五项如下:第一项是数字 1描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 “11”描述前一项,这个数是 11 即 “ 二 个 1 ” ,记原创 2022-08-09 16:15:07 · 645 阅读 · 0 评论 -
leetcode 37. 解数独 (困难)
编写一个程序,通过填充空格来解决数独问题。数独的解法需 遵循如下规则:数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)数独部分空格内已填入了数字,空白格用 ‘.’ 表示。示例1:直接暴搜, 按照题目给出的条件进行搜索执行结果:略......原创 2022-08-09 07:45:00 · 759 阅读 · 0 评论 -
leetcode 36. 有效的数独(模拟题)
请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)注意:一个有效的数独(部分已被填充)不一定是可解的。只需要根据以上规则,验证已经填入的数字是否有效即可。空白格用 ‘.’ 表示。示例1:示例2:此题方法是模拟题直接模拟就行了执行结果:略......原创 2022-08-09 07:00:00 · 698 阅读 · 0 评论 -
leetcode 35. 搜索插入位置(二分法+找性质也很关键)
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。示例1:示例2:示例 3:此题方法是用二分此题为简单的二分, 直接按照前面两题的思想做就行了如果按照普通二分,那需要在边界情况加以判断其实在这里是可以直接将l, r 的边界在开始设置时就扩大一点,在后面就不需要考虑当目标值比数组里的值都大得情况了注意:这个利用模板不能通过得情况下,说明对于这题性质可能找错了,下面有利用不同性质进行对原创 2022-08-09 06:45:00 · 681 阅读 · 0 评论 -
leetcode 34. 在排序数组中查找元素的第一个和最后一个位置(二分经典题)
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。示例1:示例2:示例 3:此题方法是用二分算法步骤:执行结果:其中利用二分法, 时间复杂度为O(logn)...原创 2022-08-09 06:15:00 · 670 阅读 · 0 评论 -
leetcode 33. 搜索旋转排序数组 (二分经典题)
整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k(0原创 2022-08-09 01:45:56 · 366 阅读 · 0 评论 -
leetcode 32. 最长有效括号 (困难)
给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。示例1:示例2:示例 3:此题方法之一是用栈我们通过标记合法的括号,可以得出,每一段合法的括号在字符串出现的位置一定是连续且不相交的做括号匹配的这题可以用栈存储相应的信息,算法过程为:如果栈为空,说明以当前右括号为右端点的合法括号序列的左端点为start,则更新答案 i - start + 1如果栈不为空,说明以当前右括号为右端点的合法括号序列的左端点为栈顶元素的下一个元素,则更新答案i - st.top()原创 2022-08-09 01:10:45 · 531 阅读 · 0 评论 -
leetcode 31. 下一个排列(实现next_permutation 函数)
整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。例如,arr =原创 2022-08-08 11:22:57 · 594 阅读 · 1 评论 -
leetcode 30. 串联所有单词的子串
给定一个字符串 s 和一些 长度相同 的单词 words 。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。注意子串要与 words 中的单词完全匹配,中间不能有其他字符 ,但不需要考虑 words 中单词串联的顺序。示例1:示例2:示例 3:此题有一定难度前提是需要将字符串s 拆分成几个小段,每一段长度为w, 其中1、先用map哈希表将word中的单词存起来,每个单词有多少个2、find哈希表表示当从i开始长度是n * len的滑动窗口中将该窗口的字符串以长度是len进行分割原创 2022-08-07 22:30:16 · 670 阅读 · 3 评论 -
leetcode 28. 实现 strStr() (KMP算法实现)
实现 strStr() 函数。给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。说明:当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。示例1:示例2:朴素做法:直接按照一个一个字符进行对比原创 2022-08-07 00:17:28 · 195 阅读 · 0 评论 -
leetcode 27. 移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。你可以想象内部操作如下:示例1:示例2:此题和上一题类似,用双指针直接将符合条件的值保存在数组中即可执行结果原创 2022-08-06 23:59:19 · 183 阅读 · 0 评论 -
leetcode 26. 删除有序数组中的重复项(实现unique函数)
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。将最终结果插入 nums 的前 k 个位置后返回 k 。不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。判题标准:系统会用下面的原创 2022-08-06 23:53:32 · 254 阅读 · 0 评论 -
leetcode 25. K 个一组翻转链表
给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。示例1:示例2:提示:链表中的节点数目为 n1 ...原创 2022-08-06 22:19:36 · 218 阅读 · 2 评论 -
leetcode 24. 两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例1:示例2:示例 3:此题一定要动笔画一画指针的指向算法步骤:执行结果:其中遍历一次, 时间复杂度为O(n)......原创 2022-08-06 19:47:51 · 194 阅读 · 2 评论