![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LeetCode
深圳湾刘能
耐得住寂寞,持续耕耘。
展开
-
LeetCode 231.幂的问题
在LeetCode中有几道很类似的幂问题,我们可以首先来看看2的幂的问题:这其实是一道很简单的题目,我们可以从两个角度来解决这个问题,首先这种解法是位运算,我们可以发现2的幂次方转换成二进制第一位都是1,后面都是0,比如说2的二进制是10,4的二进制是100,8的二进制是1000,所以说如果n是2的幂次方,那么n-1转换成二进制第一位一定是0,所以将n和n-1进行位的与运算如果是0的话就可以判...原创 2018-11-13 10:49:58 · 176 阅读 · 0 评论 -
LeetCode 322.零钱兑换
这道零钱兑换的题目很有意思,给定总金额和不同面额的硬币,需要找到硬币凑成金额的最少硬币数,题目如下所示:如何来解决这个问题呢?首先拿到这个题目,很多人会想到的是贪心算法,首先选取面值最大的硬币,然后依次选取面值较小的硬币,这种解法看似可行,其实还是有不可行的地方,我们举个例子:coins=[1,6,7];amount=30coins=[1,6,7];amount=30coins=[1,6,7]...原创 2019-04-29 14:26:02 · 187 阅读 · 0 评论 -
LeetCode 98.验证二叉搜索树
这道题目是二叉搜索树种很经典的一道,题目说明很简单,就是验证一棵二叉树是否是二叉搜索树,题目如下:解决这样的题目就需要从二叉搜索树的特性入手,那么二叉搜索树最重要的一个特性就是:二叉树中所有节点的左子树中的节点的值都小于该节点的值,所有节点的右子树中的节点的值都大于该节点的值。 根据这个特性,这个题目最有效的解法就是,将这个二叉树进行中序遍历,那么每个子树遍历的顺序都是:左→根→右,因为在二叉...原创 2019-06-25 14:16:59 · 173 阅读 · 0 评论 -
LeetCode 69.x 的平方根
这道题目其实就是求一个数 x 的平方根,不能使用调库实现,并且是取整数部分,题目如下:这道题目其实很简单,主要的思想其实就是二分查找,如何进行二分查找呢,首先我们来看看二分查找的代码模板:left, right = 0, len(array) - 1while left <= right: mid = (left + right) / 2 if array[mid] == tar...原创 2019-06-26 10:38:31 · 169 阅读 · 0 评论 -
LeetCode 226.翻转二叉树
这道题目是一道很经典的关于二叉树的算法题,题目如下:题目的描述非常简单,就是翻转一棵给定的二叉树,然而有趣的是这个备注,这个故事是 mac 系统的包管理工具 Homebrew 的开发者 Max Howell 去谷歌面试的时候没有做出这道面试题而遭淘汰了,所以这道题目也是引发血案的一道二叉树题目。其实这道题目比较标准的解法是用到递归的思想,运用递归调用来对左右子树的二叉树进行翻转交换操作,代码...原创 2019-08-08 14:44:58 · 146 阅读 · 0 评论 -
LeetCode 112.路径总和
这同样是一道递归和二叉树的题目,就是给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。返回一个布尔类型,题目描述如下:这道题目看似没有头绪,拿到题目很多朋友就会想是不是要深度优先遍历一遍二叉树,然后分别求和,找出结果。其实,我们可以运用一下逆向思维,入上图中的例子,sum = 22,那么我们除去根节点 5 ,在 5 的左右子树中找到和为 ...原创 2019-08-08 17:00:21 · 146 阅读 · 0 评论 -
LeetCode 108. 将有序数组转换为二叉搜索树
这道题目目的是将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。所谓的平衡二叉树,是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。如图所示:拿到题目似乎无从下手,要建立一个平衡二叉搜索树,我们可以联想到快速排序的算法思想。因为数组是有序的,首先我们可以找到一个中位数,然后分别从左右子树进行递归建立二叉树。代码如下所示:# Definition for a binar...原创 2019-08-09 14:39:38 · 177 阅读 · 0 评论 -
LeetCode 455. 分发饼干
这是一道很有意思的题目,给小朋友分饼干,要让尽可能多的小朋友满意,问如何分配饼干,题目如下所示:这里每个小朋友的胃口值都是不一样的,有的小朋友容易满足,有的小朋友比较难满足,甚至还可能满足不了。我们如何让尽可能多的小朋友满意呢,这里我们可以尝试用贪心算法来解决分配的问题,所谓贪心算法就是我们尽可能在当前获取最大的利益,也就是说我们只考虑当下,不考虑将来。以g=[8,7,6,4]g=[8,7,6...原创 2019-08-14 15:24:04 · 137 阅读 · 0 评论 -
LeetCode 279. 完全平方数
这道题目是要用若干个完全平方数组成一个整数 n,目的是要组成和的完全平方数的个数最少,题目如下:这道题目看似无从下手,因为没有办法通过暴力去求解,因为把一个数分解成数的和的形式,我们不知道可以分解成多少个数。所以我们可以考虑使用动态规划明首先我们定义一个长度为 n+1 的列表,然后我们可以定义一个动态规划的递推方程:dp[j]=min(dp[j],dp[j−i∗∗2]+1)dp[j] = m...原创 2019-08-10 11:10:13 · 169 阅读 · 0 评论 -
LeetCode 62. 不同路径
这是一道经典的二维动态规划题目,题目如下:这道题目用穷举的方法肯定是没有办法求解的,使用动态规划算法是最优秀的,我们可以想到每走到一格的路径数等于这个格子上面一格和左边一格的路径数之和,那么我们就可以定义动态规划的递推方程了:dp[i][j]=dp[i−1][j]+dp[i][j−1]dp[i][j] = dp[i-1][j] + dp[i][j-1]dp[i][j]=dp[i−1][j]+...原创 2019-08-10 12:29:08 · 202 阅读 · 0 评论 -
LeetCode 435. 无重叠区间
这道题目是在给定的集合中找到需要去掉的区间最小数量,使得剩余区间互相不重叠,题目如下:这道题目似乎无从下手,因为找重叠的区域确实是比较麻烦的。我们可以尝试用贪心算法来解答这个问题,我们假设有集合:intervals=[[1,2],[3,5],[2,3],[3,6],[7,8],[6,7]]intervals=[[1,2],[3,5],[2,3],[3,6],[7,8],[6,7]]interv...原创 2019-08-14 17:32:04 · 283 阅读 · 0 评论 -
LeetCode 309. 最佳买卖股票时机含冷冻期
这是股票买卖系列的一道题目,这道题目的难点主要是加上了一个卖出股票的一个冷冻期,题目如下所示:这里因为有了一个冷冻期,我们整体的解题难度就比较大了,也不好从正常的思路去解答。我们可以从动态规划的思想来解决问题。首先我们定义三个列表 sell、buy、cool,其中 sell[i]sell[i]sell[i] 表示截止到第 i 天,最后操作是卖的时候最大的收益;buy[i]buy[i]buy[i...原创 2019-08-10 19:06:52 · 157 阅读 · 0 评论 -
LeetCode 377. 组合总和 Ⅳ
这道题目是在数组中找到和为给定目标正整数的组合的个数,题目如下所示:这道题目就难在不限数组中元素使用的个数,我们如果用穷举的方法很难得到正确的答案。于是我们可以想到用动态规划的思想来解决这个问题。首先我们求的是和,我们就可以把和进行拆分,如题目中的例子为例,nums=[1,2,3]nums = [1,2,3]nums=[1,2,3];target=4target=4target=4,那么我们...原创 2019-08-12 14:52:39 · 175 阅读 · 0 评论 -
LeetCode 46. 全排列
这道题目是数学中的一个排列组合的问题,我们要用代码来罗列出所有可能的组合,题目如下:在数学中,这是一道非常简单的排列组合,很容易就解决了。但是我们代码中需要用到回溯的思想,什么是回溯的思想呢,我们可以把这个数字序列可能的组合进行树形分解,如下图所示:我们把这个树形结构分成3层。第一层是红色的表示序列[1,2,3][1,2,3][1,2,3]所有的组合;第二层黄色层有三个分支,可以看成是1+...原创 2019-08-23 14:59:16 · 148 阅读 · 0 评论 -
LeetCode 650. 只有两个键的键盘
这是一道很有趣的题目,我们要在只能进行全部复制和粘贴操作的情况下做最少的操作次数,题目如下所示:这道题目从表面上看,这道题目似乎没有思路,我们应该在什么时候复制什么时候进行粘贴,这些细节都是很难处理的。所以我们可以不考虑这些细节,直接用动态规划的思想来分析这道题目,那么这道题目的核心就是求解出动态规划的递推方程。首先我们想一下,在最普通的情况下,我们一个个地粘贴单字母‘A’,需要 i−1i-...原创 2019-08-26 10:13:46 · 226 阅读 · 0 评论 -
LeetCode 135. 分发糖果
这道题目是一道很有意思的题目,是老师给下朋友分糖的策略,题目如下:这道题目的难点就在于,相邻的孩子中,评分高的孩子必须获得更多的糖果。我们必须把所有的小朋友左右都进行遍历一遍,然后根据评分来分配糖果,我们可以用如下策略:首先我们给每个小朋友先发一颗糖,然后正向遍历一遍小朋友的评分,如果相邻的右边小朋友的评分比左边小朋友高,那么我们就给右边这个小朋友发一颗糖,然后将额外多发的糖的数量记录下来。...原创 2019-08-27 15:41:46 · 227 阅读 · 0 评论 -
LeetCode 53. 最大子序和
这是一道痕常见的题目,这里我们一起来学习如何使用动态规划的思想来查找一个序列中最大子序列和,题目如下:一般来说,我们首先会想到暴力求解的方法,双重循环遍历所有的子序列,然后求和取最大值,这样的方法显然比较低效。我们可以通过动态规划的思想来更新这个序列,如果加上这一位的数比之前一位的数要大,那么我们就进行更新,否则我们就不更新,就取自己本身的值,这里可以列出递推方程:nums[i]=max(n...原创 2019-08-27 22:33:04 · 190 阅读 · 0 评论 -
LeetCode 3. 无重复字符的最长子串
这道题目是很经典的一道字符串题目,是要我们找出字符串中不含重复字符的子字符串长度,题目如下所示:刚拿到这道题目的时候,似乎唯一的办法就是穷举法,双重遍历整个字符串,找到不含重复的字符的字符串并记录长度,然后取最长的一个,所以我们需要 O(N2)O(N^2)O(N2) 的时间复杂度。我们秉承着“万物皆可动态规划”的思想,用动态规划来解决这个问题,我们首先遍历整个字符串然后判断每个字符 s[i]s...原创 2019-08-28 11:16:07 · 146 阅读 · 0 评论 -
LeetCode 300.最长上升子序列
这道题目就是在一个数组中找到最长的上升子序列,且元素之间不必相邻,题目如下所示:除了暴力解法,我们最优的解法还是用动态规划DP的方法来解答这个问题,那么解答的流程是怎么样的呢?我们来看下面这个流程图:首先有一组 [10,9,2,5,3,7,101,18,21][10,9,2,5,3,7,101,18,21][10,9,2,5,3,7,101,18,21] 这样的一个数组,我们首先遍历这个数...原创 2019-04-29 11:37:31 · 329 阅读 · 0 评论 -
LeetCode 152.乘积最大子序列
这道题目是给定一个整数数组,返回乘积最大的连续子序列,题目如下所示:拿到题目我们肯定会想到的是暴力解法,通过两层循环遍历数组中所有的元素,记录每一次循环之后的全局乘积最小值,直到循环结束,我们就可以得到乘积最大的连续子序列,显然这样的解法时间复杂度达到了 O(n2)O(n^2)O(n2)。除了暴力的解法,我们可以想一下是否可以用动态规划DP的方法来解决此问题,那么如何DP呢?我们来看以下的这...原创 2019-04-27 10:59:43 · 258 阅读 · 0 评论 -
LeetCode 120.三角形最小路径和
这道题目是给定一个三角形的数组,找到自顶向下的的一条路径,使得路径上的元素之和最小,首先我们来看一下这道题的题目:首先我们拿到这个题目,我们会想到递归的方法,因为我们每次向下只能选择相邻的元素,那么我们递归的方程可以写成:triangle(i,j){ triangle(i, j + 1); triangle(i + 1, j + 1)}我们用这种递归的方法可以遍历所有的路径,我们可...原创 2019-04-26 17:24:39 · 298 阅读 · 0 评论 -
LeetCode 198 & 213 & 337.打家劫舍问题(动态规划算法的理解)
前几天在LeetCode的时候碰到几道打家劫舍问题,觉得挺有意思,在这里跟大家一起学习一下。首先我们来看第一题:相信有的朋友拿到这道题想法是和我一样的,那就是暴力解法,我用两层for循环来遍历每一个房间,后来发现这样其实太麻烦了,并且还无法考虑到一些特定的情况,所以提交了很多次都没有提交过。后来看到评论里有朋友提示使用动态规划,于是我试着用递归的方法去解决这样的问题,下面详见代码:class...原创 2018-11-12 15:46:50 · 2097 阅读 · 0 评论 -
LeetCode 169.求众数问题(摩尔投票法)
今天刷到了一个求众数的题目,讲道理刚拿到这个题目,首先有点懵逼,确实想不到好的办法去解决这个题目,后来看到评论有提示是摩尔投票法,我们来看看这个题目:题目看似很简单,但是很难找到思路,后来我学习了摩尔投票法,结合这道题目,发现众数的个数一定是要大于整个数组的1/2的,所以众数的数量只有一个,这也是摩尔投票法的核心思想,我们解题的思路就是,将众数和其他数进行相抵,到最后剩下的一定是众数,仅仅从众...原创 2018-11-14 11:42:34 · 1970 阅读 · 0 评论 -
LeetCode 236.二叉树的最近公共祖先问题
这个题目是给定一个二叉搜索树,找到该树种两个指定节点的最近公共祖先。如下所示:首先这个题目要从二叉搜索树入手,二叉搜索树有一个特点,就是它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不空,则左子树上所有节点均小于它根节点的值;若它的的右子树不空,则右子树上所有节点的值均大于它的根节点的值,并且它的左右子树也分别是二叉搜索树。在了解了二叉搜索树的定义之后,我们可以考虑用递归的方法,...原创 2019-01-04 10:01:21 · 468 阅读 · 0 评论 -
LeetCode 701.二叉搜索树中的插入操作
这道题目主要是做二叉搜索树的插值操作,说到二叉搜索树,最大的特点就是整个树中,每个节点的左子树的值都比自己的值要小,所有右子树中的值都比自己要大,所以二叉搜索树在查找方面有着独到的优势,这道题目是对二叉搜索树插入一个指定的值,然后返回插值之后的搜索二叉树:这道题大体的思路是:因为这是搜索二叉树,我们可以先通过搜索二叉树的特性找到数值插入的位置,然后对值进行插入操作,我们先来看看代码,然后再做分...原创 2019-01-15 10:45:32 · 481 阅读 · 0 评论 -
LeetCode 204.计数质数
这个题目内容很简单,就是给定一个int类型的整数,来返回所有小于这个数的质数的数量:这个题目其实不难,拿到这个题目我们首先还是会想到暴力解法,就是用两层for循环,一一判断每个小于n的数是否是质数,如何判断是否是质数呢,那就将n对1-n/2的每个数取余,来判断n是否有因子,这样的复杂度很高,很容易就超时了。所以说我们可以换一种思考的角度,我们可以用一种叫做厄拉多塞的筛选法,这种筛选方法就是从2...原创 2019-01-16 09:58:33 · 410 阅读 · 0 评论 -
LeetCode 206.反转链表
这是一道关于链表最基础也是最经典的一道题目,就是我们需要反转一个链表,题目如下所示:这道题的思想就是我们需要把链表中每个节点所指的方向调转,然后把指针往后移,一直到链表尽头,整个流程可以如下所示:我们这里有三个指针,分别表示前一个位置 prev,当前位置 cur 和下一个位置 next。每次操作的第一步就是将prev指向cur的指针方向调转,然后移动向下一个位置移动cur指针,直到cur到...原创 2019-03-22 12:19:49 · 190 阅读 · 0 评论 -
LeetCode 703.数据流中的第K大元素
我们首先来看看这道题目,找到数据流中第K大的元素:首先拿到这道题目,我们有可能会想到一种暴力的解法,就是首先把输入的数据流进行排序,然后从排好序的数据流中找到第K个元素,就行了,这也是一种解法,我们可以计算一下这种解法情况下的时间复杂度,假设有 NNN 个元素,要将 KKK 个元素进行快速排序,那么时间复杂度就为:O(N⋅K⋅logK)O(N \cdot K \cdot \log K)O(N...原创 2019-03-29 14:46:11 · 573 阅读 · 0 评论 -
LeetCode 239.滑动窗口最大值
这道题的题目比较简单,就是在数组中滑动窗口,并找出每次滑动之后窗口中的最大值输出,题目如下所示:原创 2019-03-30 12:15:55 · 412 阅读 · 0 评论 -
LeetCode 141 & 142.环形链表
首先是141题,如何判断一个链表是否有环,题目如下所示:拿到这个题目,我们很难想到什么比较简洁快速的解法,的确这个题目用常规的方法比较难解决。在这里给大家介绍一个快慢指针的解法,首先我们定义两个指针 fast 和 slow ,分别表示快指针和慢指针,快指针是每一次走两步,慢指针是每一次走一步。那么如果一个链表中存在环的话,那么这个快指针一定会比慢指针先进环中,然后慢指针也会进到换中,因为快指...原创 2019-03-23 16:20:24 · 207 阅读 · 0 评论 -
LeetCode 50.Pow(x, n)
这道题目比较简单,就是要实现一个指数函数,题目如下:首先,如何来解答这个题目,我们可能会想到,在很多语言中都内置了这个函数,直接可以调用库函数,这个时候的时间复杂度为 O(1)O(1)O(1),还有一种方法就是暴力解法,写一个循环,循环次数为 nnn,每次都乘以 xxx,所以这个时候的时间复杂度为 O(N)O(N)O(N),这都是比较容易想到的办法。接下来我们可以从另外一个角度来进行分析,我...原创 2019-04-04 14:49:45 · 139 阅读 · 0 评论 -
LeetCode 160.相交链表
这道题目是要找到两个链表相交的起始节点,题目如下所示:这里有一个很巧妙的解法,我们来从这两个链表的结构来分析,我们如何去找到两个链表相交的起始节点呢?相交之后的链表是一样的,我们看下图所示:在图中 AAA 点和 BBB 点分别表示两个链表的起点,CCC 点事我们要找的交点,ACACAC 的长度是 aaa,BCBCBC 的长度是 bbb ,剩下相同部分的内容长度是 ccc,那么我们可以用两个...原创 2019-03-28 16:07:22 · 159 阅读 · 0 评论 -
LeetCode122.买卖股票的最佳时机 II
这道题的难度很小,主要是要为大家介绍一下贪心算法,首先我们来看一下题目:在此,我们可以考虑使用贪心算法,所谓贪心算法就是在当前的状态下,来获取当前状态下最好的结果或者利益,不用从全局来考虑问题,这就是贪心算法的思想。这道题目我们用贪心算法,只用考虑当前状态下的最大利润,只要是当天股票相较于上一天来说有涨,那么我们就卖掉获取利润,然后一直到最后一天,这样总的利润加起来就是我们可以获取的最大利润,...原创 2019-04-08 10:42:06 · 271 阅读 · 0 评论 -
LeetCode 102. 二叉树的层次遍历
这是一道非常经典的二叉树层次遍历的问题,就是将二叉树逐层输出,首先来看一下题目:看到题目中的层次遍历,我们首先想到的就是广度优先搜索算法BFS,我们来看看如何实现广度优先算法,首先我们将二叉树放入队列中,然后遍历队列,每次将节点的左右孩子放入队列的尾部,并将当层的节点输出,这样就可以实现广度优先遍历,代码如下所示。python:# Definition for a binary tree ...原创 2019-04-08 14:23:32 · 161 阅读 · 0 评论 -
LeetCode 242.有效的字母异位词
这道题目比较简单,主要想要分享的就是解题的思路与思考,首先我们来看看这道题目:也就是说我们需要找到两个字符串是否含有相同的字母以及字母出现的数目,那么最简单也是我们最容易想到的就是将这两个字符串排序,然后将两个字符串进行比较是否相同。因为Python中集成了排序的方法,所以代码也非常简单:class Solution(object): def isAnagram(self, s, t...原创 2019-04-02 16:49:30 · 154 阅读 · 0 评论 -
LeetCode 22. 括号生成
这道题目目的是给定一个 nnn ,表示括号的对数,生成所有有效括号的组合输出,题目如下所示:首先拿到这个题目似乎无从下手,因为这是一个排列组合的问题,我们必须从中找到规律,我们可以发现右括号出现的前提是:右括号的左边必须有左括号左括号的数量一定要比右括号的数量多左括号和右括号的数量都不能大于 nnn而左括号出现的前提只需要左括号的总数小于 nnn 就可以了。所以我们在解决问题的时候...原创 2019-04-08 15:57:16 · 139 阅读 · 0 评论 -
LeetCode 51 & 52.N皇后
N皇后问题是算法中很经典的一个问题,将 nnn 个皇后同时摆放在棋盘中,且互相不能攻击,问有多少种不同的解法。首先我们来看看题目:从题面上看来,这道题目似乎很难入手,我们唯一的入手点就是皇后的特性,皇后就是可以攻击自己所在的行、列、左斜边和右斜边上所有的点。所以一个皇后摆放之后,就要排除这个皇后所在的行列以及两个斜边所有的点了。行和列,我们比较容易理解,那么斜边的特性是怎么样的呢?我们先来看左...原创 2019-04-09 10:03:40 · 350 阅读 · 0 评论 -
LeetCode 70.爬楼梯
这是一道比较简单而且很典型的动态规划算法的题目,首先我们来看看题目:拿到这个题目我们就可以想到动态规划的思想,首先我们来倒着推导,我们要达到第 nnn 阶台阶,必须是从第 n−1n-1n−1 或者 n−2n-2n−2 阶台阶上来的,那么我们假设第 nnn 阶台阶的走法有 f(n)f(n)f(n) 种,那么综上所述 f(n)=f(n−1)+f(n−2)f(n)=f(n-1)+f(n-2)f(n)...原创 2019-04-26 15:55:31 · 180 阅读 · 0 评论 -
LeetCode 72. 编辑距离
编辑距离在自然语言处理中的应用是非常广泛的,比如在文本纠错中,编辑距离是必不可少的算法,下面这个题目就是计算两个单词的编辑距离计算:这道题目基本上用普通的办法很难去解决,只能考虑用动态规划来进行递推解答。首先我们可以确定只定义一维的DP[i]DP[i]DP[i]不能够有效地简化问题的处理,那么我们尝试用二维的DPDPDP来解答这个问题,首先我们定义一个二维的DP列表 DP[i][j]DP[i]...原创 2019-09-02 14:47:07 · 205 阅读 · 0 评论