自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(94)
  • 收藏
  • 关注

原创 算法技巧之滑动窗口

在算法题目中,经常会遇到给定一个数组,找出符合某种特性的连续子数组。这时候可以采用滑动窗口的方法。例如,给定数组A = [1,1,3,2,1,0,2],找出满足和小于等于5的最长连续子数组。采用暴力的方法,需要用一层循环枚举子数组的起始位置,然后用第二层循环枚举子数组的长度,时间复杂度为O(N^2)。采用滑动窗口的方式即可将算法复杂度降到O(N)。其核心思想是,采用两个指针,分别指...

2020-02-17 22:06:32 1164 1

原创 算法技巧之计算二维数组区域和

在做算法题目的过程中,经常会遇到二维数组的题目,并且要以二维数组的任意矩形区域的和作为先验知识来进行之后的推算。例如:已知大小M*N的矩阵A,求矩阵内任意矩形区域的和。如果采用暴力搜索的方式,则需要O(M^2N^2)的时间复杂度,即需要枚举矩形的左上坐标和右下坐标。采用前缀数组的方式则可以在O(MN)的时间复杂度下得到结果。前缀数组P:大小为M*N,P[i][j]表示为以(0,0)为左...

2020-02-13 18:03:14 1422

原创 Leetcode 171周赛

第一次参加周赛,共有4题,一个半小时。一题easy,两题medium, 一题hard。ac了前三题。1. 是将整数转换成两个无零整数的和。这题的关键是如何判断一个整数有没有零。此处本人是采用将整数转换成string类型来查找有没有'0'字符。2. 此题的意思是给定a,b,c三个数,看a,b的二进制最少翻转几次能使得或运算变成c。由于是在二进制上面进行操作,所以首先要转换成二进制表示。遍历c...

2020-01-12 20:39:52 177

原创 Leetcode 495

此题主要是根据中毒时间序列以及每次毒持续多少时间,来计算出总的中毒时间为多少。主要分两种情况,一种是在中毒结束前下一次中毒还没有到来,另一种是在中毒结束前就来了新的中毒。假设新来的中毒时间点为 point, 那么前者总的中毒时间需要加上 duration, 后者则需要加上 point - start。此外在遍历时需要不断的更新中毒的时间,以及中毒结束的时间,以此来判断新的中毒来的时侯是不是正处于中...

2020-01-09 08:50:11 291

原创 Leetcode 238

此题想要返回的是一个数组中每个元素除自身以外其他元素的乘积,并且不能使用除法操作。要求O(n)的时间复杂度,我们可以梳理一下,对于一个数组而言,采用O(n)的时间复杂度可以得到哪些东西:最大最小值均值求和,每个位之前的求和求最大最小和均值。正是使用这些O(n)能够得到这些最基本的信息,来构建整个题目的解。一开始我采用的是类似递归的思想来进行求解,发现这样做会使得复杂度更高。我们将整个问题拆分,既然...

2019-12-26 11:21:15 123

原创 Leetcode 11

此题是一道非常经典的算法题。给定一系列高度的横线,算其所能围成的盛水容器的面积最大多少。可以直观地发现整个盛水面积是与两个横线之间的距离以及他们的最小高度决定的。一个非常直观的想法是遍历两两线段,取最大的面积,但是这样做很明显是超时的,所以一定有更加简单的方法来处理,也就是有一些情况是不需要考虑的。由于暴力遍历的时间复杂度是O(n^2),由于二分的方式并不明显,所以考虑O(n)复杂度的算法。...

2019-12-24 21:17:17 363

原创 Leetcode 343

此题的子结构还是非常容易发现的,给定一个正整数,将其划分成n个正整数之和,使其的乘积最大。一种直观的子结构就是 遍历1到n,把max(i * dp(n-i))找到。其中一个小陷阱是,由于在做dp的时候默认n-i是一定要划分成多个部分的,所以就忽略了i * (n-i)这种情况,所以我们在遍历的时候还需要考虑i*(n-i)的结果是不是最优的,代码如下:class Solution(object)...

2019-12-16 13:10:21 199

原创 leetcode 116

本题想要将树内部的节点连接起来。这题的想法可以用BFS得到每层的节点,然后相连。也可以用DFS递归的方式去做。本人采用递归的方式处理该问题。为了能够进行内部连接,我们需要额外得到每棵树的最左边一排节点和最右边一排节点。因此重新定义函数额外返回这两个信息,然后将左子树的最右侧节点和右子树最左侧的节点相互连接,这样就可以得到最后我们的想要的结果。代码如下:"""# Definition f...

2019-11-13 12:57:59 145

原创 leetcode 98

此题是想要判断一棵树是不是一个二叉搜索树,由于天然的子问题结构,所以采用递归的方式来判断,每次额外得到每棵树的最大最小值来辅助判断是不是满足条件,由于root==none的时候需要设置default value,这个value不太好设置还需要额外判断,所以人为列出了root.right == None和root.left ==None的请况。代码如下:# Definition for a...

2019-11-09 22:45:08 139

原创 Leetcode LCP 1

超级水题代码如下:class Solution(object): def game(self, guess, answer): """ :type guess: List[int] :type answer: List[int] :rtype: int """ sum=0 ...

2019-11-08 22:38:50 123

原创 Leetcode 113

此题是给定目标想要找到从root到leaf的路径使得和为target。这题的递归划分很明显,就是左右子树然后和target-root.val。此外学习到一个小trick,就是在list中添加任意位置值的时候可以用list.insert(index, val)。代码如下:# Definition for a binary tree node.# class TreeNode(object...

2019-11-03 15:38:42 226

原创 Leetcode 559

水题,递归遍历childern,判断高度最大的那个返回即可。代码如下:"""# Definition for a Node.class Node(object): def __init__(self, val, children): self.val = val self.children = children"""class Soluti...

2019-11-01 20:49:10 194

原创 leetcode 105

这题和之前根据后序遍历和中序遍历找树的题目一样,都是根据前序或者后序来找到根节点的值,然后再根据中序遍历找到root,从而将左右子树进行划分,然后递归的进行求解。代码如下:# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):# self.va...

2019-10-31 19:55:53 385

原创 Leetcode 104

水题,代码如下:# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution(obj...

2019-10-30 22:12:57 182

原创 Leetcode 100

划水题,如果两个树root相同,则递归判断左右子树是否相同,否则返回False.代码如下:# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):# self.val = x# self.left = None# ...

2019-10-29 21:10:34 177

原创 Leetcode 102

此题很简单,就是BFS,在遍历的时候加个标记,记录一下深度信息就好啦代码如下:# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):# self.val = x# self.left = None# self...

2019-10-28 15:15:24 228

原创 leetcode 279

此题的想法也是递归,就是想如何拆分成子问题。由于子问题大量重复,所以定义个数组来记录一下中间的结果,也就是记忆化dp。子问题很好定义,给定一个数,我们找它所对应的最大平方根整数。那么对于该数所对应的所有结果,都是1到这个最大平方根内的所有数j的平方+self.numSquares(n - j**2)。那么只需要遍历一下,找到最小的返回即可。代码如下:class Solution(obje...

2019-10-27 10:20:51 121

原创 leetcode 1026

此题是想找到根节点和子节点的最大差值。关键是要找到子结构。可以发现最大差值是由每个子树的最大值和最小值决定的。因此我们新建一个函数,返回最大差值以及最大值最小值。当返回更上一层时,我们就可以更新这些值,并且根据最大最小值重新计算最大差值。代码如下:# Definition for a binary tree node.# class TreeNode(object):# de...

2019-10-25 10:55:08 204

原创 leetcode 547

这题的大致意思是看看相互连通的子部分有多少个。这种题目的思想个人觉得都是用queue实现BFS的想法类似,都是把邻居先保存起来,逐层遍历。对于这题我们需要保存一个标识符,用于判断是否访问过,如果queue空了,我们再加入没有访问过的新的结点,同时计数器加一。代码如下:class Solution(object): def findCircleNum(self, M): ...

2019-10-24 11:46:48 121

原创 leetcode 515

此题想要找到树中每一行的最大值,采用递归的方式去做。在子问题合并的时候依次遍历list,将更大的那个值保留下来,由于左右子树可能不等高,所以需要把更高的那个子树剩下的值在加进去,有点像排序时合并的操作。代码如下:# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x...

2019-10-23 15:26:43 130

原创 leetcode 1123

此题的意思可以概括为有一堆最深的叶子节点,这些叶子节点的公共子节点是谁。可以看到在递归的过程中需要记录一下树的深度。因此新建一个函数,返回值不光有结果,还有对应的子树深度。首先分析几个特殊情况,很简单不再赘述。对于一般情况则是得到两个子树的高度,如果其中一个子树比另一个高,那么只需要返回高的那个子树的结果,因为我们只想要最深的叶子节点的公共父亲。如果两个子树的高度一样高,说明这两个子树都有着最深的...

2019-10-22 23:25:47 222

原创 leetcode 207

此题想法非常简单,就是用拓扑排序,如果能够排完,则存在一个有序的排列,否则的话就有循环。代码如下:class Solution(object): def canFinish(self, numCourses, prerequisites): """ :type numCourses: int :type prerequisites: L...

2019-10-20 20:21:13 197

原创 leetcode 129

这题想要找到所有的从根节点到叶子节点顺出来的值的总和。此题采用传统的递归方法,但是有两个坑值得注意,首先我们在递归时应该保存的是字符串,而不是数值,因为如果是数值的话,需要知道树的高度,树的左右子树高度不同,对应着加的root.val的幂次就不同。但是当向上层返回高度时,就不知道返回哪个高度了,所以不可行。其次递归的最底层应该从 有数值的开始,而不是None开始。这是因为如果从None开始,相当于...

2019-10-19 16:27:11 148

原创 leetcode 841

此题想要根据每个房间的钥匙来走到下一个房间,接着去开其他房间。我的做法是采用类似于BFS的形式用一个队列来遍历所有的房间,如果这个房间走过了就标识为走过,如果没有,则不标识。最后看看是不是全部都走过了。此题较简单,主要就是采用一个队列的方式来遍历房间。代码如下:class Solution(object): def canVisitAllRooms(self, rooms): ...

2019-10-18 18:06:42 124

原创 Leetcode 199

此题较简单,因为子问题比较好找。 题目的意思想要找到最右侧的所有节点的值。可以想到子问题就对应着左右子树,关键是合并的时候要怎么做。首先root节点的值肯定是放在第一个的,其次假设左右子节点对应的链表都知道了,因为要找最右边的,所以右子树的值在一个个放进去,因为相比于左子树,肯定右子树的最右边值在最右边。当右子树放完后,看看左子树更深的地方还有没有值,如果有再加进去。# Definition...

2019-10-17 20:34:47 239

原创 leetcode 979

mark,这题没做出来。题目意思是给定一棵树,每个节点都有一个数字,代表星星的数量,最少需要移动多少次能够使得每个节点上面的星星数量都为1。这题的关键是考虑想要定义的递归函数的意义是什么。我们将问题进行分解,一共需要移动多少次,其实等价于每个节点出去或进来的次数的总和。那么我们就可以定义递归函数为针对该节点其出去或进来的次数。这个次数就相当于左右节点的次数 加上 root.val -1。其中 ...

2019-10-16 21:21:43 169

原创 leetcode 106

此题为根据中序遍历和后序遍历构造树。是一道经典题目,采用递归的方法。首先根据后序遍历的性质可以得知,后序遍历的最后一个值一定是根节点。因此我们找到根节点在中序遍历的位置,根据中序遍历的性质可以得知,根节点所在位置的左边全都是根节点的左子树,右边则全部都是根节点的右子树。因此我们可以根据这样一个基本的想法进行递归实现。在实现的过程中遇到了一个小问题,就是当递归求解的时候,我们需要将整个list划...

2019-10-15 20:52:30 286

原创 LeetCode 114

mark,好题目! 题目要求将一个二叉树按照前序遍历的方式展开成一个新树,要求就在此棵树上面进行修改,也就是不能占用额外的空间。递归是直观的解法,但是会占用额外的存储空间,因为每一层递归都会保留左右子树相关的信息,空间复杂度不是常数。可以发现,右子树的所有节点都一定在左子树最右边节点的后面!所以该题的核心关键所在就是每次找到左子树中最右边的那个节点,将整个右子树放到该节点的右边。然后再把左子树...

2019-10-14 21:53:40 310

原创 LeetCode 513

此题要找到一个二叉树最后一行的最左边的值。由于是树状结构,通常采用递归的方式去求解。因为我们想要得到最深处的最左边的值,所以在返回值的同时,还需要记录一下左右子树的深度,来帮助判断哪边才是我们需要的值。因此重新定义个函数depthAndValue,该函数返回目标值和当前这棵树的深度。此时分情况讨论,当左右都没有子树的时候,肯定返回自身值,以及深度为1。当只有左子树的时候,则递归遍历root.l...

2019-10-13 18:02:32 183

原创 leetcode 477

这题技巧题,没做出来。越到正确率低的题,发现自己被大神的解法秀的头晕。这题是给一组数字,求它们两两之间hamming distance之和。当然,萌新做法是遍历每一对数字,求出它们的hamming distance,然后再求和得到结果。coding的时候都是虚的,因为想到了这题怎么可能会让用那么low的方法。最后看了大神的解答后,才恍然大悟。正确的解法应该是针对每一个bit位,统计所有数字在这个b...

2018-09-27 09:38:15 291

原创 leetcode 860

今天太累了,刷道简单的拉倒吧。这题的思想很简单,就是利用两个变量来表示剩余的5块和10块的数量。此外还有一点就是对于20的,优先找10快和5快的,如果没有,再找3个5快的。因为5快的还可以找10快的。附代码:class Solution:    def lemonadeChange(self, bills):        """        :type bills: List[int...

2018-09-20 19:45:23 210

原创 leetcode 712

这题是个好题目,mark一下。首先我的思路是求这两个字符串的最长公共子序列,然后遍历这些子序列,找到值最小的那个。结果想了一下,最长子序列不唯一,这样回溯特别复杂,这题应该不是这样做(今天太忙,明天要把最长子序列的长度及回溯实现一下)。后来看了答案才知道是用动态规划来做。说实话,动态规划现在对于我而言,还是不太能掌握的东西,因为很多时候想不到如何很好地定义dp数组的含义,还需要多加联系。dp最...

2018-09-19 19:59:57 478

原创 leetcode 756

这题的思路比较清晰。主要就是用一个字母来代替两个字母,递归代替,最后看能不能只剩下一个字母。后来发现我其实是用的是BFS,所以这题也可以用DFS。(昨天搞竞赛忘了发。。。)附代码:class Solution:    def pyramidTransition(self, bottom, allowed):        """        :type bottom: str    ...

2018-09-19 16:21:52 453

原创 leetcode 648

这题思路很简单,首先要把句子分成一个个词,然后看词的前面是不是有和root相同的,取最小的那个替换就好。discuss答案太秀,我觉得没有啥学习的必要。附代码:class Solution:    def replaceWords(self, dict, sentence):        """        :type dict: List[str]        :type se...

2018-09-17 21:16:38 366

原创 leetcode 347

这个题目虽然不够新,但是还是需要mark一下,解决了我的一些误区。这题的想法很简单,就是需要统计一下数字出现的频率,然后排个序,输出前K个,就Ok了。但是要求复杂度小于nlgn。想了半天,觉得一定要排序呀,后来看了discuss才发现,自己忘了bucket sort。一个典型的牺牲空间换时间的算法。主要就是列出一个足够长的数组,把数字按照频率放在对应的位置上面。最后再从后向前遍历一遍,就得到结果了...

2018-09-17 09:27:08 168

原创 leetcode 817

这题思路挺简单,但是我Error了太多次!!首先我想就是记录每个数字的后面一个数字,然后类似于跳着查找这样的方式,将走过的数字的标志变为1,直到结束,后来超时了。突然发现与顺序无关,那么如果在G中标志为1,不在G中标志为0,不就变成找一个列表当中有多少个1的团吗。后来结果又超时了,我还以为是用了两个独立的循环导致的,最后把他们写在一起,结果还是超时。我TM就纳闷了,为啥我复杂度都是O(n)你这个还...

2018-09-16 19:54:40 213

原创 leetcode 451

这题没啥好说的,统计出来字符的频率,然后排个序,最后输出就ok了。       对于dict的排序还是需要学习一下的,temp = sorted(dist.items(),key = lambda x:x[1],reverse = True),首先要明确的是返回的是一个二维list。如果按照value排序,那么key = lambda x:x[1],如果按照key排序,那么key = lamb...

2018-09-15 09:03:13 338

原创 leetcode 508

这题的思路比较简单,主要是递归得到每个子树的和,然后统计这些和哪些出现的频率最高,最后输出即可。# Definition for a binary tree node.# class TreeNode:#     def __init__(self, x):#         self.val = x#         self.left = None#         self.r...

2018-09-14 09:45:18 223

原创 leetcode 858

此题是技巧题,挺有意思的。题目主要是说镜子反射的问题,这题花费的比较长的时间。建议可以先手动画一画找找规律,我们可以很容易推导得到从侧面经过上下底面返回到第一个侧面的时候,距离最近点的初始距离是q- p %q,这个可以通过斜率不变以及相似三角形的性质推导得到。知道这一点之后,我们需要考虑的只有方向的问题,我们可以设置两个bool变量,来表示在上下,和在左右,我们可以很容易知道每次碰到上下面的时候,...

2018-09-13 21:16:23 232

原创 leetcode 781

这题挺有意思的,是技巧题。因为每个兔子能看到和他相同的颜色的兔子,那么我们可以知道如果这两只兔子相同,那么他们看到的其他颜色一样的兔子的数量一定是一样的。这样的话,也就是说如果一个兔子看到的数量和其他兔子不一样,那么这只兔子就一定是其他颜色的,那么结果就应该加上这只兔子看到的数量再加上它本身。这时候我们需要考虑看到相同兔子数量的情况,这里面也是很tricky,设想一下如果出现了1,1,1。这时候的...

2018-09-12 22:02:21 362

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除