LeetCode 算法学习
在 LeetCode 上的学习博客
ZHuZ1H
这个作者很懒,什么都没留下…
展开
-
LeetCode 算法题库【1518】——换酒问题
换酒问题题目描述:题目链接Python3class Solution: def numWaterBottles(self, numBottles: int, numExchange: int) -> int: drink = 0 Full = numBottles Empty = 0 while True: drink += Full Empty += Full原创 2021-12-17 22:44:44 · 331 阅读 · 0 评论 -
LeetCode 算法题库【210】——课程表Ⅱ
课程表Ⅱ题目描述:解题思路:第一种:广度优先搜索。这个方法和之前的 课程表Ⅰ 里的很像。都用到了拓扑排序。主要的思路也是建立入度表和邻接表,将入度为0的边依次append到res中。然后再对res进行遍历,将其每个结点的邻接结点入度减一,如果入度变为0,则加入res中。最后的判断和上次的也很类似,我们设置一个出队个数参数temp,每次遍历都会加1,最后如果出对个数等于课程次数,则返回res,否则,说明形成了环,则不可能完成所有课程,即返回空数组[]。时间复杂度:O(N + M)class原创 2020-05-15 23:03:47 · 292 阅读 · 0 评论 -
LeetCode 算法题库【207】——课程表
课程表题目描述:解题思路:Python3第一种:这个方法就是先将这所有的匹配用字典的方式储存,然后按照入度依次移除没有先修课程的课,即没有入度的节点。然后每次学完之后都要通过remove删除。最后当某个课程的先修课程全部学完了,则这个课程就要从字典中删除,然后它就会变成没有入度的结点,后续也会删除。最后就看列表中是否还有没修完的课,如果全部修完,也就是列表为空,即返回True,否则返回Talse。时间复杂度:O(N^3)class Solution: def canFinish(原创 2020-05-15 20:20:22 · 428 阅读 · 0 评论 -
LeetCode 算法题库【236】——二叉树的最近公共祖先
二叉树的最近公共祖先题目描述:解题思路:第一种:分治递归。这道题解题的关键就是通过遍历找出这两个结点,然后找到这个公共祖先root。这里我们的思路就是分别判断这个结点的左右子树,如果在左右子树都找到了p和q则这个结点就是最近的公共祖先了。时间复杂度:O(N)class TreeNode: def __init__(self, x): self.val = ...原创 2020-05-06 16:27:57 · 242 阅读 · 0 评论 -
LeetCode 算法题库【137】——只出现一次的数字Ⅱ
只出现一次的数字Ⅱ题目描述:解题思路:python3第一种:排序查找法。这个方法是根据原先的那道题:只出现一次的数字Ⅰ,进行稍微的改进,方法和思路都是一样的,可以参考。唯一的改变就是,之前的题目中,相同数字的出现次数为2次,而这次是3次,所以我们排完序之后,只需要每隔3位进行查找,就能很快锁定这个唯一的数字。时间复杂度:O(N)class Solution: def s...原创 2020-04-19 23:07:51 · 204 阅读 · 0 评论 -
LeetCode 算法题库【89】——格雷编码
格雷编码题目描述:解题思路:python3第一种:位运算法。首先我们需要了解格雷编码是个什么东西:格雷编码(循环二进制单位距离码)是任意两个相邻数的代码只有一位二进制数不同的编码。这道题我们可以通过二进制遍历,为了保证相邻的数的二进制编码不同的只有一个,我们通过位运算符^(异或),这个位运算符的详细解释可以看这篇教程:运算符,这里就不多说。我们通过自己和自己右一位进行异或运算,最后...原创 2020-04-19 19:50:39 · 215 阅读 · 0 评论 -
LeetCode 算法题库【78】——子集
子集题目描述:解题思路python3第一种:层次迭代。我们很容易能从子集中找出规律,首先定义最终子集res_subset为[[]],也作为首层,然后将nums从头开始遍历,每遍历一次就到下一层,举例比如nums = [1,2,3],然后根据首层的集合只有一个空集,也就是数目为1,将这个集合都加上nums[0],也就是nums的第一个数,就变成了[1],再放回res_subset中,此时...原创 2020-04-19 17:40:08 · 214 阅读 · 0 评论 -
LeetCode 算法题库【136】——只出现一次的数字
只出现一次的数字题目描述:解题思路:python3第一种:遍历验证法。首先看到这题,我们需要找到那个唯一的只出现一次的数字,而其他的数字都是只出现了两次,那么我们如果一个一个的去数组里找是否有重复的,这样时间复杂度会很大,所以我们要想如何更加简单的找出唯一的只出现一次的数字。首先我们需要排序,因为如果不排序,那么假设你找到第一个数字1,那么你要找到第二个1是很麻烦的,为了方便比较这个...原创 2020-04-09 18:53:47 · 260 阅读 · 0 评论 -
LeetCode 算法题库【344】——反转字符串
反转字符串题目描述:解题思路:python3第一种:遍历替换法。这道题的思路很直接,我们就是将这个列表的字符反转过来,也就是头元素和尾元素交换,然后次元素和次尾元素交换,以此类推,我们通过所学数学的知识,可以很容易得到规律,通过遍历前一半的元素,依次完成换位,最后得到答案。我们需要注意的是这里可能大家会考虑奇偶数的问题,这一点我一开始写遍历是分了两种情况来写,但是我们发现用整除可以简...原创 2020-04-06 22:26:53 · 168 阅读 · 0 评论 -
LeetCode 算法题库【44】——通配符匹配
通配符匹配题目描述:解题思路:第一种:递归。按照顺序,依次判断是否为*,因为*能代表多个不同的字符。每次判断完p都会通过切片的方式去掉判断完的字符,然后进行递归。最后剩下最后一个字符的时候判断是否为*,如果是则直接返回True,如果不是,则要判断最后这个字符和s[0]要对应相等或者最后一个字符为?。因为这个方法函数调用过深,会超时,所以需要换一种方法。class Solutio...原创 2020-03-30 23:48:17 · 1475 阅读 · 0 评论 -
LeetCode 算法题库【239】——滑动窗口最大值
滑动窗口最大值题目描述:解题思路:第一种:暴力法。这个思路就很好理解,从头开始遍历,用切片取每次的k个元素作为滑动窗口然后把最大值直接append给最后需要返回的最大值集合max_number。非常暴力所以速度比较慢。时间复杂度:O(N)class Solution: def maxSlidingWindow(self, nums: List[int], k: int) ...原创 2020-03-30 21:15:31 · 309 阅读 · 0 评论 -
LeetCode 算法题库【641】——设计循环双端队列
设计循环双端队列题目描述:解题思路:C#我们可以首先定义这几个私有的量,定义队列,头尾指针,队列的长度和总长度。然后后面就很好写了,我们可以先写最后的IsEmpty和IsFull函数,这两个就是判断是否为空和是否队列已满,只需要返回长度为0和长度为最大长度即可。中间的这些函数,每次都要判断是否为空和是否队列已满。public class MyCircularDeque{ ...原创 2020-03-30 17:16:58 · 188 阅读 · 0 评论 -
LeetCode 算法题库【55】——跳跃游戏
跳跃游戏题目描述:解题思路:第一种:贪心算法。这道题用贪心算法可以很快解决,首先我们定义max_location作为我们能够达到的最远距离的所需步数,我们只要能够判断这个步数大于要到达这个数组末尾的步数,就可以认为跳跃游戏成功。我们设了temp来保存数组中每个位置能够跳跃的最大步数,当然这里容易出现一个错误,就是我们容易只顾着后面忘记了前面,我们要保证当前的位置通过之前的步数能够到达,不...原创 2020-03-28 22:08:42 · 373 阅读 · 0 评论 -
LeetCode 算法题库【455】——分发饼干
分发饼干题目描述:解题思路:第一种:贪心算法简陋版。我们可以先将这两个列表进行排序,然后同时从头开始遍历查找,优先满足那些数字小的,也就是胃口更小的小朋友,所以从小到大,只要存在s中有大于等于g的元素,说明这个元素就可以满足条件,就给child_number加一,然后将数组s用切片方法截去j元素及之前的元素。方法比较暴力,所以时间复杂度比较大。时间复杂度:O(NM)class S...原创 2020-03-27 21:55:40 · 220 阅读 · 0 评论 -
LeetCode 算法题库【392】——判断子序列
判断子序列题目描述:解题思路:第一种:顺序查找。当我看到这个题,我的想法是,能不能将要找的字符串s的每个字符,在长字符串t中依次来查找,因为一定要按照原字符串s的顺序来,所以每当我们找到一个字符,就把这个字符之前的所有字符去掉(包括这个字符),然后再继续往下查找,以此类推。这样就变得简单了,下面实现这个思路,我们可以通过迭代的方式依次判断每个字符是不是在t中,这里s[i]在t中的第一次出...原创 2020-03-26 20:01:26 · 315 阅读 · 0 评论 -
LeetCode 算法题库【7】——整数反转
整数反转题目描述:解题思路:第一种:算是暴力法把,也没有什么过多的花里胡哨,这个题目的思路非常明确,也很简单,就是把数字反转,带负号的要保留,如果反转后开头数字是0则要去除。根据这些所需条件,就很容易能写出代码。对于反转整数,这里我第一想到了用字符串的方法,将这个数字转成字符串的形式,然后取绝对值将符号去掉(方便反转),用字符串切片的方法,也就是num[::-1],来将字符串反转,从而...原创 2020-03-26 01:56:37 · 171 阅读 · 0 评论 -
LeetCode 算法题库【122】——买卖股票的最佳时机Ⅱ
买卖股票的最佳时机Ⅱ题目描述:解题思路:第一种:这个思路也是很简单的,我发现这里有个很神奇的地方,就是这里我们只需要把这个数组中的所有相邻元素的差值算出来,然后将这些元素中大于零的数的和求出来,这就是我们所需要的最大利润。原理也很简单,就是当你在算最大利润的时候,每次股票的利润都是卖出的那天价格减去买入的价格,因为我们不限制买卖股票的数量,那么我们就把只要是盈利的价格都加在一起,而盈利...原创 2020-03-11 16:36:59 · 182 阅读 · 0 评论 -
LeetCode 算法题库【99】——恢复二叉搜索树
恢复二叉搜索树题目描述:解题思路:第一种:递归思路。对于树的题几乎都可以通过递归来实现,那么这道题我们还是使用递归的方法来解。这一题从题目中可以get到信息点就是错误的只有两个数字,我们只需要找到这两个数字然后换位置就可以了,那现在的问题就是要怎么找到这两个数。这道题我还是和前几期题目一样,设置了一个函数来进行递归。首先,时间复杂度:O(N)class TreeNode:...原创 2020-03-24 23:37:40 · 184 阅读 · 0 评论 -
LeetCode 算法题库【95】——不同的二叉搜索树 Ⅱ
不同的二叉搜索树 Ⅱ题目描述:解题思路:第一种:递归方法。首先我们先了解这个二叉搜索树。对于这道题,我们要通过给的n来找出所有的二叉搜索树,那么我们可以从1到n每个数都要看它的左边和右边的数可以构成多少二叉搜索树,根据二叉搜索树的性质,也就是要保证左边的数要小于右边的数,满足条件就通过递归方法找到同样满足条件的左子树和右子树,然后将这个满足条件的二叉搜索树放入要输出的result中。我们...原创 2020-03-23 23:55:18 · 136 阅读 · 0 评论 -
LeetCode 算法题库【150】——逆波兰表达式求值
逆波兰表达式求值题目描述:解题思路:第一种:迭代遍历。这道题难度并不是很大,考验的是我们熟练掌握栈的方法来解决四则运算的问题。思路就是我们先从头开始遍历字符串,如果遇到数字,那么就先放入栈中,当我们第一次遇到四则运算符号时,我们就将前两个元素pop出来,这里则将栈顶两个元素pop出来就很方便,体现了栈的思想方法。之后就进行分类讨论,每一种运算符对应的运算写出来,然后将这个结果再次放入栈...原创 2020-03-23 02:31:09 · 217 阅读 · 0 评论 -
LeetCode 算法题库【155】——最小栈
最小栈题目描述:解题思路:第一种:辅助栈法。这个方法就是按照给的要求,我们先定义两个栈stack和min_result,然后一个一个函数来编写。先是push函数,这里我们要做的就是将元素x放入栈stack中,但是我们还要考虑的是还有一个函数时需要我们返回最小元素的,所以在这里要做上铺垫,我们将该元素放入查找最小元素的栈min_result中,而且为了找到最小的,我们还要做比较,将最小的那...原创 2020-03-23 01:23:37 · 173 阅读 · 0 评论 -
LeetCode 算法题库【94】——二叉树的中序遍历
二叉树的中序遍历题目描述:解题思路:第一种:递归。又是递归,可以发现很多题都可以用到递归的思路…。二叉树的中序遍历,这里不太了解的可以看看这个博客:二叉树遍历,总结了二叉树的所有遍历情况。这道题所说的中序遍历,就是按照这个顺序:左子树—> 根结点 —> 右子树的顺序来遍历的。那么递归就很好写了,我还是设了一个函数TraverseTree来递归,然后还定义了一个数组result...原创 2020-03-22 21:26:26 · 192 阅读 · 0 评论 -
LeetCode 算法题库【5】——最长回文子串
最长回文子串题目描述:解题思路:第一种:这个思路是,我们可以通过从字符串子串的中心而不是起点来向两边同时扩散寻找回文子串。首先是排除特殊的s为空或者字符数目为1的情况,然后时间复杂度:O(N^2)class Solution: def longestPalindrome(self, s: str) -> str: def expand(l,r): ...原创 2020-03-17 23:52:18 · 207 阅读 · 0 评论 -
LeetCode 算法题库【104】——二叉树的最大深度
二叉树的最大深度题目描述:解题思路:第一种:递归。这个思路应该说是最容易想到的了。我是设了另一个函数来递归计算这个最大深度。我们分几种情况来讨论,首先先排除掉这两个特殊情况:如果二叉树为空,返回0,如果二叉树只有根节点,也就是没有任何子节点,返回1 。然后我们需要想,如果这棵二叉树的某个结点有左右两个子节点,那么,下一次递归我们对这两个子节点都要递归一次,然后取其中递归最深的那次深度,因...原创 2020-03-21 19:41:05 · 196 阅读 · 0 评论 -
LeetCode 算法题库【101】——对称二叉树
对称二叉树题目描述:解题思路:第一种:递归方法。这道题应该说比较容易想到的就是递归的方法,为了方便比较判断,我新定义了一个函数CompareTree,我们将在这个函数里判断这个树是否为对称二叉树,首先我们将树的头节点的两个根节点放入比较,如果满足了对称的条件,就依次将这两个根节点的下两个根节点放入递归函数中继续判断,只有全部通过,也就是最后的两个节点都为Null,才会返回True。时间...原创 2020-03-20 21:47:44 · 199 阅读 · 0 评论 -
LeetCode 算法题库【1】——两数之和
两数之和题目描述:做题思路:我是用python写的,下面说几种方法:第一种:方法是在nums这个数集中看看是否能找到target - nums[i],当然要保证在这个数只有一个,不能重复,最后用index找到该数对应位置,再返回[i,j]。这样算耗时会比较长。class Solution: def twoSum(self, nums, target): le...原创 2020-02-21 14:21:51 · 243 阅读 · 0 评论 -
LeetCode 算法题库【26】——删除排序数组中的重复项
删除排序数组中的重复项题目描述:做题思路:下面说几种python的题解方法:第一种:这个方法是比较容易想到的,也是我一开始想的方法,就是先得到nums数组的长度,然后在这个数组上一个一个往后比较,如果不相同,就把那个数字移动到前面,比如[0,0,1,1,1,2,2,3,3,4]中,因为0和0相同,就跳过到下一个,然后又因为0和1不同,所以就把1移动到第二个位置,以此类推,到1和2比较的...原创 2020-02-23 01:24:18 · 224 阅读 · 0 评论 -
LeetCode 算法题库【27】——移除元素
移除元素题目描述:解题思路:第一种:看到这个题首先是想通过利用pop()函数来移除相同的数字,因为pop()函数将数字移除之后 序列会发生变化,所以我们移除一个数字之后不需要再+1,在发现数字不同的时候需要+1来比较下一个。这个方法耗时还是挺短的。class Solution: def removeElement(self, nums: List[int], val: int...原创 2020-02-23 01:52:15 · 258 阅读 · 0 评论 -
LeetCode 算法题库【53】——最大子序和
最大子序和题目描述:做题思路:第一种:class Solution: def maxSubArray(self, nums: List[int]) -> int: lens = len(nums) temp = maxi = nums[0] for i in range(1, lens): if t...原创 2020-03-01 12:55:20 · 245 阅读 · 0 评论 -
LeetCode 算法题库【88】——合并两个有序数组
合并两个有序数组题目描述:解题思路:第一种:这个方法是我一开始想到的,我想着因为要把nums2的数放到nums1里头的后面,然后把0代替,所以我就直接用for把后面的0的位置的数字换成nums2的数,最后用sort()排序得到最后的nums1。时间复杂度也不是很好,需要进一步改进。class Solution: def merge(self, nums1: List[int]...原创 2020-03-01 16:04:33 · 224 阅读 · 0 评论 -
LeetCode 算法题库【121】——买卖股票的最佳时机Ⅰ
买卖股票的最佳时机题目描述:解题思路:第一种:这个方法有点类似于求最大子序和的贪心算法。先保证这个prices数组不是空列表,然后先假设最小值mini为prices[0],然后一次比较列表中元素,发现更小的元素则重新赋值给mini,然后每次都通过prices[i] - mini获得一次最大利润maxi,最后返回最终得到的最大利润maxi。class Solution: def...原创 2020-03-01 18:39:41 · 198 阅读 · 0 评论 -
LeetCode 算法题库【15】——三数之和
三数之和题目描述:解题思路:第一种:对于这道题,我们用的是排序 + 双指针的解法。开始我们有个比较好的思路,就是我们可以先对数组进行从小到大排序,然后我们容易发现,要使得三个数相加为0,第一个数必须要是小于等于零,如果大于零了,那后面的数字也是大于零的,这样相加肯定是不可能等于0的。所以我们只需要从小开始找,直到发现第一个数开始大于零了,就可以返回这些三元组了。下一个就是我们在头尾设置双...原创 2020-03-04 23:10:51 · 227 阅读 · 0 评论 -
LeetCode 算法题库【16】——最接近的三数之和
最接近的三数之和题目描述:解题思路:第一种:这道题和上一个题的那个三数之和的思路很像,所以这个解法也是排序 + 双指针的写法,大体上思路和三数之和一样,也要去重,简化,然后求最后的三数之和和题目所给target的差值,如果差值等于零,那么直接返回这个和即可,如果大于零或者小于零,则就继续缩小范围看看能不能使差值diff更加接近于 0 ,最后返回更加接近于 0 的数。class Sol...原创 2020-03-05 19:06:12 · 228 阅读 · 0 评论 -
LeetCode 算法题库【123】——买卖股票的最佳时机Ⅲ
买卖股票的最佳时机Ⅲ题目描述:解题思路:这道题跟前两个买卖股票的题目比较更加的难,难就难在这里限制了你只能交易两次。我一开始的想法是类似买卖股票Ⅱ的一个方法,把差值求出来然后找每个正数和的前两个最大值,然后加在一起返回,最后发现这个做法其实是错误的,仔细想想这个利润没有我们想的这么简单。下面说一下我学习到的一些方法。第一种:这里第一种方法算是一种二分法,就是分两次遍历。第一次遍历是从...原创 2020-03-06 23:33:31 · 183 阅读 · 0 评论 -
LeetCode 算法题库【21】——合并两个有序链表
合并两个有序链表题目描述:解题思路:第一种:每次选两个链表头结点最小的,时间复杂度O(m+n)# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solut...原创 2020-03-07 23:52:53 · 356 阅读 · 0 评论 -
LeetCode 算法题库【83】——删除排序链表中的重复元素
删除排序链表中的重复元素题目描述:解题思路:第一种:这个方法也是比较好想的。跟之前的链表题类似,一开始要先对head链表进行检验是否为空,或者说只有一个元素。其次,只要链表中有不止一个元素,就对p.val和p.next.val比较,如果相同,则删除重复项,也就是p.next的起点从p.next.next开始。如果不相同,则就继续往下比较。最后返回去重后的head。时间复杂度:O(m)...原创 2020-03-08 19:44:57 · 183 阅读 · 0 评论 -
LeetCode 算法题库【141】——环形链表
环形链表题目描述:解题思路:第一种:这个方法思路也很简单,也很容易想到,我们先设了两个指针Front和Back,都指向链表的头部head,然后开始迭代,Front每次走两步,然后Back每次走一步,这样的话两个指针每次的距离差距都会 +1,如果说链表中存在环,则这两个指针一定会在某个时候相遇,也就是Front == Back,如果Front走完全部链表了都没有相遇,则这个链表中没有环。...原创 2020-03-11 16:38:53 · 133 阅读 · 0 评论 -
LeetCode 算法题库【2】——两数相加
两数相加题目描述:解题思路:第一种:这个方法是比较常规的方法,没有什么花里胡哨。一开始也是先定义头结点,然后对p进行修改。然后进行迭代,然后用temp来表示往后进位的数,再加上前面链表里的对应元素,也就是Sum,再对10 取余,得出来的结果放到p.next,然后从p.next开始找下一位数,以此类推。算到链表最后,如果说temp仍然是大于零的,说明Sum大于10,要进位,所以链表p最后元...原创 2020-03-11 16:39:45 · 219 阅读 · 0 评论 -
LeetCode 算法题库【19】——删除链表的倒数第N个节点
删除链表的倒数第N个节点题目描述:解题思路:第一种:这个方法用到了双指针,方法也很简单,我们通过for循环和a = a.next使得a链表往后走n个位置,这样的话a和b就相隔n个位置。这里如果a已经走完了,说明这个链表倒数n个位置就是这个链表的表头,那么则直接返回head。如果a没有走完,那么很明显这里因为a和b隔着n个位置,那么等到a到达了链表的尾部,则b就是处于距离链表尾部n个位置的...原创 2020-03-11 23:33:05 · 153 阅读 · 0 评论 -
LeetCode 算法题库【23】——合并K个排序链表
合并K个排序链表题目描述:解题思路:第一种:这个方法比较暴力,思路也很简单。就是把全部的链表都合成一个链表,然后对这一个链表进行排序,这样就把问题大大简化了。我们用p来存放结合后的链表,通过for和while循环将lists的元素一个一个放入p中。然后排序,并放入新的链表中返回。时间复杂度:O(NlogN)# Definition for singly-linked list.#...原创 2020-03-12 19:38:34 · 252 阅读 · 0 评论