- 博客(23)
- 收藏
- 关注
原创 19——透彻理解动态规划
2、leetcode64,给定一个包含非负数组的mxn网络gird,请找出一条从左上角到右下角的路径,使得路径上的数字总和最小。动态规划是热门、最重要的算法之一,解决的思路为:一、确定状态和子问题,也就是枚举出某个位置所有的可能性,得到递推关系同时将问题转换为子问题。二、确定状态转移方程。三、确定初始条件和边界情况。四、按照从小到大的顺序计算,下面将举例说明。1、leetcode62,一个机器人位于一个mxn网络的左上角,机器人只能向下或者向右移动一步,当机器人到达网络的左下角,总共有多少条路径。
2023-12-12 12:32:18 64
原创 20——透析回溯的模板
回溯是算法最重要的思想之一,主要解决一些暴力枚举也搞不定的问题,例如组合、分隔、子集、排列、棋盘等。回溯可以理解为递归的拓展,但是其代码结构又特别像深度遍历N叉树,因此只要知道递归,理解回溯并不难,关键在于回溯之后有个撤销的操作(由于python的性质,数字会自动执行撤销操作)。下面我将通过三道Leetcode展示回溯的思想。3、Leetcode113,给你二叉树的根节点root和一个整数目标和targetSum,找出所有从根节点到叶子节点路径总和等于给定目标和的路径。回溯=递归+局部枚举+放下前任。
2023-12-08 23:06:17 63
原创 算法通关村第十六关——滑动窗口高频问题
有n条垂线,第i条线的两个端点是(i,0)和(i,height[i]),找出其中的两条线,使得它们与x轴共同构成的容器可以容纳最多的水,返回容器可以存储的最大水量。3、寻找子串异位词,Leetcode567,本题可以以s1的大小截图为一个固定的窗口,一遍向右移动一边比较是否相同即可,比较方法可以构造字母和数量对应关系的字典,比较两个字典是否相同。同时,因为用列表记录删除时速度比较慢,可以使用hash表进行存储来优化速度,但是由于hash表的无序性,需要额外记录left下标来标记删除的元素。
2023-12-06 11:54:44 67
原创 算法通关村第十六关——滑动窗口原来如此简单
1、求子数组的最大平均数,Leetcode643给定n个整数,找出平均数最大且长度为k的连续子数组,并输出该平均数。2、最长连续递增序列,Leetcode674给定一个未经排序的整数数组,找到最长且连续递增的子序列,并返回该子序列的长度。
2023-12-06 10:47:37 65
原创 算法通关村第十二关——不简单的字符串转换问题
该题的关键是已知小写字母的ASCII码是大写字母的ASCII码+32,只需要判断字符串是否为大写字母,然后进行修改即可,因为字符串不能直接进行修改,因此现需要转换为列表再进行修改。2、字符串转换成整数,参考Leetcode8,本题先需要处理字符串,再需要处理字符串转成数字溢出的问题。对于字符串处理,1、去除先导的空格。2、判断第一个字母是否为符号或者数字。字符串本身不是一种数据结构,但是由于其本身特殊性,可以产生很多特殊的算法题,另外,字符串在工程里也有非常广泛的应用,厦门就两个常见问题进行分析。
2023-12-04 11:42:09 17
原创 算法通关村第十一关——位运算常用技巧
逻辑移位时,高位补0。2、移位运算可以实现乘除操作,计算机底层一切运算都是基于位运算实现的,左移运算相当于乘法操作,左移K位,等价于将这个数乘以2^k,右移运算相当于除法操作,右移K位,相当于除以2^K,结果向下取整。清零,将1左移i位,得到形如00010000的值,再取反得到11101111,接着与num执行“位与”操作,从而获取指定位置的值设为0,其余位不变。设置,也是将1左移i位,得到形如00010000的值,接着与num执行“位或”操作,这样就可以将指定位置的值设置为1,其余位不变。
2023-12-04 09:07:28 17
原创 算法通关村第九关——二分查找在最小数字和验证二叉树的应用
1、旋转数字的最小数字,题目为Leetcode153已知一个长度为n的数组,预先按照升序排列,经由1到n次旋转后得到输入数组,求最小数值,该题可以很简单的进行遍历,只要出现arr[i+1] < arr[i],即可返回最小数字nums[i],但这样的时间复杂度为O(n),可以采用二分查找进行改造,令right = mid,这样的目的是避免mid为最小下标时,跳过位置。
2023-12-03 11:37:39 29
原创 算法通关村第九关——透彻理解二分查找
二分查找是优化查找效率的一个很重要的手段,并且不少问题可以转换成查找问题,因此弄清楚二分查找是很重要的,接下来分别展示通过迭代的方式进行二分查找、递归实现二分查找、若有重复元素怎么用二分查找三个问题。这样就会不断查找,如果能找到到终止条件时,left=第一个满足条件的target,right=第一个满足条件的target-1。3、若有重复元素,有两种解决方法,1、先找到该元素然后向边界线性拓展。
2023-11-25 16:57:04 23
原创 算法通关村第八关——轻松搞定二叉树判断平衡树和最小深度问题
2、二叉树最小深度问题,参考于leetcode111,给定一颗二叉树,找出其最小深度,最小深度是从根节点到最近叶子结点的最短路径上的数量,不能直接把最大深度搬过来,核心问题是分析终止条件:如果左子树为空,右子树不为空,说明最小深度是1 + 右子树的深度,反之,如果右子树为空,左子树不为空,说明最小深度是1 + 左子树的深度,如果左右子树都不为空,返回左右深度最小值+1。
2023-11-23 18:55:20 51
原创 算法通关村第八关——轻松搞定二叉树合并和寻找路径问题
2、二叉树寻找路径问题,题目参考leetcode257,给你一个节点root,按任意顺序返回所有从根节点到叶子节点的路径。这题的关键遍历所有节点,同时保留路径作为前缀,如果该节点为叶子节点,则保存路径,否则继续遍历,因为涉及到保存前缀,因此新构建了一个函数用来遍历。1、二叉树合并问题,题目参考leetcode617,给定两个二叉树,目标是合并,两个都有节点的相加,只有一个的保留,使用递归方法可以写如下代码。
2023-11-23 16:00:22 31
原创 算法通关村第六关——如何使用中序和后序恢复二叉树
中序:左根右,后序:左右根,因此后序有一个特点就是根节点在最后,因此可以结合这个特点再根据中序逐步恢复出二叉树,恢复过程可参考下图:
2023-11-19 16:48:09 31
原创 算法通关村第五关——用队列实现栈问题解析
栈是一个先进先出的结构,而队列是一个后进先出的结构,因此如果先要用队列实现栈,需要借助两个队列实现,可以让queue2为辅助队列,而queue1为让先进来的元素不断添加到队首的队列。
2023-11-13 16:28:22 45
原创 算法通关村第四关——最小栈问题解析
问题参考Leetcode 155,该题的关键在于设计一个能在常数时间检索到最小元素的栈,因此,我们需要维护额外一个一直记录最小元素的栈,这样才能常数时间检索。
2023-11-12 16:43:30 30
原创 算法通关村——双指针的妙用
这道题使用双指针可能很好的处理边界条件,慢指针指向区间的起始位置,快指针指向区间的末尾,因此当快指针从慢指针开始遍历直到不满足连续递增则代表当前区间结束,然后将slow=fast+1作为下一个区间的开始,fast继续向后遍历找下一个区间的结束,如此循环,直到数组遍历完毕。数组区间专题,Leetcode228:给定一个无重复元素的数组nums,返回恰好覆盖数组中所有数字的最小有序区间范围列表。
2023-11-12 15:28:27 15
原创 算法通关村——不简单的数组增删改查
如给定一个数组,以及size(已经存储元素的个数)和element(需要插入的元素),我们需要考虑清楚四个问题。1、size和len(arr)的关系,2、index初始值,3、循环遍历的数量。4、列表移动的最后一个元素,考虑清楚一下问题,可以得到下列代码。数组的插入和删除并不是一个简单的问题,会涉及到比较麻烦的边界问题需要考虑清楚。
2023-10-30 19:43:49 69
原创 算法通关村第二关——两两交换链表中的节点问题解析
该题可以建立一个虚节点,然后访问到其后面第一个结点和第二个结点,根据下图所示规则反转,再不断递进即可,因此这种题最重要的就是把思路理清楚、图画好。问题见:leetcode24 给你一个链表,两两交换其中相邻的结点,并返回交换后链表的头结点。
2023-10-30 17:33:37 83
原创 算法通关村第二关——终于学会链表反转了
反转链表是链表里面的一个经典问题,高居牛客网热度第一名,因为它涉及到链表的增删,十分考验被试者的能力,也是很多难题的基础,有两种方法解决链表翻转问题。方法二:不建立新节点,直接反转,更考验被试者的能力,需要三个指针,head代表新结点,cur代表旧链表,next保证旧链表不丢失。方法一:建立虚节点,这样链表反转问题就简化为不断在旧链表中拆下一个节点然后插入到新链表的头部。,请你反转链表,并返回反转后的链表。
2023-10-26 11:37:44 83
原创 算法通关村第一关——链表经典问题之删除重复元素笔记
这里最重要的就是判断cur.next和cur.next.next是否相等,相等的话,保存该值然后循环删除等于该值的节点。同时还需要注意判断这两个节点是否存在,可能会遇到头结点,采用虚节点的方式。删除原始链表中所有重复数字的节点,只留下不同的数字。给定一个已排序的链表的头。
2023-10-25 18:57:45 89
原创 算法通关村第一关——链表青铜挑战笔记
接下来完成列表结点的插入,结点的插入主要要考虑好三种情况,对于头部结点之前,直接把新结点插入头结点,并且重新把头结点指定为新结点。对于中间,需要遍历到指定位置前一个节点,先将新结点的next指向前一个结点的next,再将前一个结点的next指向新结点完成插入。对于末尾结点,只需要将末尾结点的next指向新节点即可。问题:链表增加元素,首部、中间和尾部会有什么问题,该如何处理?
2023-10-16 17:45:42 68
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人