自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(173)
  • 资源 (1)
  • 收藏
  • 关注

原创 python import zip压缩文件

python可以直接调用zip格式的压缩文件,而不需要将文件解压,保证了文件的安全性。

2024-06-05 15:47:57 112

原创 算法题代码运行时间复杂度估计

总结一下关于问题规模(n大小)与算法时间复杂度要求的关系,有时候通过问题规模就可以判断出这道题需要用什么算法。这样判断的一个好处就是可以很自然地从暴力求解的思路入手,逐步展开优化,更符合实际编程环境下的思维习惯,毕竟在实际开发时很少会真的直接想到用双指针或者动态规划解决一个编程问题。所以一般给出n的范围的地方都叫做’提示’

2024-05-06 06:06:18 673

原创 Leetcode 32. 最长有效括号

本以为要用动态规划,但是递推有点太难了;主要是第一反映hard题不能就一个栈就解决吧,结果还真就是一个栈解决了。1、在最后计算间隔时,需要前后放-1和len(s),以维持循环不变量原则。括号问题还是得栈入手,这道题考察栈+哈希表思想(其实就是数组索引)

2024-05-02 04:18:09 334

原创 Leetcode 76. 最小覆盖子串

这道题一开始以为要用动态规划来解,但是结合题目中需要返回的是最短子串本身而不是长度,因此在对于字符串s建模时至少需要维护i和j两个变量,再加上这道题没有明显的递推。c. slow驱动下一次fast更新的规则:slow指针’多‘移动一位,使得当前元素又不满足fast停下的规则了,同时让fast加1。1、这道题的难点在于边界条件,需要让fast指针停在刚好满足条件的地方,然后再用slow驱动fast。a. fast指针的更新规则:向右移动直到窗口包含了所有t中的元素。这道题是滑动窗口双指针经典问题。

2024-04-24 20:42:28 298

原创 Leetcode 42. 接雨水

这道题很久之前在看数组前缀的专题的时候见过,是一道典型的用数组前缀最大值来解决问题的题。感觉应该算是贪心思维吧。凭着之前记着的求解思路把这道题写了出来,说实话要是没遇到过这种类型的第一次见的话自己想出来这个贪心解法还是有点困难的。1、在求后缀最大值时,最好采用post_max[i] = x的赋值方式而不是post_max.append(x)

2024-04-23 04:05:20 279 1

原创 Leetcode 28. 找出字符串中第一个匹配项的下标

1、注意边界条件是匹配串needle到头,但是haystack不一定需要到头。两个字符串匹配的问题基本都可以用动态规划解决,递推关系就是依次匹配下去。2、这道题按照从i开始的字符串而不是从i结束的进行DP建模。

2024-04-19 00:55:38 227 2

原创 Leetcode 53. 最大子数组和

子数组的和是可以通过前面的和加上当前值递推获得,所以可以用动态规划解决这道题。1、这道题再获取最大值时res不能用0而需要用负无穷初始化。

2024-04-18 17:00:43 355

原创 Leetcode 34. 在排序数组中查找元素的第一个和最后一个位置

这道题最难的地方在于需要‘课题分离’,把查找出满足target的第一个元素的二分查找函数分离出来,然后再加一些细节即可。

2024-04-18 16:52:18 285

原创 Leetcode 5. 最长回文子串

这道题本质在考察双指针和移动窗口的思想,虽然不难但是自己第一次写代码很冗余。2、函数传参可以假设是偶数情况下的子串,奇数就可以直接i,i赋值。1、注意回文子串是需要分奇偶讨论的。

2024-04-18 16:43:00 231

原创 Leetcode 10. 正则表达式匹配

这道题有点难,主要难在需要考虑的条件比较多,很难写出简洁的代码;此外,这道题的递推也有点复杂。看了网上的解答自己写了一个尽可能清晰的AC解。1、这道题的递推关系是从前往后找的,一般的双字符串问题都是从后向前找。2、这道题的条件判断很多,但是很多条件是可以合并的。动作候选集:s后移0或1位,p后移0或1或2位。状态:当前两个子串是否完全匹配。返回值:当前子串是否匹配。

2024-04-18 04:04:10 198

原创 Leetcode 4. 寻找两个正序数组的中位数

k/2-2] 共计 k/2-1 个,nums2 中小于等于 pivot2 的元素有 nums2[0 …k/2-2] 共计 k/2-1 个。取 pivot = min(pivot1, pivot2),两个数组中小于等于 pivot 的元素共计不会超过 (k/2-1) + (k/2-1) <= k-2 个。要找到第 k (k>1) 小的元素,那么就取 pivot1 = nums1[k/2-1] 和 pivot2 = nums2[k/2-1] 比较;k/2-1] 都不可能是第 k 小的元素。

2024-04-17 01:57:54 293

原创 Leetcode 221. 最大正方形

动作候选集:这道题的动作候选集其实是是否选择其左上角邻接的三个位置,动作候选集的特征不是特别明显。1、注意题目中给出的是’0’而不是0。状态:以i,j为右下角的正方形。返回值:最大正方形的边长。2、注意边长要转化为面积。

2024-04-15 18:22:29 273

原创 Leetcode 235. 二叉搜索树的最近公共祖先

这道题可以完全按照二叉树的公共祖先来做,但是由于题目中给了二分搜索树的条件,因此可以通过值的大小简化左右子树的递归搜索。

2024-04-15 01:34:57 191 1

原创 Leetcode 236. 二叉树的最近公共祖先

这道题其实不是很好想,本质在考察二叉树的后序搜索过程,也相当于自底向上的搜索过程。二叉树的后序搜索其实就是一种针对结点的回溯算法(一般的回溯为针对路径)。这道题结点有四种可能情况:p,q,空,不为p或q。当结点为前三种情况时直接返回结点即可。

2024-04-15 01:30:11 250 1

原创 Leetcode 240. 搜索二维矩阵 II

以右上角为例,每个元素的右子树都比它大,左子树都比它小,并且这个顺序可以迭代。因此这个问题变成了从根节点就开始递归搜索的问题。由于值已经按照二维数组给出了,所以只需要控制数组的索引变化来遍历树即可。这道题很容易被二分搜索给迷惑,但是仔细看会发现这道题从矩阵的右上角或者左下角来看的话这是一个二分搜索树。1、while循环的判断条件可以用是否在边界内。

2024-04-14 06:12:46 560

原创 Leetcode 399. 除法求值

第一次遇到这个题从读题到最后AC一共用了17分钟。当时犹豫了很久除法溢出的问题,后来想想就算有溢出问题也可以用path存储一个路径再去乘法。一开始看着挺蒙的主要是不知道这道题在考察哪个知识点,后来按顺序把三个示例自己模拟着做出来之后发现本质其实在考类似链表或者指针的东西。3、初始化visited = [start]而不是[],由于回溯函数的循环不变量编程原则。再一想其实是一个树或者图的遍历搜索问题,一下子想到了回溯算法。做完之后看网上的答案基本上也是按照图+DFS的思路来做的。

2024-04-13 02:54:20 325

原创 Leetcode 406. 根据身高重建队列

看到二维数组的排序问题,第一反应想到了之前合并区间那道题先对数组按照第一维排序,后来在纸上模拟后发现,如果按照第一维度降维,第二维度升维的方式排序,那么后面插入的元素一定不会影响前面的元素。因为一个数只关系比他大或者和他相等的数,如果和他相等那么第二维度越大越靠后。1、list.sort(key = lambda x: (-x[0], x[1]))大法可以多维度排序,但是注意需要返回。2、oneDlist.sort(key = lambda x : -x)也可以代表降序。

2024-04-12 03:11:51 297

原创 Leetcode 394. 字符串解码

这道题考察的应该是队栈这两种数据结构的转换,因为每次字符串和数字都需要反过来,并且最后的结果其实是按队列出来的。2、string.isdigit()是用来判断string里是否只包含整数数字的(有小数点也会返回False)1、注意字符串和数字pop出来之后需要用[::-1]取个反。

2024-04-11 04:20:12 238

原创 Leetcode 23.合并K个升序链表

第一反应是直接暴力求解出来,因为题中也没有关于复杂度的要求。写完发现竟然也通过了,后来发现这道题本来考察的是分治算法,不过能解决问题就行吧。从评论区看到了一句话很有意思:链表的题能暴力做出来的基本都能通过,感觉这句话很有含金量,希望面试的时候能遇到这道题。

2024-04-10 05:03:05 255

原创 Leetcode 538. 把二叉搜索树转换为累加树

1、注意赋值的时候需要包含node.val,相当于包含i的后缀和。二分搜索树 == 中序遍历,记住这一点即可;两次遍历,第一次求和,第二次赋值即可。

2024-04-09 22:38:30 287

原创 Leetcode 287. 寻找重复数

这道题对于时间复杂度没有要求但是对空间复杂度有要求,因此需要双指针。2、注意返回f或者s而不是nums[f]和nums[s]1、注意要让指针进入循环,使用do while结构。

2024-04-09 22:22:36 330

原创 Leetcode 438. 找到字符串中所有字母异位词

这道题本质在考察计数集合的用法,可以用sort,也可以用Counter,实测发现Counter的时间复杂度低一点。看来决定一道题是否适合动态规划不能只按照这道题长得像不像要用动态规划的标准,而应该看重叠子问题现象是否明显。2、数组的长度 = 数组end索引 - 数组start索引 + 1,简记为。1、Counter的对象可以直接用==进行比较,且比sort要快速一些。看到这个类型的题总以为要用动态规划去做,结果想了半天递推关系没想出来。,方便下次能快速分析边界条件而不用犹豫。

2024-04-09 02:44:49 333

原创 Leetcode 437. 路径总和 III

2、当node为空时,应该直接返回0,因为已经在上一步的递归中对恰好满足的进行了+1计算,满足循环不变量的原则。这道题递推并不难,但是有细节需要注意,主要就是区间可以不是根节点,以及结束不一定是叶子结点这两个限制。1、由于终点不一定是叶子结点,所以当递归的target等于0时,需要加1。3、由于起点不一定是根节点,所以需要对整个树进行dfs遍历。其余的动态规划即可。

2024-04-09 02:05:31 184

原创 Leetcode 494. 目标和

这道题的递推关系很明显,类似于一个背包问题,按照背包问题的建模方式即可。状态:从头开始以nums[i]结尾的子数组,当前目标和。返回值:有多少种可能的组合。动作:选择加号还是减号。

2024-04-09 00:44:44 144

原创 Leetcode 560. 和为 K 的子数组

2、需要先查找再添加新的前缀和,否则当k=0的时候会重复计算;并且相当于在k=0的时候要自己减去自己,得到空集是没有意义的。一开始用动态规划求解的,因为很明显这是一个背包问题,但是超内存了。1、前缀和初始字典为{0:1},含义是第0个前边元素的前缀和为0。从网上看到需要用数组的前缀和去解决。

2024-04-08 01:04:28 171

原创 Leetcode 581. 最短无序连续子数组

本以为这道题要用动态规划求解,因为题目中这几个关键字与动态规划太匹配了,结果想了半天也没发现dp(i)和dp(i-1)的递推关系。1、书写while循环时统一用大于小于号,如果到头退出循环的条件就是等于;如果中间break的话就是满足中间条件。这道题本意考察双指针的做法,也可以用排序后做比较的方式来做。2、注意区间长度比索引差大1。

2024-04-07 23:44:59 203

原创 Leetcode 739. 每日温度

暴力解很好想到,就是一个On2的双层循环即可,但是会超时。于是第一反应想到了动态规划,这道题的动态规划思路其实本质上有点像那个跳跃游戏,相当于跳着比较从而减少遍历复杂度。后来从网上发现这道题是经典的单调栈题目,从后向前遍历,当新遇到的值比之前的元素大的时候,就把比它小的全部pop出去。

2024-04-07 23:09:22 259

原创 Leetcode 238. 除自身以外数组的乘积

1、注意后缀乘积计算需要从后往前,最好按照初始化数组赋值而不是append的方式。2、注意计算的时候要错一位。

2024-04-07 17:37:59 270 1

原创 Leetcode 55. 跳跃游戏

4、在一些问题上,nonlocal声明是必不可少的,尤其是当变量为非类对象时,比如res=int,bool等具有实际内存的变量,必须要在递归函数中声明nonlocal res;后来发现这道题其实是动态规划问题,典型的从子问题可以推到父问题,但是需要注意这道题对于时间和空间复杂度的要求是比较高的,从这也能看出来这道题其实也是个贪心问题。回溯的核心思维其实是遍历所有并且记录路径path,并且当子状态无法返回父状态时,是不需要记录visited的,只需要记录path。回溯的核心是回溯路径也就是path。

2024-04-07 17:17:00 476

原创 Leetcode 215. 数组中的第K个最大元素

可以按照快排排到找到k-1个large元素的思维去做,不过这道题需要考虑空间复杂度,所以需要用指针快排。这道题本质上是排序不完全的过程,而且这道题有bug,直接用python的排序算法其实就能AC。1、思考递归函数需要只想当前层的处理逻辑,不要多深入往下一层去思考,否则容易乱。2、用快排来做这道题的递归函数不需要边界条件判断。其实也可以考虑用K次的冒泡排序。

2024-04-07 02:17:07 244

原创 Leetcode 207. 课程表

第二反应是用链表来解决问题,以此转化为判断链表是否成环,因为链表是有方向的,后来发现还是不行,因为链表只有一个或者两个指针,但是题目中其实一个课程可能有多个指针。这道题的本质是一个构建有向图,然后判断有向图中是否有环的问题,之前没有遇到过这类问题,而且感觉这种类型应该是一类题,于是上网搜索了答案。第一反应是用并查集求解,但是写完之后发现逻辑错误,因为要求的是判断有向图是否有环的问题,而并查集只能解决无向图成环的问题。网上有两类做法,分别是拓扑排序和DFS。2、链表的指针数量是一个或者两个有限的。

2024-04-07 01:18:54 163

原创 Leetcode 105. 从前序与中序遍历序列构造二叉树

第一眼看这个题有点懵,后来根据题目给的案例模拟的时候发现,其实只需要在递归函数中每一层构建一个根节点和它的左右子树即可,递归函数传入的是以当前为根节点的前序和中序遍历的数组。1、利用递归函数创建二叉树时,每一层new一个node,然后node.left = dfs(…,记得最后要把node给return;前序遍历用于确认根节点,中序遍历用于确认该根节点的左右子树的长度,然后即可递归不断向下进行。2、有return值的递归函数在边界条件和函数上都需要return。3、传参想不明白索引的时候传入数组即可。

2024-04-06 23:42:49 477

原创 Leetcode 155. 最小栈

一个直观的想法是每次在push的时候都用链表把这些值给连上,按照从小到大的顺序。1、链表的虚拟头结点对于链表的插入和删除操作是很有用的,核心概念就是while t.next: if …需要每次访问t.next的元素,因此插入和删除都得依赖所寻求结点的前一个结点。2、链表的插入和删除都是三行:赋值temp + 重新赋值两个next (删除的话重新赋值一个None保证链表安全)用链表做了一下,主要是顺便复习了一下链表,这道题用链表的做法和LRU缓存那道题非常类似。出栈:数据栈出栈元素正好是辅助栈的栈顶元素。

2024-04-06 03:17:46 287

原创 Leetcode 148. 排序链表

这道题通过很简单,但是如果想要用O(1)的空间复杂度+O(nlogn)的时间复杂度的话,可能得需要双指针+快排的思路。

2024-04-06 02:27:39 243

原创 Leetcode 102. 二叉树的层序遍历

2、注意用len(queue)控制层数。1、队列注意用popleft。

2024-04-06 02:10:17 249

原创 Leetcode 96. 不同的二叉搜索树

假设当前有n个结点,那么以第i个结点(按大小顺序)为根节点,其左子树有i-1个结点,右子树有n-i个结点,那么其实这种情况下就有dp(i-1)*dp(n-i)种情况,然后再去遍历这个i即可。这道题说实话有点不好想,很难第一时间想到是DP问题,与其说这是一个动态规划,其实更像是一个找规律的问题。

2024-04-06 02:02:51 324

原创 Leetcode 64. 最小路径和

第一反应像是一个回溯问题,但是看到题目中要求最值,大概率是一道DP问题。并且这里面的递推关系也很明显。这里面边界条件可以有多种处理方法。

2024-04-06 01:38:13 265

原创 Leetcode 684. 冗余连接

这道题属于图论的经典连通问题,这道题翻译过来就是,找到破开图中环的一条边;再翻译过来就是,从后往前遍历edges,依次连接边,当发现新连接的边已经有相同父节点时(已经马上成环了),那么就把这个新的边返回,这就是一个多余的边。并查集的核心其实在于father数组初始化成range(n)以及单向递归的find函数。核心理论就是无论什么时候总会有一个father中的元素满足father[x] = x,从而结束递归的查找。1、rank可以用可以不用,只是压缩路径用的,用的话注意初始化都为1。

2024-04-06 01:17:58 213

原创 Leetcode 56. 合并区间

这道题看起来很简单,但实际上操作起来很多细节,第一反应是朋友圈问题,于是想到了并查集去做,顺便复习了一下并查集。这道题其实是考察数组重复区间问题,应该先对区间左端点进行排序,然后再按照依次融合区间。因为假设多个区间有重叠的话,那么他们一定会在排序排在一起。如图所示,如果排序完存在这样的重叠区间那么就需要融合,每次只融合一个并顺带更新res[-1]即可。2、使用并查集时,只有find函数才有确认集合的作用,father数组无法体现是否同一集合。1、要注意对区间左端点先进行排序操作,才能使用贪心方法。

2024-04-06 01:08:15 331

原创 Leetcode 49. 字母异位词分组

这道题看着简单,实际上如果直接按照集合的思维去做会很麻烦,甚至会超时. 这道题其实考察的是排序的思维,按照排序的思维来做就会很好做.这也反映出了算法的两种思维: 集合思维和排序思维。

2024-04-05 20:58:51 231

pyqt_diaoyong_multiwindow.zip

使用PyQt4 + QT designer + python3.7环境搭建了一套多窗口调用的模板,里面包括配置好的调用关系,以及一些按钮事件框架,还有部分QSS内容。

2019-06-28

空空如也

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

TA关注的人

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