- 博客(58)
- 收藏
- 关注
原创 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
225
原创 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
230
原创 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
177
原创 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
172
原创 Leetcode每日一题2021.3.11第110题:平衡二叉树
题目描述示例思路及算法根据题目的定义,一棵二叉树是平衡二叉树,当且仅当所有子树也都是平衡二叉树,因此可以使用递归的方式判断二叉树是不是平衡二叉树,递归的顺序可以是自顶向下或者自底向上。方法一:自顶向下的递归定义函数 height,用于计算二叉树中的任意一个节点 p 的高度:有了计算节点高度的函数,即可判断二叉树是否平衡。具体做法类似于二叉树的前序遍历,即对于当前遍历到的节点,首先计算左右子树的高度,如果左右子树的高度差不超过1,再分别递归地遍历左右子节点,并判断左子树和右子树是否平衡。这
2021-03-11 12:15:42
253
原创 Leetcode每日一题2021.2.28第108题:将有序数组转换为二叉搜索树
题目描述示例思路二叉搜索树的中序遍历是升序序列,题目给定的数组是按照升序排序的有序数组,因此可以确保数组是二叉搜索树的中序遍历序列。但是,给定二叉搜索树的中序遍历,也不能唯一地确定二叉搜索树。如果没有要求二叉搜索树地高度平衡,则任何一个数字都可以作为二叉搜索树的根节点,因此可能的二叉搜索树有多个。如果增加一个限制条件,即要求二叉搜索树的高度平衡,也仍然无法唯一地确定二叉搜索树。直观地看,我们可以选择中间数字作为二叉搜索树的根节点,这样分给左右子树的数字个数相同或只相差1,可以使得树保持
2021-03-11 10:28:55
192
原创 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
186
原创 Leetcode每日一题2021.2.28第101题:对称二叉树
题目描述示例方法一:递归思路和算法如果一个树的左子树与右子树镜像对称,那么这个树是对称的。如果同时满足下面的条件,两个树互为镜像:它们的两个根节点具有相同的值每个树的右子树都与另一个树的左子树镜像对称我们可以实现这样一个递归函数,通过【同步移动】两个指针的方法来遍历这棵树,p指针和q指针一开始都指向这棵树的根,随后p右移时,q左移;p左移时,q右移。每次检查当前p和q节点的值是否相等,如果相等再判断左右子树是否对称。代码# Definition for a binary tre
2021-02-28 20:37:23
221
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
220
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
177
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
121
原创 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
186
原创 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
124
原创 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
146
原创 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
118
原创 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
164
原创 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
108
原创 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
171
原创 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
321
原创 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
203
原创 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
125
原创 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
175
原创 Leetcode每日一题2021.2.25第14题:最长公共前缀
题目描述示例思路方法一:横向扫描写一个lcp函数,找两个字符串的最长公共前缀。依次遍历字符串数组中的每个字符串,对于每个遍历到的字符串,更新最长公共前缀,遍历完之后,就得到整个字符串数组的最长公共前缀。当遍历的过程中,最长公共前缀被更新成空时,即说明整个数组都不会存在最长公共前缀,直接返回空字符串。class Solution: def longestCommonPrefix(self, strs: List[str]) -> str: if not strs:
2021-02-25 20:16:22
326
原创 Leetcode每日一题2021.2.25第13题:罗马数字转整数
题目描述示例思路通过观察,我们发现:两个字符中,左字符 < 右字符时,= 右边的字符数 - 左边的字符数左字符 >= 右字符时,= 右边的字符数 + 左边的字符数算法我们将对应关系用 {字符:数值}的形式存在 Roman2Int 的哈希表中,然后从左到右遍历每个字符,如果 s[i] < s[i+1] ,就将结果减去 s[i] 代表的数字;否则,将结果加上 s[i] 代表的数字。并且最后一个字符代表的数字是一定得加在结果里的。代码class Solution:
2021-02-25 17:19:56
187
原创 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
96
原创 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
145
原创 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
142
原创 Leetcode每日一题2020.11.23第452题:用最少数量的箭引爆气球
题目描述示例思路、算法及代码实现首先我们随机发射出一支箭,看看它能射中几个气球,如图1-1所示,此时能射中黄、蓝、绿这三个气球。其次,我们将箭的发射位置(即路径)向右移,原本完好的红色气球被引爆,此时我们可以射中红、黄、蓝、绿,这四个气球了。在这个情况下,人性的贪念就暴露出来了,我们想继续向右移,希望能射中更多的气球,但不希望我们原本能射中的气球变少,这就是所谓的贪心算法。基于我们的贪心,我们就想要知道在保证能射中的气球数量最多的情况下,能右移的最远距离。如图1-3所示,这个最远距离是到蓝色
2021-01-02 15:25:02
350
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
144
原创 Leetcode每日一题2020.11.20第147题:对链表进行插入排序
题目描述示例思路、算法及代码实现插入排序的基本思想是,维护一个有序序列,初始时有序序列只有一个元素,每次将一个新的元素插入到有序序列中,将有序序列的长度增加1,直到全部元素都加入到有序序列中。如果是数组的插入排序,则数组的前面部分是有序序列,每次找到有序序列后面的第一个元素(待插入元素)的插入位置,将有序序列中的插入位置后面的元素都往后移动一位,然后将待插入元素置于插入位置。对于链表而言,插入元素时只要更新相邻节点的前后指针即可,不需要像数组一样将插入位置后面的元素往后移动。对于单向列表
2020-12-31 14:02:55
146
原创 Leetcode每日一题2020.11.19第283题:移动零
题目描述示例思路、算法及代码实现要把0移动到数组的末尾,还不能改变非0数字的相对位置,而且必须在原数组上进行操作。基于这些要求,我们
2020-12-31 11:54:35
141
原创 用Python3调用百度AI和图灵机器人实现一个智能(bushi)AI聊天机器人
题目看起来高大上,但其实这只是假象。关键是要理清思路和流程,掌握了这个之后,整个项目基本就简化成了“傻瓜”项目,对编程能力的要求较低。
2020-12-29 16:49:52
1402
5
原创 Numpy基础学习笔记2020.12.28
重在数值计算数组和列表的区别:1、列表可以存不同类型的数据;数组必须存同一类型的数据2、优先级:字符串 > 浮点型 > 整型创建numpy数组的三种方法:1、各种已封装好的基础矩阵zeros()、ones()、linespace()、arange()、random()import numpy as npnp.zeros((3,4))array([[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]
2020-12-28 14:00:21
185
原创 机器学习之概述
概述训练样本特征抽取:把人类能够理解的信息转化为机器能够理解的东西学习函数预测用到的一些工具Numpy:科学计算库Pandas:数据分析处理库Matplotlib:数据可视化库Scikit-learn:机器学习库(包含了机器学习的很多算法)用Anaconda安装包...
2020-12-28 12:28:12
124
原创 Leetcode每日一题2020.11.18第134题:加油站
题目描述示例思路、算法及代码实现首先,我们看完题后,想到的方法一定是暴力遍历法,即从头到尾遍历每个加油站,并检查以该加油站为起点,最终能否行驶一周。但其实如果我们发现一个逻辑上的小性质的话,就可以只遍历一次。我们在推理这个性质的过程中,先不考虑“油不能为负数”这个限制,设消耗[i]=gas[i]-cost[i],当消耗[i]越小,说明耗油越多,我们在唯一一次遍历过程中,找到sum(消耗)最小的那一点。说明从头到...
2020-12-28 10:36:04
148
原创 Matplotlib基础学习笔记
import matplotlib.pyplot as plt1、figure():创建图表2、subplot():创建子图 子图的序号排序顺序是:从左到右,从上到下,逐次增加13、在多个表中创建子图4、plot():画函数图像2、subplot():创建子图 子图的序号排序顺序是:从左到右,从上到下,逐次增加13、在多个表中创建子图4、plot():画函数图像plt.plot(x,y)5、sca():选择子图plt.sca(ax1)6、在一张表中画多个曲线for i in
2020-12-26 22:28:56
626
原创 Numpy基础学习笔记
重在数值计算数组和列表的区别:1、列表可以存不同类型的数据;数组必须存同一类型的数据2、优先级:字符串 > 浮点型 > 整型创建numpy数组的三种方法:1、各种已封装好的基础矩阵zeros()、ones()、linespace()、arange()、random()import numpy as npnp.zeros((3,4))array([[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]
2020-12-26 22:27:20
146
原创 Pandas基础学习笔记
import pandas as pdimport numpy as npHead与Tail- 默认显示5条数据- 也可指定显示数据的数量# 默认显示前5条series.head()# 指定显示后3条series.tail(3)属性与底层数据# 将列标签名变为小写df.columns = [x.lower() for x in df.columns].array属性用于提取Index或Series里的数据s.index.arrays.arraySeries- 是
2020-12-26 22:23:27
389
原创 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
138
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅