![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
寄摆人
这个作者很懒,什么都没留下…
展开
-
Leetcode每日一题2021.3.12第121题:买卖股票的最佳时机
题目描述示例原创 2021-03-13 15:16:48 · 175 阅读 · 0 评论 -
Leetcode每日一题2021.3.11第119题:杨辉三角Ⅱ
题目描述示例思路及算法方法一:先算出杨辉三角的前k+1行,再返回第k行class Solution: def getRow(self, rowIndex: int) -> List[int]: if rowIndex == 0: return [1] res = [[1]] while len(res) < (rowIndex + 1): new_row = [a + b for原创 2021-03-12 16:38:39 · 151 阅读 · 0 评论 -
Leetcode每日一题2021.3.11第118题:杨辉三角
题目描述示例思路及算法方法一:数学依据杨辉三角形的性质之一:每个数字等于上一行的左右两个数字之和,如果用ret列表来代表已计算好的部分杨辉三角形,用row列表表示第n行数字,那么此性质可表示为: row[i] = ret[n-1][i-1] + ret[n-1][i]。class Solution: def generate(self, numRows: int) -> List[List[int]]: ret = list() # ret代表已计算出的部分杨辉原创 2021-03-11 20:54:41 · 168 阅读 · 0 评论 -
Leetcode每日一题2021.3.11第112题:路径总和
题目描述示例思路及算法本题题解的核心思想是对树进行一次遍历,在遍历时记录从根节点到当前节点的路径和,以防止重复计算。方法一:广度优先搜索首先我们可以想到使用广度优先搜索到额方式,记录从根节点到当前节点的路径和,以防止重复计算。这样我们使用两个队列,分别存储将要遍历的节点,以及根节点到这些节点的路径和即可。# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=N原创 2021-03-11 15:06:34 · 115 阅读 · 0 评论 -
Leetcode每日一题2021.3.11第111题:二叉树的最小深度
题目描述示例思路及算法方法一:深度优先搜索首先可以想到使用深度优先搜索的方法,遍历整棵树,记录最小深度。对于每一个非叶子节点,我们只需要分别计算其左右子树的最小叶子节点深度。这样就将一个大问题转化为了小问题,可以递归地解决该问题。# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = v原创 2021-03-11 12:36:37 · 116 阅读 · 0 评论 -
Leetcode每日一题2021.3.11第110题:平衡二叉树
题目描述示例思路及算法根据题目的定义,一棵二叉树是平衡二叉树,当且仅当所有子树也都是平衡二叉树,因此可以使用递归的方式判断二叉树是不是平衡二叉树,递归的顺序可以是自顶向下或者自底向上。方法一:自顶向下的递归定义函数 height,用于计算二叉树中的任意一个节点 p 的高度:有了计算节点高度的函数,即可判断二叉树是否平衡。具体做法类似于二叉树的前序遍历,即对于当前遍历到的节点,首先计算左右子树的高度,如果左右子树的高度差不超过1,再分别递归地遍历左右子节点,并判断左子树和右子树是否平衡。这原创 2021-03-11 12:15:42 · 149 阅读 · 0 评论 -
Leetcode每日一题2021.2.28第108题:将有序数组转换为二叉搜索树
题目描述示例思路二叉搜索树的中序遍历是升序序列,题目给定的数组是按照升序排序的有序数组,因此可以确保数组是二叉搜索树的中序遍历序列。但是,给定二叉搜索树的中序遍历,也不能唯一地确定二叉搜索树。如果没有要求二叉搜索树地高度平衡,则任何一个数字都可以作为二叉搜索树的根节点,因此可能的二叉搜索树有多个。如果增加一个限制条件,即要求二叉搜索树的高度平衡,也仍然无法唯一地确定二叉搜索树。直观地看,我们可以选择中间数字作为二叉搜索树的根节点,这样分给左右子树的数字个数相同或只相差1,可以使得树保持原创 2021-03-11 10:28:55 · 123 阅读 · 0 评论 -
Leetcode每日一题2021.2.28第104题:二叉树的最大深度
题目描述示例方法一:深度优先搜索思路和算法如果我们知道了左子树和右子树的最大深度 l 和 r ,那么该二叉树的最大深度即为 max(l, r) +1而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们可以用【深度优先搜索】的方法来计算二叉树的最大深度。具体而言,在计算当前二叉树的最大深度时,可以先递归计算出其左子树和右子树的最大深度,然后在O(1)时间内计算出当前当前二叉树的最大深度。递归在访问到空节点时退出。代码# Definition for a binary tree no原创 2021-02-28 23:31:38 · 121 阅读 · 0 评论 -
Leetcode每日一题2021.2.28第101题:对称二叉树
题目描述示例方法一:递归思路和算法如果一个树的左子树与右子树镜像对称,那么这个树是对称的。如果同时满足下面的条件,两个树互为镜像:它们的两个根节点具有相同的值每个树的右子树都与另一个树的左子树镜像对称我们可以实现这样一个递归函数,通过【同步移动】两个指针的方法来遍历这棵树,p指针和q指针一开始都指向这棵树的根,随后p右移时,q左移;p左移时,q右移。每次检查当前p和q节点的值是否相等,如果相等再判断左右子树是否对称。代码# Definition for a binary tre原创 2021-02-28 20:37:23 · 130 阅读 · 1 评论 -
Leetcode每日一题2021.2.28第100题:相同的树
题目描述示例深度优先搜索如果两个二叉树都为空,那这两个二叉树相同。如果两个二叉树中有且只有一个而空,则两个二叉树一定不相同。如果两个二叉树都不为空,那么首先判断它们的根节点是否相同。这是一个递归的过程,因此可以使用深度优先搜索,递归地判断两个二叉树是否相同。代码# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):#原创 2021-02-28 19:01:41 · 139 阅读 · 1 评论 -
Leetcode每日一题2021.2.28第88题:合并两个有序数组
题目描述示例方法一:双指针/从前往后将nums1的前m个元素复制一份,放在一个新列表nums1_copy中,再清空nums1。设置指针p1和p2,p1指向nums1_copy的开头,p2指向nums2的开头,在每一步将最小值放出输出数组nums1中。class Solution: def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None: """ Do no原创 2021-02-28 16:03:22 · 101 阅读 · 1 评论 -
Leetcode每日一题2021.2.28第896题:单调数列
题目描述示例思路和算法遍历数组,如果既碰到了升序,又碰到了降序,则返回False。class Solution: def isMonotonic(self, A: List[int]) -> bool: inc = dec = True n = len(A) for i in range(n-1): if A[i] > A[i+1]: inc = False原创 2021-02-28 15:00:56 · 56 阅读 · 0 评论 -
Leetcode每日一题2021.2.26第70题:爬楼梯
题目描述示例方法一:动态规划思路和算法我们用 f(x) 表示爬到第 x 级台阶的方案数,考虑到最后一步可能跨了一级台阶,也可能跨了两级台阶,所以我们可以列出如下式子:f(x) = f(x-1) + f(x-2)它意味着爬到第 x 级台阶的方案数是爬到第 x-1 级台阶的方案数和爬到第 x-2 级台阶的方案数的和。边界条件:我们从第0级开始爬,所以从第0级爬到第0级我们可以看作只有一种方案,即 f(0) = 1;从第0级到第1级也只有一种方案,即爬一级,f(1) = 1。由于 f(x)只和原创 2021-02-28 14:19:57 · 102 阅读 · 0 评论 -
Leetcode每日一题2021.2.26第67题:二进制求和
题目描述示例思路和算法基于Python自带的高精度运算,我们可以考虑一个最朴素的方法:先将 a 和 b 转化成十进制,求和后再转化为二进制输出。代码class Solution: def addBinary(self, a: str, b: str) -> str: return '{:b}'.format(int(a, 2) + int(b, 2))...原创 2021-02-26 21:06:35 · 67 阅读 · 0 评论 -
Leetcode每日一题2021.2.26第66题:加一
题目描述示例思路和算法digits 前面加0,从后向前循环,逢9就变0;直到不等于9时,加1,结束循环。最后检查 digits 前面加的 0 是否多余,多余的话就去掉。代码class Solution: def plusOne(self, digits: List[int]) -> List[int]: digits = [0] + digits for i in range(len(digits) - 1, -1, -1):原创 2021-02-26 20:32:46 · 87 阅读 · 0 评论 -
Leetcode每日一题2021.2.26第58题:最后一个单词的长度
题目描述示例代码:class Solution: def lengthOfLastWord(self, s: str) -> int: s = s.strip() if not s: return 0 list = s.split() return len(list[-1])原创 2021-02-26 17:22:33 · 66 阅读 · 0 评论 -
Leetcode每日一题2021.2.26第53题:最大子序和
题目描述示例方法一:动态规划思路和算法:我们用 f(i) 代表以第 i 个数结尾的 【连续子数组的最大和】,那么我们要求的就是:因此我们只需要求出每个位置的 f(i) ,然后返回 f 数组中的最大值即可。如何求 f(i)呢?我们可以考虑 nums[i] 单独成为一段还是加入 f(i-1) 对应的那一段,于是我们可以得到如下的动态规划转移方程:考虑到 f(i) 只和 f(i-1) 相关,于是我们可以只用一个变量 pre 来维护当前 f(i) 的 f(i-1)的值是多少,从而让空间复杂度从O原创 2021-02-26 17:08:28 · 113 阅读 · 0 评论 -
Leetcode每日一题2021.2.26第38题:外观数列
题目描述示例算法:双指针首先定义变量 pre 记录前一项,初始化为空字符串;定义变量 cur 记录当前项,初始化为 ‘1’(第一项为1)。定义双指针 start,end 均指向序列项的头部,这里用于统计元素出现的次数。由于给定的 n>=1,这里由第2项开始逐项对前一项进行描述(注意:要将 cur 赋值给 pre,并初始化 cur 为空字符串,重新拼接得到当前项):- 从左往右遍历 pre,当元素相同时,移动 end 指针,直至元素不相同时,那么此时 end - start 就是相同原创 2021-02-26 14:25:14 · 64 阅读 · 0 评论 -
Leetcode每日一题2021.2.26第35题:搜索插入位置
题目描述示例代码class Solution: def searchInsert(self, nums: List[int], target: int) -> int: return len([i for i in nums if i < target])原创 2021-02-26 13:40:49 · 94 阅读 · 0 评论 -
Leetcode每日一题2021.2.25第28题:实现 strStr()
题目描述示例方法一:字串逐一比较 - 线性时间复杂度 O((N-L)L)思路:设 needle 的长度为 L, 对 haystack 沿着字符串逐步移动长度为 L 的滑动窗口,将窗口内的子串与 needle 比较。代码:class Solution: def strStr(self, haystack: str, needle: str) -> int: L, n = len(needle), len(haystack) if L == 0:原创 2021-02-26 01:13:37 · 222 阅读 · 0 评论 -
Leetcode每日一题2021.2.25第27题:移除元素
题目描述示例方法:双指针算法:令快、慢指针 j 和 i 都从0出发,当 nums[j] == val 时,什么都不做,快指针 j 继续向右移当 nums[j] != val 时,将快指针 j 找到的不是val的值放在 nums 的 慢指针 i 所指的位置 , 慢指针 i 向右移一步直到快指针 j 到达数组 nums 的末尾为止。代码:class Solution: def removeElement(self, nums: List[int], val: int) ->原创 2021-02-25 23:30:50 · 113 阅读 · 0 评论 -
Leetcode每日一题2021.2.25第26题:删除排序数组中的重复项
题目描述示例方法:双指针法算法:数组完成排序后,我们可以放置两个指针 i 和 j ,其中 i 是慢指针,而 j 是快指针。只要 nums[i] = nums[j] ,我们就增加 j 以跳过重复项。当我们遇到 nums[j] != nums[i] 时,跳过重复项的运行已经结束,因此我们必须把它(nums[j])的值复制到 nums[i+1]。然后递增 i ,接着我们将再次重复相同的过程,直到 j 到达数组的末尾为止。代码:class Solution: def removeDupl原创 2021-02-25 22:38:56 · 74 阅读 · 0 评论 -
Leetcode每日一题2021.2.25第21题:合并两个有序链表
题目描述示例方法一:递归思路:我们可以如下递归定义两个链表里的 merge 操作(忽略边界情况,比如空链表等):if list1[0] < list2[0] then list1[0] + merge(list1[1], list2)otherwise list2[0] + merge(list1, list2[1])也就是说,两个链表头部值较小的一个节点与剩下元素的 merge 操作结果合并。算法:我们直接将以上递归过程建原创 2021-02-25 22:13:42 · 129 阅读 · 0 评论 -
Leetcode每日一题2021.2.25第14题:最长公共前缀
题目描述示例思路方法一:横向扫描写一个lcp函数,找两个字符串的最长公共前缀。依次遍历字符串数组中的每个字符串,对于每个遍历到的字符串,更新最长公共前缀,遍历完之后,就得到整个字符串数组的最长公共前缀。当遍历的过程中,最长公共前缀被更新成空时,即说明整个数组都不会存在最长公共前缀,直接返回空字符串。class Solution: def longestCommonPrefix(self, strs: List[str]) -> str: if not strs:原创 2021-02-25 20:16:22 · 206 阅读 · 0 评论 -
Leetcode每日一题2021.2.25第13题:罗马数字转整数
题目描述示例思路通过观察,我们发现:两个字符中,左字符 < 右字符时,= 右边的字符数 - 左边的字符数左字符 >= 右字符时,= 右边的字符数 + 左边的字符数算法我们将对应关系用 {字符:数值}的形式存在 Roman2Int 的哈希表中,然后从左到右遍历每个字符,如果 s[i] < s[i+1] ,就将结果减去 s[i] 代表的数字;否则,将结果加上 s[i] 代表的数字。并且最后一个字符代表的数字是一定得加在结果里的。代码class Solution:原创 2021-02-25 17:19:56 · 135 阅读 · 0 评论 -
Leetcode每日一题2020.2.25第1160题:拼写单词
代码class Solution: def countCharacters(self, words: List[str], chars: str) -> int: chars_cnt = collections.Counter(chars) ans = 0 for word in words: word_cnt = collections.Counter(word) if all([word_cn原创 2021-02-25 15:51:21 · 47 阅读 · 0 评论 -
Leetcode每日一题2021.2.25第687题:最长同值路径
题目描述示例思路我们可以将任何路径看作是两个从其根延伸出的箭头,且最多只有两个箭头。对于每个节点,我们想知道 向左延伸的最长箭头和向右延伸的最长箭头是什么?我们可以用递归来解决这个问题。算法令 arrow_length(node) 为从节点 node 延伸出的最长箭头的长度。如果 node.left 存在且与节点 node 具有相同的值,则该值就会是 1+ arrow_length(node.left)。在 node.right 存在的情况下也是一样。当我们计算箭头长度时,候选答案 sel原创 2021-02-25 15:08:31 · 88 阅读 · 0 评论 -
Leetcode每日一题2021.2.25第867题:转置矩阵
867.转置矩阵方法一:class Solution: def transpose(self, matrix: List[List[int]]) -> List[List[int]]: m , n = len(matrix), len(matrix[0]) # 原矩阵是m*n大小的 transposed = [[0] * m for _ in range(n)] # 转置矩阵是n*m大小的 for i in range(m):原创 2021-02-25 13:27:05 · 88 阅读 · 0 评论 -
Leetcode每日一题2020.11.23第452题:用最少数量的箭引爆气球
题目描述示例思路、算法及代码实现首先我们随机发射出一支箭,看看它能射中几个气球,如图1-1所示,此时能射中黄、蓝、绿这三个气球。其次,我们将箭的发射位置(即路径)向右移,原本完好的红色气球被引爆,此时我们可以射中红、黄、蓝、绿,这四个气球了。在这个情况下,人性的贪念就暴露出来了,我们想继续向右移,希望能射中更多的气球,但不希望我们原本能射中的气球变少,这就是所谓的贪心算法。基于我们的贪心,我们就想要知道在保证能射中的气球数量最多的情况下,能右移的最远距离。如图1-3所示,这个最远距离是到蓝色原创 2021-01-02 15:25:02 · 249 阅读 · 1 评论 -
Leetcode每日一题2020.11.22第242题:有效的字母异位词
题目描述示例思路、算法及代码实现题目要求可以简化为:字符串 s 和 t 中每个字母出现的次数一致时,返回 True ,否则,返回False。本题难度为简单,如果用的是Python的话,可以直接调用 collections 模块的 Counter 方法,只需一行代码即可。import collectionsclass Solution: def isAnagram(self, s: str, t: str) -> bool: return collections.原创 2021-01-01 15:28:40 · 97 阅读 · 0 评论 -
Leetcode每日一题2020.11.20第147题:对链表进行插入排序
题目描述示例思路、算法及代码实现插入排序的基本思想是,维护一个有序序列,初始时有序序列只有一个元素,每次将一个新的元素插入到有序序列中,将有序序列的长度增加1,直到全部元素都加入到有序序列中。如果是数组的插入排序,则数组的前面部分是有序序列,每次找到有序序列后面的第一个元素(待插入元素)的插入位置,将有序序列中的插入位置后面的元素都往后移动一位,然后将待插入元素置于插入位置。对于链表而言,插入元素时只要更新相邻节点的前后指针即可,不需要像数组一样将插入位置后面的元素往后移动。对于单向列表原创 2020-12-31 14:02:55 · 82 阅读 · 0 评论 -
Leetcode每日一题2020.11.19第283题:移动零
题目描述示例思路、算法及代码实现要把0移动到数组的末尾,还不能改变非0数字的相对位置,而且必须在原数组上进行操作。基于这些要求,我们原创 2020-12-31 11:54:35 · 78 阅读 · 0 评论 -
Leetcode每日一题2020.11.18第134题:加油站
题目描述示例思路、算法及代码实现首先,我们看完题后,想到的方法一定是暴力遍历法,即从头到尾遍历每个加油站,并检查以该加油站为起点,最终能否行驶一周。但其实如果我们发现一个逻辑上的小性质的话,就可以只遍历一次。我们在推理这个性质的过程中,先不考虑“油不能为负数”这个限制,设消耗[i]=gas[i]-cost[i],当消耗[i]越小,说明耗油越多,我们在唯一一次遍历过程中,找到sum(消耗)最小的那一点。说明从头到...原创 2020-12-28 10:36:04 · 105 阅读 · 0 评论 -
Leetcode每日一题2020.11.17第1030题:距离顺序排列矩阵单元格
1030.距离顺序排列矩阵单元格题目描述示例知识点1:桶排序算法举例:有8个数 3 6 2 7 9 8 1 1,申请一个9位的数组int a[9],初始化所有a[i]的值为0,然后3出现一次,就把a[3]的值加1最后的结果是 a[3] = 1 ; a[6] = 1…;a[1] = 2 ,然后遍历,得到a[i]的值,把i输出a[i]遍即可。知识点2:collections模块及其中的defaultdict(默认字典)方法collections模块包含了集合相关的所有模块,它为开发者提供了一系原创 2020-11-18 15:39:38 · 82 阅读 · 0 评论 -
Leetcode每日一题2020.11.15第402题:移掉K位数字
402.移掉K位数字题目描述思路、算法及代码实现贪心+单调栈:对于两个相同长度的数字序列,最左边不同的数字决定了这两个数字的大小,例如,对于A=1axxx,B=1bxxx,如果a>b则A>B。基于此,我们可以知道,若要使得剩下的数字最小,需要保证靠前的数字尽可能小。基于上述分析,我们可以得出“删除一个数字”的贪心策略:给定一个长度为n的数字序列[D0D1D2D3…Dn-1],从左往右找到第一个位置i(i>0)使得Di<Di-1,并删去Di-1;如果不存在,说明整个数原创 2020-11-18 13:32:13 · 118 阅读 · 0 评论 -
Leetcode每日一题2020.11.13第328题:奇偶链表
328.奇偶链表题目描述思路、算法及代码实现方法:分离节点后合并如果链表为空,则直接返回链表。对于原始链表,每个节点都是奇数节点或偶数节点。头节点是奇数节点,头节点的后一个节点是偶数节点,相邻节点的奇偶性不同。因此可以将奇数节点和偶数节点分离成奇数链表和偶数链表,然后将偶数链表连接在奇数链表之后,合并后的链表即为结果链表。原始链表的头节点head也是奇数链表的头节点以及结果链表的头节点,head的后一个节点是偶数链表的头节点。令evenHead = head.next,则evenHead是偶原创 2020-11-17 21:42:26 · 314 阅读 · 0 评论 -
Leetcode每日一题2020.11.12第922题:按奇偶排序数组Ⅱ
922.按奇偶排序数组Ⅱ题目描述思路、算法及代码实现方法一:定义两个空列表odd[]和even[]分别存放奇数和偶数,再轮流将odd[]、even[]里的数放入结果列表res[]中。方法二:定义两个空列表odd[]和even[]分别存放本来应该是奇数、偶数的A[]的元素位置索引,最后交换奇、偶数。...原创 2020-11-17 18:19:05 · 106 阅读 · 0 评论 -
Leetcode每日一题2020.11.11第222题:完全二叉树的节点个数
222.完全二叉树的节点个数题目描述知识点:完全二叉树 在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第h层,则该层包含1~2^h个节点。思路、算法及代码实现...原创 2020-11-17 17:37:17 · 122 阅读 · 0 评论 -
Leetcode每日一题2020.11.10第31题:下一个排列
31.下一个排列题目描述知识点:字典序 和字典的排序法相同,对于字符串而言,先按第一个字符排序,如果首字母相同,则按第二个字符排序,以此类推。 本题情况下,以数字序列[1,2,3]为例,其排列按照字典序依次为: [1,2,3] [1,3,2] [2,1,3] [2,3,1] [3,1,2] [3,2,1] 特别的,最大的排列[3,2,1]的下一个排列为最小的排列[1,2,3]。思路、算法及代码实现 方法一:两遍扫描 注意到下一个排列总是比原创 2020-11-17 09:34:10 · 124 阅读 · 0 评论 -
Leetcode每日一题2020.11.09第7题:整数反转
7.整数反转题目描述示例思路、算法及代码实现原创 2020-11-09 20:05:17 · 67 阅读 · 0 评论