•LeetCode
LeetCode刷题记录
爱吃骨头的猫、
嘘!
展开
-
LeetCode--96. 不同的二叉搜索树(动态规划)
不同的二叉搜索树(动态规划)1. 题目描述2. 题目分析3. C语言实现4. Python实现1. 题目描述难度:中等2. 题目分析首先我们要知道二叉搜索树的特点:左子树肯定小于其根节点右子树肯定大于其根节点第一个根节点的值总是大于左边的所有的节点的值第一个根节点的值总是小于于右边的所有的节点的值现在我们来看看怎么用动态规划来解决这个问题:动态规划动态规划的解决思路是...原创 2020-04-08 00:26:43 · 3512 阅读 · 3 评论 -
LeetCode--144,94,145,102 二叉树的前序、中序、后序、层序遍历(递归,迭代,栈,队列)
二叉树的前序、中序、后序、层序遍历(递归,迭代,栈,队列)1. 二叉树的前序遍历1.1 题目描述1.2 题目分析1.3 Python实现2. 二叉树的中序遍历2.1 题目描述2.2 题目分析2.3 Python实现3. 二叉树的后序遍历2.1 题目描述2.2 题目分析2.3 Python实现4. 二叉树的层序遍历2.1 题目描述2.2 题目分析2.3 Python实现1. 二叉树的前序遍历1....原创 2020-04-12 19:36:00 · 3180 阅读 · 0 评论 -
LeetCode--95. 不同的二叉树搜索Ⅱ(动态规划)
不同的二叉树搜索Ⅱ(动态规划)1. 题目描述2. 题目分析3. Python实现1. 题目描述难度:中等2. 题目分析这道题目是LeetCode96题.不同的二叉树搜索的进阶版,动态规划的思路还是不变的,但是难度提升就在于96题要求我们只需要输出组合的数目,而95题需要我们将所有的树的组合输出。动态规划根据96题,我们得到的动态转移方程为: dp[i] = dp[i] + dp...原创 2020-04-10 00:18:02 · 3075 阅读 · 0 评论 -
LeetCode--3. 无重复字符的最长子串(双指针)
无重复字符的最长子串(C)1. 题目描述2. 题目分析3. C语言实现1. 题目描述难度:中等2. 题目分析这道题目是一道中等难度的题目,我们需要知道的有一点:字符串中有包括空字符的所有字符,不止英文字母这一点很重要,因为在刚接触这道题的时候,很容易当成字符串中只有英文字符,这在使用ASCII码的时候会有麻烦。这道题当然可以使用暴力穷举法,求出所有可能的字符串,并选出合适的字符...原创 2020-03-09 19:20:13 · 3091 阅读 · 0 评论 -
LeetCode--151. 翻转字符串里的单词(字符串翻转,字符串分割)
翻转字符串里的单词(双指针,字符串分割)1. 题目描述2. 题目分析3. C语言实现4. Python实现1. 题目描述难度:中等2. 题目分析这道题我们需要注意的点有以下几个:每个单词之间都要有一个并且仅有一个空格翻转之后的字符串首尾两端要去电空格使用O(1)的空间只使用O(1)的额外空间的话,只能在原数组上进行转换:字符串翻转法(C)利用双指针对对字符串进行整体翻...原创 2020-03-18 18:20:13 · 3163 阅读 · 0 评论 -
LeetCode--32. 最长有效括号(栈)
最长有效括号(栈)1. 题目描述2. 题目分析3. C语言实现1. 题目描述难度:困难2. 题目分析这道题与LeetCode–20. 有效的括号类似,LeetCode20要求的是找出字符串是否是有效的括号,我们利用的是模拟一个栈的方法以及删除法。这道题是来求最长有效括号,删除法就行不通了,但是我们仍然可以使用栈的方法来解决。- 栈(C)模拟一个栈的结构, 将字符挨个压入栈中,如果字符...原创 2020-03-14 13:42:35 · 3222 阅读 · 1 评论 -
LeetCode--20. 有效的括号(栈,删除法)
有效的括号(C, Python)1. 题目描述2. 题目分析3. C语言实现4. Python语言实现1. 题目描述难度:简单2. 题目分析这道题咋一看挺简单的,但是请注意观察这两个示例:示例2, 示例4刚开始的时候我想利用双指针法来对字符串进行判断,一个首指针,一个尾指针,如果字符串首尾相同,那么就输出true。但是示例2不符合该想法。然后想着统计正括号和反括号的数量是否一致...原创 2020-03-12 19:49:11 · 3235 阅读 · 0 评论 -
LeetCode--5.最长回文子串(滑动窗口)
最长回文子串(C)1. 题目描述2. 题目分析3. C语言实现1. 题目描述难度:中等2. 题目分析根据题目,需要注意的有以下几点:回文子串回文子串就是正着读和反着读是一样的,比如abcba,就是回文子串。有效答案不止一个如题中所示的,答案可能有多个,但是输出其中一个就好。本题的解法是滑动窗口法:滑动窗口法滑动窗口法就是从大到小遍历各种大小的窗口,然后判断窗口中的字符...原创 2020-03-11 00:21:00 · 3702 阅读 · 0 评论 -
LeetCode--49. 字母异位词分组(哈希表)
49. 字母异位词分组(哈希表)1. 题目描述2. 题目分析3. Python实现1. 题目描述难度:中等2. 题目分析这道题的目的就是找出由相同字母组成的字符的集合。非常直观的方法就是利用哈希表进行筛选:- 哈希表(Python)本题由python中的字典实现。依次遍历字符串,将该字符串进行排序。以排序后的字符为键值,根据排序的结果依次放入字典的值中,最后输出字典的值即可。时间复杂...原创 2020-03-15 17:28:02 · 3113 阅读 · 0 评论 -
LeetCode--139. 单词拆分(动态规划)
单词拆分(动态规划)1. 题目描述2. 题目分析3. C语言实现4. Python实现1. 题目描述难度:中等2. 题目分析这道题的难点在于示例3,字符串包含字典中的所有单词,但是就是无法由字典中的单词组成,要么就是多个字符,要么就是少个字符,所以在使用动态规划方法的时候要考虑这种情况的发生。- 动态规划我们先考虑这样一个子问题:前i个子串是否能够被字典中的单词组成,如果可以的话,我...原创 2020-03-30 17:10:18 · 3241 阅读 · 0 评论 -
LeetCode--91. 解码方法(动态规划)
解码方法(动态规划)1. 题目描述2. 题目分析3. C语言实现1. 题目描述难度:中等2. 题目分析分析这道题,我们要知道以下几点:‘0’的作用‘0’出现在字符串开头时,肯定是无法编码的,直接返回0;如果字符串中出现‘0’字符并且‘0’字符无法和前面的字符匹配,比如‘30’,‘00’等,肯定也是无法编码的,直接返回0;‘01’不能匹配成1;特殊的边界条件如果输入为...原创 2020-03-27 14:17:27 · 3159 阅读 · 0 评论 -
LeetCode--85.最大矩形(单调栈)
最大矩形(单调栈)1. 题目描述2. 题目分析3. C语言实现1. 题目描述难度:困难2. 题目分析这道题目似曾相识啊,最大矩形面积的问题我们在LeetCode84.柱状图中最大的矩形也遇到过类似的问题,在84题中,我们应用了单调栈的方法,实现了O(n)的时间复杂度。在这一题中,我们可以将每一层都看做一个输入,比如第一层可以看做84题中的输入[1, 0, 1, 0, 0],这一层的最大矩...原创 2020-03-26 13:06:04 · 4025 阅读 · 0 评论 -
LeetCode--62.不同路径(排列组合,动态规划)
不同路径(排列组合,动态规划)1. 题目描述2. 题目分析3. C语言实现3.1 动态规划3.2 排列组合1. 题目描述难度:中等2. 题目分析这是一道典型的动态规划问题,这道题有两种解法,一种是动态规划,一种是排列组合:- 动态规划假设我们要对m=7, n =4的网格进行计算(如下图所示):那么所有可能的路径分为两种,一种是从上方过来的,一种是从左边过来的,就如两个箭头标的方向一...原创 2020-03-19 19:36:07 · 4865 阅读 · 0 评论 -
LeetCode--256. 粉刷房子(动态规划)
粉刷房子(动态规划)1. 题目描述2. 题目分析3. C语言实现1. 题目描述难度:简单2. 题目分析这道题目是一道典型的动态规划问题,如果我们只把目光放在一个最少花费的身上,状态转化方程并不容易想出来,但是如果我们着眼于每一个颜色的最少花费,那么状态转化方程可以很容易地写成:初始态 red[0] = costs[0][0] blue[0] = costs[0][0] gre...原创 2020-04-02 22:59:01 · 3704 阅读 · 0 评论 -
LeetCode--70. 爬楼梯(动态规划)
爬楼梯(动态规划)1. 题目描述2. 题目分析3. C语言实现1. 题目描述难度:简单2. 题目分析爬楼梯这道题是一个很典型的问题了,这是一道经典的动态规划的问题:动态规划不难发现,这个问题可以被分解为一些包含最优子结构的子问题,即它的最优解可以从其子问题的最优解来有效地构建,我们可以使用动态规划来解决这一问题。时间复杂度O(n), 空间复杂度O(n)。3. C语言实现代...原创 2020-03-18 23:00:01 · 3247 阅读 · 0 评论 -
LeetCode--64. 最小路径和(动态规划)
最小路径和(动态规划)1. 题目描述2. 题目分析3. C语言实现1. 题目描述难度:中等2. 题目分析这道题目是62题.不同路径的延伸,解题思路基本一样的,是通过动态规划来实现的:- 动态规划我们需要知道的有这么几点:m=1或者n=1的情况下,路径只有一条,所以最短路径只有一个,就是路径上所有元素的和在mxn的网格下,其最短路径等于(m-1)x n网格的最短路径与 m x (...原创 2020-03-20 23:07:35 · 3186 阅读 · 0 评论 -
LeetCode--174.地下城游戏(动态规划)
地下城游戏(动态规划)1. 题目描述2. 题目分析3. C语言实现1. 题目描述难度:困难2. 题目分析这道题是64.最小路径和的进阶版。但是这一题我们不能从左上向右下的顺序,而是**要从最后一步开始,从右下到左上的顺序。**我们知道骑士最少的健康点数为1,所以最后一步的点数为1,然后根据每个网格中的数据依次计算,到某个网格时的所剩余的最低健康点数。动态方程为:对于M x N的网格:...原创 2020-04-01 19:01:07 · 3149 阅读 · 0 评论 -
LeetCode--265. 粉刷房子Ⅱ(动态规划)
粉刷房子Ⅱ(动态规划)1. 题目描述2. 题目分析3. C语言实现1. 题目描述难度:困难2. 题目分析这道题目是256. 粉刷房子的进阶题,其实解题思路和256题是一样的:动态规划256题颜色是3种,但是本题的颜色变为了k种,但是整体的思路还是一样的,我们申请一个二维数组dp[n][k]来存放每个房子的每个颜色的最低花费,时间复杂度为O(nk)。3. C语言实现代码如下:...原创 2020-04-03 16:05:46 · 3907 阅读 · 0 评论 -
LeetCode--41.缺失的第一个正数(C)
缺失的第一个正数(C)1. 题目描述2. 题目分析3. C语言实现3.1 申请额外空间实现3.2 原数组实现1. 题目描述难度:困难2. 题目分析这道题本质上是很简单的,但是加上了这个条件就会变得的很难实现:算法的时间复杂度为O(n), 只能使用常数级别的空间。这句话就说明了我们不能暴力穷举法(O(n^2)),以及对输入数组进行快速排序(nlogn)。具体的实现方法可以是这样的:...原创 2020-03-02 22:49:49 · 3033 阅读 · 0 评论 -
LeetCode--35. 搜索插入位置(遍历,二分法)
搜索插入位置(C)1. 题目描述2. 题目分析3. C语言实现3.1 遍历法3.2 二分法1. 题目描述难度:简单2. 题目分析这道题目比较简单,比较容易想到的就是遍历法,其实更快的方法是二分法:遍历法依次遍历数组中的元素,判断是否存在目标值,如果存在返回索引,否则返回大于目标值的第一个元素的索引。时间复杂度为O(n)。二分法利用二分法来搜索数组会缩短访问时间。时间复杂度为O(...原创 2020-03-08 15:09:43 · 2977 阅读 · 0 评论 -
LeetCode--84.柱状图中最大的矩形(暴力法,单调栈)
柱状图中最大的矩形(暴力法,单调栈)1. 题目描述2. 题目分析3. C语言实现3.1 暴力法3.2 单调栈4. Java实现1. 题目描述难度:困难2. 题目分析这道题有两种解法,一种是暴力遍历法,一种是利用栈来进行的单调栈的方法。- 暴力法暴力法师很容易想到的方法,从左到右依次遍历数组,依次计算每个元素所构成的最大矩形面积。时间复杂度为O(n^2)。- 单调栈这是一个非常典...原创 2020-03-25 18:45:52 · 3600 阅读 · 0 评论 -
LeetCode--27. 移除元素(双指针)
移除元素(C, Python)1. 题目描述2. 题目分析3. C语言实现3.1 双指针排序法3.2 双指针乱序法4. Python实现1. 题目描述难度:简单2. 题目分析该题和26题很类似,解法也一样,需要注意的是一下几点:给定的输入数组是已经未排序的需要在原地删除重复的元素,也就是说我们不可以在重新定义数组来存放结果,需要对原数组进行修改返回的是修改之后数组的长度,而不是数...原创 2020-03-02 13:51:24 · 3035 阅读 · 0 评论 -
LeetCode--80. 删除排序数组中的重复项Ⅱ(双指针,暴力)
删除排序数组中的重复项Ⅱ(C,Python)1. 题目描述2. 题目分析3. C语言实现4. Python实现1. 题目描述难度:中等2. 题目分析这道题是LeetCode–26. 删除排序数组中的重复项的进阶版,不过处理思路是一样的。根据题目,需要注意一下四点:给定的输入数组是已经排好序的需要在原地删除重复的元素,也就是说我们不可以在重新定义数组来存放结果,需要对原数组进行修改...原创 2020-03-04 14:36:41 · 3024 阅读 · 0 评论 -
LeetCode--26. 删除排序数组中的重复项(双指针,暴力)
删除排序数组中的重复项(C, Python)1. 题目描述2. 题目分析3. C语言实现3.1 暴力求解法3.2 双指针法4. Python语言实现1. 题目描述难度:简单2. 题目分析根据题目,需要注意一下四点:给定的输入数组是已经排好序的需要在原地删除重复的元素,也就是说我们不可以在重新定义数组来存放结果,需要对原数组进行修改返回的是修改之后数组的长度,而不是数组本身不需要...原创 2020-03-01 23:49:09 · 3184 阅读 · 0 评论 -
LeetCode--11.盛最多的水(双指针,暴力)
盛最多的水(C)1. 题目描述2. 题目分析3. C语言实现3.1 暴力穷举法3.2 双指针法1. 题目描述难度:中等2. 题目分析该题目数字化之后可以这么理解:给定数据[(a1,1), (a2,2), (a3,3)…(an, n)], 求解 min(ax, ay)*abs(x-y)的最大值。该题目有两种解法:暴力穷举法该方法是最容易想到的,依次穷举所有情况,然后输出最大值即可,...原创 2020-03-02 15:08:47 · 2998 阅读 · 0 评论 -
LeetCode--33. 搜索旋转排序数组(二分法)
搜索旋转排序数组(C)1. 题目描述2. 题目分析3. C语言实现1. 题目描述难度:中等2. 题目分析这道题我们需要关注的点有一下几个:数组整体是升序的,并且数组中不存在重复的元素数组在某一点进行了旋转返回值是相同元素的下标,没有则返回-1算法时间复杂度必须是O(logn)从上面几点分析,要想时间复杂度达到O(logn),要使用二分法进行搜索。但是怎么处理旋转之后的数组呢...原创 2020-03-06 15:59:21 · 3021 阅读 · 0 评论 -
LeetCode--45. 跳跃游戏Ⅱ(贪心)
跳跃游戏Ⅱ(C)1. 题目描述2. 题目分析3. C语言实现3.1 最大跨越点算法3.2 贪心算法1. 题目描述难度:困难2. 题目分析该题目是LeetCode55.跳跃算法的进阶版,有以下几点需要注意:假设总可以到达数组的最后一个位置要使用最少的跳跃次数有两种实现方式:最大跨越点算法找到能够到达最后一个元素的并且下标最小的点,也就是能达到最后一个元素的跨越程度的最大点。...原创 2020-10-17 13:33:22 · 3162 阅读 · 0 评论 -
LeetCode--53. 最大子序和(贪心)
最大子序和(C)1. 题目描述2. 题目分析3. C语言实现1. 题目描述难度:中等2. 题目分析这道题目的解法是贪心算法,遍历数组,比较最大子序和与当前元素的和大小,并更新最大子序值。3. C语言实现代码如下:int maxSubArray(int* nums, int numsSize){ int* dp = (int *)malloc(sizeof(int)*nums...原创 2020-03-08 15:26:38 · 3025 阅读 · 0 评论 -
LeetCode--75.颜色分类(三路快排,计数排序)
颜色分类(C)1. 题目描述2. 题目解析3. C语言实现3.1 三路快排法3.2 计数排序法1. 题目描述难度:中等2. 题目解析这道题需要注意一下几点:原地进行排序,不可以另外申请数组空间。数组元素最多只有三个元素0, 1, 2,但是要考虑空数组和单个元素的例子有两种方法:计数排序法遍历出0,1,2元素的个数,然后按照这个个数重新写入数组,时间复杂度为O(n).三路...原创 2020-03-08 00:05:18 · 3077 阅读 · 0 评论 -
LeetCode--34.在排序数组中查找元素第一个和最后一个位置(二分法)
在排序数组中查找元素第一个和最后一个位置(C++)1. 题目描述2. 题目分析3. C++语言实现1. 题目描述难度:中等2. 题目分析看到题目我们需要知道以下几点:数组是有序的数组中存在重复的元素算法时间复杂度必须是O(logn)级别目标元素可能不存在与数组中根据题目要求,算法复杂度必须是O(logn)级别,那么二分法就是最佳的算法。根据本题,我们要寻找的是目标元素在数组...原创 2020-03-08 14:54:28 · 3016 阅读 · 0 评论 -
LeetCode--88.合并两个有序数组(插入法,排序法)
合并两个有序数组(C, Python)1. 题目描述2. 题目分析3. C语言实现4. Python语言实现1. 题目描述难度:简单2. 题目分析这道题比较简单,实现方法有两种:插入法©依次将nums2中的数与nums1中的数按照大小放入nums1的末尾,这样的做法不用再次申请空间。时间复杂度为O(n)。排序法(Python)先将nums2的元素放入nums1的尾部,然后进行排...原创 2020-03-07 23:43:10 · 3174 阅读 · 0 评论 -
LeetCode--81. 搜索旋转排序数组Ⅱ(遍历法,二分法)
搜索旋转排序数组Ⅱ(C, Python)1. 题目描述2. 题目分析3. C语言实现3.1 遍历法3.2 二分法4. Python语言实现1. 题目描述难度:中等2. 题目分析这道题目是LeetCode–33. 搜索旋转排序数组的延伸题,有三点不一样:有重复的元素数组中的元素虽然是升序的,但是里面含有重复的元素,这相对于33题难度提升了输出的变量为布尔型变量只要求判断数组中是否...原创 2020-03-06 20:51:43 · 3019 阅读 · 0 评论 -
LeetCode--55.跳跃游戏(贪心,零点跳跃)
跳跃游戏(C)1. 题目描述2. 题目分析3. C语言实现3.1 零点跳跃法3.2 贪心算法1. 题目描述难度:中等2. 题目分析这道题很有意思,我们需要知道的有这么几点:如果输入的数组每一位都是大于0的数,那么肯定能跳到最后的位置(比如每个位置就向前跳1)如果数组中出现0,那么除非该元素之前有能跳过这个零点的元素,否则无论如何也到不了最后一个所以实现的方法有两种:零点跳跃...原创 2020-10-17 13:33:34 · 3146 阅读 · 0 评论 -
167. Two Sum II - Input array is sorted (C, C++, Python)
本文讲述了Array类中第167个问题的几种解法,实现语言包括C,Python以及C++。问题:Given an array of integers that is alreadysorted in ascending order, find two numbers such that they add up to a specific target number.The funct...原创 2019-03-25 16:04:04 · 3309 阅读 · 0 评论 -
66. 加一(C, Python)
加一--C, Python实现1. 问题描述与分析2. C语言实现3. Python语言实现1. 问题描述与分析本文讲述了Math类中第66个问题的几种解法,实现语言包括C,Python问题描述:问题分析:咋一看,这不就是数组末尾元素加一嘛,仔细分析其实不然,需要考虑的点就是当末尾出现元素“9”的时候的进位问题,‘19’的时候怎么处理,‘199’的时候怎么处理,‘999’的时候怎么处理...原创 2020-02-08 19:43:50 · 3063 阅读 · 0 评论 -
. Two Sum(C, C++, Python)
本文讲述了Array类中第1个问题的几种解法,实现语言包括C,Python以及C++。问题:Given an array of integers, returnindicesof the two numbers such that they add up to a specific target.You may assume that each input would hav...原创 2019-03-25 15:02:08 · 3290 阅读 · 0 评论 -
7. 整数反转(C, C++, Python)
整数反转(C, C++, Python)1. C语言实现2. C++语言实现3. python语言实现本文讲述了Math类中第7个问题的几种解法,实现语言包括C,Python以及C++。问题描述:1. C语言实现2. C++语言实现3. python语言实现...原创 2020-02-07 21:07:33 · 3354 阅读 · 0 评论 -
15. 3 Sum (C,Python)
本文讲述了Array类中第15个问题的几种解法,实现语言包括C,Python, 难度为medium。问题:Given an arraynumsofnintegers, are there elementsa,b,cinnumssuch thata+b+c= 0? Find all unique triplets in the array which give...原创 2019-04-15 15:31:44 · 3225 阅读 · 0 评论 -
50. Pow(x, n)(递归,穷举)
Pow(x,n)C实现1. 题目描述2. 解题分析3. C语言实现3.1 递归法求解3.2 简洁实现1. 题目描述难度:中等2. 解题分析暴力求解法既然难度是中等,那么直接暴力求解应该是不行的。我试验了一下,利用n个循环的x叠加相乘的暴力求解法的结果是运算超时,因为x是浮点型变量,而n最大可以为2147483647,所以暴力求解是很耗时的,时间复杂度为n。递归法暴力不行,就用递归...原创 2020-02-28 22:27:50 · 3193 阅读 · 0 评论 -
67. 二进制求和(转换法)
二进制求和(C, Python实现)1. 题目描述2. 题目分析3. C语言实现4. Python实现1. 题目描述难度:简单2. 题目分析转换法(Python)转换法是最容易想到的方法, 想将二个字符串转化为整型,然后将二者相加,在转化为字符串输出结果。这种方法对于Python来讲是比较容易实现的,所以推荐用Python来实现,但是对于C来讲是很麻烦的,其中涉及到了字符转二进制,二...原创 2020-02-28 22:49:32 · 3153 阅读 · 0 评论