算法学习笔记
文章平均质量分 69
刷leetcode的分类题做的总结
flex_university
这个作者很懒,什么都没留下…
展开
-
算法基础——动态规划(1)(爬楼梯)
自顶向下变自底向上:递归边界变为数组初始值;dfs函数状态转移方程变为f数组状态计算方程;递归改为循环。原创 2024-05-15 11:36:58 · 423 阅读 · 1 评论 -
算法基础——动态规划(2)网格图DP(基础)
它利用了堆数据结构的特性,可以在 O(n log k) 时间复杂度内完成操作,其中 n 是可迭代对象的元素数量,k 是要求的最小元素数量。其中树的层数代表做选择的次数,本题中任意方法选择次数相等,均为m(行数)+n(列数)次,故有m+n层,空间(递归的栈空间)用到m+n。当然注意到数字都是正数,可以直接在原来数字上乘以负一来标记入队,每列遍历本列入队(标记)的可以移动到的元素,可以节省空间O(1)可以用两个数组记录,can记录当前判断行能被移动到的元素,tes在判断中记录下一行可以移动到的元素。原创 2024-05-18 23:19:08 · 576 阅读 · 0 评论 -
算法基础——动态规划(3)背包 多重背包(每个物品可重复选,有次数限制)
与完全背包不同的点在,首先,其次,空间优化成一个数组时,完全背包只需要当前target的上一组状态,而多重背包需要当前target及其之前的数的上一组状态。本题对于时间优化的要求极为严苛,如果用常规多重背包,是过不了的(尽管下方代码已经做了一个小优化,让时间近乎减半)。依旧是上一轮的旧值,对应原方程中的f[i−1][j−(c[x]+1)∗x]由于是倒序遍历,此时的f[j−(c[x]+1)∗x]还未被更新,优化二有更简单的理解,建立在优化一的基础之上,是本轮的新值,对应原方程中的f[i][j−x]原创 2024-05-30 22:42:18 · 554 阅读 · 0 评论 -
算法基础——动态规划(3)背包 完全背包(每个物品可以重复选)
最开始考虑成选几个或不选的情况,这样写超时。只需要考虑选或不选这个数一次,选的话i(当前选择的数)不变,只是改变剩下需要凑的数值。空间优化到一个数组时,可以注意一下不变的位置和变得位置,从会变的位置开始修改可以减少if,else判断语句。Solution1:递归+备忘录。相对于上一题改动递推式为+即可。Solution3:空间优化。Solution2:递推。原创 2024-05-29 11:01:15 · 235 阅读 · 0 评论 -
算法基础——回溯(1)
回溯算法中的循环,对应遍历树结构一层节点的横向进程,而递归相当于纵向进程明白算法中设计的递归函数,循环结构的不变性很关键(完成什么样的相似的任务)回溯法三部曲1、递归函数的返回值以及参数2、回溯函数终止条件3、单层搜索的过程对于回溯题目,有时可以进行减枝优化。原创 2024-05-08 11:30:48 · 702 阅读 · 1 评论 -
算法基础——哈希表
在c++中,由于可以用数组、set、map来做哈希表,故要考虑各自特性。而python中,主要使用的就是数组和字典。对于效率而言,一定要熟悉自己使用语言对这些结构的底层实现,才能更好的运用。数组数组是定长的,并且键是隐藏的下标索引,故适用于已经知道长度和对下标映射的,如242.有效的字母异位词和383.赎金信。字典而对于349. 两个数组的交集1.两数之和202.快乐数这种没有限制大小的、数值跨度太大,就不能用数组了(除非你自己设计映射规则和冲突规则,构建hash)而。原创 2024-04-29 16:16:11 · 837 阅读 · 0 评论 -
算法基础——数组
在内存中是存储在不同的位置上的,而不是挨着存储的。列表的元素可以是不同类型的对象,所以它们可能会占据不同大小的内存空间。然后,它使用插入排序将这些run进行排序,然后使用合并排序将排好序的run合并在一起,直到整个列表都被排序。在滑动窗口解法中,循环不变量(维持的窗口)是以right为右端点的满足条件的最小的子数组窗口(除了不存在情况)。在内存中是通过连续的内存块存储的,并且列表对象包含对第一个元素的引用,以及每个元素的地址偏移量。在Python的列表中,使用下标索引一个元素的时间复杂度是O(1)。原创 2024-04-24 11:28:08 · 836 阅读 · 1 评论