![](https://img-blog.csdnimg.cn/20210131150926905.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
LeetCode之路
记录小白拿Python刷题
KeEN丶X
这个作者很懒,什么都没留下…
展开
-
LeetCode灯泡开关(Python)
题目解题思路其实逻辑很简单,假设灯泡编号是 1 到 n ,对于第 i 轮,只要编号能整除 i 的灯泡都会被切换,所以根据这个思路可以写出代码:不出意外地超时了。因为没有想到的点是,对于一个数 k ,它的因子都是成对出现的(a * b = k,那么 a 和 b 都是 k 的因子),除非 k 是完全平方数。因此只需要知道 1 到 n 中有多少个完全平方数即可:...原创 2021-11-15 14:23:11 · 864 阅读 · 1 评论 -
LeetCode查找共用字符(Python)——哈希表
题目解题思路思路比较直白,记录不同word的字母哈希表并取交集即可。值得注意的是,如同示例1中,同一个字符共同出现多次也是可以的。看到题解中有一段很牛的代码:其中Counter直接取交集以及elements()方法十分便捷,而且Counter取交集与字典(或者说集合)取交集是有区别的:可以看到,Counter取交集对于相同的key不同的value会自动取更小的值,而字典直接取交集并不是这样:因此Counter的交集是直接符合题意的,而elements()生成一个迭代器:因此只需要取原创 2021-10-26 12:24:42 · 340 阅读 · 0 评论 -
LeetCode将数字变成0的操作次数(Python)——位运算
题目解题思路:将数字转为二进制后,有 a 位数就要做 a-1 次除法(最后一个1不用,比如 8 的二进制 1000,除以 2 就是右移一位,右移三位让 1 到最后,然后减去最后的1),有 b 个 1 就要做 b-1 次减法(当前面的1除以2右移到最后一位时,此时就是奇数,要减去最后的1):执行结果:...原创 2021-09-12 12:14:58 · 347 阅读 · 1 评论 -
LeetCode存在重复元素(Python)
题目题解直接巧用集合:原创 2021-04-28 17:04:53 · 130 阅读 · 0 评论 -
LeetCode反转链表(Python)
题目解题思路由于python中的 “=” 实际上是引用,所以需要import copy模块:或者直接重新创建结点:原创 2021-04-28 16:57:30 · 173 阅读 · 0 评论 -
LeetCode同构字符串(Python)
题目题解模拟这个映射的过程,将s映射成t,t映射成s,只有都映射成功时才是符合规则的双射:原创 2021-04-28 16:24:34 · 171 阅读 · 0 评论 -
LeetCode计数质数(Python)
题目解题思路暴力法:埃氏筛:原创 2021-04-28 15:32:57 · 143 阅读 · 0 评论 -
LeetCode移除链表元素(Python)
题目解题思路这里主要是如果要删除头结点要做另外的处理,而官方题解中在head结点前加入了一个哨兵结点(虚拟头结点)让问题变简单:原创 2021-04-28 14:33:35 · 125 阅读 · 0 评论 -
LeetCode快乐数(Python)
题目解题思路存储之前出现过的结果,如果再次出现同样的结果,就会进入无限循环,那么这个数就不可能是快乐数:执行结果为:看完官方题解之后,有一个地方是我没想到的:虽然第三种情况不存在,但是必须论证一下为什么不存在才行。使用 快慢指针法 可以减少一点时间复杂度:执行结果为:...原创 2020-10-14 18:24:28 · 523 阅读 · 0 评论 -
LeetCode打家劫舍(Python)——动态规划
题目解题思路简单的递归:不出意外地超时了,接下来使用之前讲过的动态规划:执行结果为:看了官方题解后,发现并不需要O(n)的额外存储空间,在计算dp[i]时只用到了dp[i-1]和dp[i-2],于是改进如下:执行结果为:...原创 2020-09-16 16:09:40 · 219 阅读 · 1 评论 -
LeetCode位1的个数(Python)——位运算
题目解题思路原创 2020-09-15 13:17:45 · 127 阅读 · 0 评论 -
LeetCode颠倒二进制位(Python)——位运算
题目解题思路首先用比较取巧的办法:执行结果为:但这道题考察的显然是位运算,这里解释一下官方题解中给出的解法:(作者:LeetCode链接:https://leetcode-cn.com/problems/reverse-bits/solution/dian-dao-er-jin-zhi-wei-by-leetcode/来源:力扣(LeetCode))可以看下每行代码干了什么,可能更好理解:有种拿充电宝给手机充电的感觉,此消彼长。...原创 2020-09-14 11:09:35 · 180 阅读 · 0 评论 -
LeetCode旋转数组(Python)
题目解题思路暴力法:每次将所有元素向右移动一位,总共移动k次。执行结果为:原创 2020-09-14 00:02:37 · 178 阅读 · 0 评论 -
LeetCode阶乘后的零(Python)
题目解题思路其实就是计算n、n-1、n-2、……、1中有几个因子5,但是比较麻烦的情况就是25有两个因子5,同理125有3个因子5、625有4个因子5,所以没办法直接得到答案,还是需要一个循环:思路的话官方题解中已经讲得比较清楚了:执行结果为:...原创 2020-09-10 19:19:39 · 158 阅读 · 0 评论 -
LeetCodeExcel表列序号(Python)
题目解题思路和168题是一样的,进制转换,思路不再赘述,直接上代码:执行结果为:原创 2020-09-10 11:31:25 · 119 阅读 · 0 评论 -
LeetCode多数元素(Python)——哈希表、投票法
题目解题思路哈希法:这里两次用到字典的get方法,第一个get(num, 0) :第二个max(nums_dict, key=nums_dict.get),首先遍历可迭代对象nums_dict,然后把返回值作为参数传递给key对应的函数nums_dict.get,将函数的执行结果传给key,返回最大的key值。执行结果为:看了官方题解之后,使用了投票法,主要就是一个互相抵消的思想:执行结果为:...原创 2020-09-10 10:59:17 · 308 阅读 · 0 评论 -
LeetCodeExcel表列名称(Python)
题目解题思路因为“AB” = “A” × ( 261 ) + “B” × ( 260 ) = 1 × ( 261 ) + 2 × ( 260 ) = 28“ZY” = “Z” × ( 261 ) + “Y” × ( 260 ) = 26 × ( 261 ) + 25 × ( 260 ) = 701所以其实这道题就是一个将 十进制 转换成 伪26进制 的问题,不同的地方在于这个26进制是从1开始的(“A” = 1)而不是从0开始的,所以满26不进位 ( “Z” = 26 ),满27才进位( “A原创 2020-09-03 13:03:06 · 157 阅读 · 0 评论 -
LeetCode两数之和Ⅱ(Python)——Hash表、双指针
题目解题思路一开始感觉跟两数之和没什么区别,只是多了一个升序排列的条件而已,所以还是先用了Hash表:执行结果为:看了官方题解,利用的是双指针,也就利用到了升序排列的条件,并且空间复杂度也降下来了:执行结果为:...原创 2020-09-02 10:30:28 · 208 阅读 · 0 评论 -
LeetCode相交链表(Python)——双指针
题目解题思路很有意思的一道题目。首先肯定可以想到的是储存遍历过的节点,做法类似141题环形链表,但是要求仅用O(1)内存去做,虽然知道要用双指针,但没想到怎么遍历。看了官方题解确实奇思妙想。p_a指针先遍历列表A,A遍历完了就去遍历B;p_b指针先遍历B,B遍历完了去遍历A。在p_a遍历B和p_b遍历A的时候,如果有相交节点两个指针就能在这里碰到了。这里稍微解释一下:因为a、b两个列表可以分为两段:a分为 a不与b相交那一段 + a、b相交的一段b分为 b不与a相交那一段 + a、b原创 2020-08-22 16:36:03 · 253 阅读 · 0 评论 -
LeetCode最小栈(Python)
题目解题思路由于要在常数时间内返回栈内最小值,所以使用额外空间,建立另一个栈来存放当前元素加入后栈内的最小值:执行结果位:原创 2020-08-22 15:23:33 · 156 阅读 · 0 评论 -
LeetCode环形链表(Python)——快慢指针
题目解题思路比较直的思路就是用列表储存遍历过的节点,然后看当前遍历的节点是否之前遍历过:结果果然很拉闸:另一个常用的方法就是快慢指针法,快指针一次走两步,慢指针一次走一步,如果有闭环,那么快指针一定能追上慢指针(因为快指针相对慢指针一次走一步):执行结果为:时间复杂度都是O(n)但两种方法结果相差这么多的原因应该是这样的,第一种暴力解法必须完整遍历完这个链表,而第二种快慢指针法最差的情况也就是完整遍历一次,很多情况下快指针可以在慢指针抵达链表尾之前追上慢指针,减少了运行时间。..原创 2020-08-21 10:21:52 · 293 阅读 · 0 评论 -
LeetCode只出现一次的数字(Python)——位运算
题目解题思路这道题应该是位运算的经典例题了…因为一个数字与自己异或等于0,所以将所有数字都异或一下,最后的数字就是只出现一次的数字了:执行结果为:原创 2020-08-21 09:15:06 · 168 阅读 · 0 评论 -
LeetCode验证回文串(Python)
题目解题思路判断回文不难,其实就是要去忽视无效字符。普通的做法应该是利用双指针,然后判断当前字符如果不是字母或数字就忽略,但比较啰嗦。所以这里利用了一些python的内建函数:str.isalnum():filter():str.lower():代码如下:执行结果为:...原创 2020-08-20 11:28:49 · 141 阅读 · 0 评论 -
LeetCode买卖股票的最佳时机Ⅱ(Python)
题目解题思路注意审题,必须在再次购买前出售掉之前的股票。想法和上一题一样,现在还是开着天眼的状态。我用几个例子来说明为什么这么算是对的。prices=[1,5],假设现在我第一天1的时候买入,然后第二天碰到5,按算法我应该卖出了,现在就两种情况,要不第三天比5大,要不第三天比5小,如果等于5可以忽略这一天。①比5大:prices=[1,5,6],此时我的最低价在第一次卖出之后更新为5,我第三天发现还在涨,那我就回到昨天,卖出的同时又买入,然后今天再卖出一次。②比5小:prices=[1,5原创 2020-08-20 10:58:49 · 156 阅读 · 1 评论 -
LeetCode买卖股票的最佳时机(Python)
题目解题思路维护一个截止当天的最低价即可:执行结果为:原创 2020-08-20 10:06:40 · 146 阅读 · 0 评论 -
LeetCode杨辉三角Ⅱ(Python)
题目解题思路时间复杂度要达到O(k),原地改变列表即可:执行结果为:原创 2020-08-20 09:35:48 · 141 阅读 · 0 评论 -
LeetCode杨辉三角(Python)
题目解题思路执行结果为:原创 2020-08-20 09:22:33 · 131 阅读 · 0 评论 -
LeetCode路径总和(Python)——深度、广度优先遍历
题目解题思路只需要将目标数一层一层递减传递下去即可,碰到叶子节点的时候看目标数是不是正好等于0,是则寻找成功。深度优先遍历 / 递归 :执行结果为:广度优先遍历 / 迭代 :执行结果为:...原创 2020-08-19 11:28:20 · 177 阅读 · 0 评论 -
LeetCode二叉树最小深度(Python)——深度、广度优先遍历
题目解题思路深度优先遍历 :和之前求最大深度的题有所不同,如果只是简单地把max改成min的话,假设一个节点的左子节点空,右子节点非空,那么通过min返回的深度是0,但实际上我们想返回的是右子节点路径的深度,所以需要对子节点的情况分类讨论:执行结果为:广度优先遍历:同样需要分类讨论一下,并且由于是层次遍历,所以第一次碰到叶子结点就可以return了:执行结果为:...原创 2020-08-19 10:19:47 · 220 阅读 · 1 评论 -
LeetCode平衡二叉树(Python)
题目解题思路很容易想到用递归,左右子树的高度差即最大深度差,再写一个返回最大深度的函数即可:执行结果为:但是这样的话最坏情况时间复杂度已经达到O(n2)了,主要是每一个节点都要查询左右子树的最大深度,即递归调用isBalanced()时每一个isBalanced()函数中都包含两个完整的maxdepth()的递归,所以同一个节点会被maxdepth调用很多次,有重复计算,所以应该针对这一点进行优化。官方题解中给的方法其实就是一个标记的思想:可以看到,如果以某个节点为根节点的树不是平衡树,原创 2020-08-18 16:13:50 · 254 阅读 · 1 评论 -
LeetCode将有序数组转换为二叉搜索树(Python)
题目要看懂这道题想让你干什么,首先得知道什么是一棵高度平衡二叉搜索树。根据维基百科:根据百度百科:因此,一棵高度平衡二叉搜索树(AVL树)就是满足了以上两个条件的二叉树:解题思路读懂了题目之后,会发现并不难:执行结果为:...原创 2020-08-18 11:16:31 · 127 阅读 · 0 评论 -
LeetCode二叉树的层次遍历Ⅱ(Python)——广度优先遍历
题目解题思路一开始看了题目,要求自底向上输出,第一反应是深度优先遍历,但仔细琢磨发现不对了,正如题中的例子,无论是前、中、后序遍历,都无法让15在9的前面被遍历到,没办法按题目想要的顺序输出(也可以强行用,后面说)。然后再看一眼题目,层次遍历?那就是要用广度优先遍历了。广度优先遍历思路和104题二叉树最大深度的广度优先遍历很像,可以看这里。由于广度优先遍历没法直接自底向上式输出,所以最后要进行翻转,翻转这一步时间复杂度也为O(n);del这一步,由于是删除最后一个元素,不需要搬动其他元素,所以时间复原创 2020-08-17 20:29:44 · 219 阅读 · 0 评论 -
LeetCode对称二叉树(Python)——深度、广度优先遍历
题目解题思路在之前的博客里讲了广度优先遍历,这里实现迭代的思路其实就是广度优先遍历:核心思想就是保证队列里相邻的两个节点在二叉树上是对称的两个节点。这里我随手画了一张二叉树示意图,展示一下入队的顺序,节点上的数字就代表了入队的顺位:执行结果为:但是如何使用迭代去做这道题,我一开始没想通,isSymmetric方法里只传入了一个参数,上哪去找它对称的节点,这怎么迭代.……直到看了官方题解(Java版)之后,直呼大坑:相当于直接重写了一个方法,然后用新的check方法迭代,坑!这里原创 2020-08-15 10:44:18 · 230 阅读 · 0 评论 -
LeetCode相同的树(Python)——深度、广度优先遍历
题目解题思路关于二叉树这个数据结构,考察比较多的就是深度优先遍历和广度优先遍历,其中深度优先遍历还分前、中、后序遍历。先实现一下简单的深度优先遍历:深度优先遍历中的前序遍历:深度优先遍历的中序遍历:深度优先遍历中的后序遍历:执行结果为:接下来实现难一点的广度优先遍历,这里也是借助了官方题解中的思路,模拟队列这样的数据结构来存放节点,每次弹出队首的节点进行比较,同时把这个节点的左右子节点加入队尾(如果有的话),代码如下:在官方的实现中,直接调用了collections类中的双向原创 2020-08-14 16:52:12 · 220 阅读 · 0 评论 -
LeetCode合并两个有序数组(Python)——双指针
题目解题思路首先,这道题可以将nums2中的数字用append()插入到s1中,但之前我们说过,在固定位置插入这一步其实是O(n)复杂度的,并且我们可以看到,其实nums1中是留出了nums2的位置的,所以不需要append()。但是如果从前往后比较的话,我们就需要额外的空间来存放nums1中的数字,比如nums1=[4,5,6,0,0,0],nums2=[1,2,3]。因此我们考虑从后往前进行比较:第一个while循环里,由于每一次要不就是m-=1,要不就是n-=1,所以退出时m,n有且只有一原创 2020-08-13 09:37:34 · 233 阅读 · 0 评论 -
LeetCode删除排序链表中的重复元素(Python)
题目解题思路维护一个记录出现过的数字的列表,判断当前节点的val是否之前出现过,没出现过则记录,出现过则删除当前节点:执行结果为:原创 2020-08-12 16:22:41 · 110 阅读 · 0 评论 -
LeetCode爬楼梯(Python)——动态规划、快速幂次
题目解题思路典型的递归,代码如下:但由于时间复杂度为O(2n),所以超时了…对递归的优化也很多,比如动态规划和记忆化搜索,但记忆化搜索需要一个全局变量,在这里不好实现,所以还是实现一下动态规划吧!之前也讲过动态规划,这道题很明显的递推公式就是 f(n) = f(n-1) + f(n-2) ,并且显然满足最优子结构与无后效性,直接放代码:执行结果为:然后看了官方的题解,发现又在用数学方法做…关于递推方程的特征方程,可以看大佬博客点这里下面实现一下方法二的矩阵法吧:climbSt原创 2020-08-12 16:03:19 · 352 阅读 · 1 评论 -
LeetCode二进制求和(Python)——位运算
题目解题思路第一反应还是直接列竖式,这里有一个小小的坑就是,字符串类型是不可变的,因此无法通过下标直接修改,还是需要创建一个新的字符串来保存结果。代码如下:执行结果为:但是发现为了避免a、b长短不一样而带来的越界问题,多写了很多行代码,于是想着让短的补0对齐,能让代码更加简洁:执行结果为:然后看了一下评论区的解决方案,发现可以用到位运算,所以这里详细讲解一下。拿我们熟悉的十进制相加举例子,9+98我们可以如何计算呢?首先只做各位相加但不管进位,9+8=17,个位数为7,然后9+0=原创 2020-08-11 15:55:34 · 347 阅读 · 0 评论 -
LeetCode加一(Python)
题目解题思路感觉也没什么技巧,无非就是9+1会产生进位这一点,先上代码:跳出while循环时,要不就是数组里全是9,i 变成 -1 了,这时候要在首位加一个1;要不就是碰到非9的数字了,那直接加1即可。执行结果为:...原创 2020-08-08 09:40:56 · 170 阅读 · 0 评论 -
LeetCode最后一个单词的长度(Python)
题目解题思路感觉没什么好说的,从末尾往前找第一个不为空格的字符,然后到再找到空格为止,代码如下:执行结果为:原创 2020-08-08 09:18:23 · 155 阅读 · 0 评论