- 博客(29)
- 收藏
- 关注
原创 动态规划第四讲
数组压缩技巧:生成等规模dp表比较浪费空间,由于该题只依赖左和上的值,所以可以是生成两个数组,先填好a,再填好b,然后释放掉a,再填a,一直滚动下去,最省的是一个数组,进行自我更新。第0个和第1个能组成2,第1个和第2个能组成2,第0个和第2个能组成2。arr是面值数组,其中的值都是正数且没有重复。例如:arr = {1,2,1,1,2,1,2},aim = 4。2arr是货币数组,其中的值都是正数。例如:arr = {1,1,1},aim = 2。方法如下:1+1+1+1、1+1+2、2+2。
2024-03-22 22:19:08
435
原创 动态规划第三讲
思路2:定义一个f(arr,l,r),返回在lr 范围内最长回文子序列长度。给定一个正数N,表示N个人等着咖啡机泡咖啡,每台咖啡机只能轮流泡咖啡。3给定一个数组arr,arr[i]代表第i号咖啡机泡一杯咖啡的时间。只有一台洗杯机,一次只能洗一个杯子,时间耗费a,洗完才能洗下一杯。三个参数:int[] arr、int N,int a、int b。每个咖啡杯也可以自己挥发干净,时间耗费b,咖啡杯可以并行挥发。然后把整个棋盘放入第一象限,棋盘的最左下角是(0,0)位置。没有适合的范围就弄到最大的范围。
2024-03-22 18:46:00
183
原创 第十九讲 动态规划2
给定两个长度都为N的数组weights和values,weights[i]和values[i]分别代表 i号物品的重量和价值。3 给定一个字符串str,给定一个字符串类型的数组arr,出现的字符都是小写英文。arr每一个字符串,代表一张贴纸,你可以把单个字符剪开使用,目的是拼出str来。例子:str= "babac",arr = {"ba","c","abcd"}给定一个正数bag,表示一个载重bag的袋子,装的物品不能超过这个重量。4 给定两个字符串str1和str2,"AAA"、"KA"和"AK"
2024-03-17 21:51:07
321
原创 第18节 动态规划一讲
规定机器人必须走K步,最终能来到P位置(P也是1~N中的一个)的方法有多少种。1假设有排成一行的N个位置记为1~N,N一定大于或等于2。如果机器人来到N位置,那么下一步只能往左来到N-1位置;如果机器人来到中间位置,那么下一步可以往左走或者往右走;开始时机器人在其中的M位置上(M一定是1~N中的一个)如果机器人来到1位置,那么下一步只能往右来到2位置;准备一张dp表,先全设为-1,表示没算过这个过程。给定四个参数 N、M、K、P,返回方法数。玩家A和玩家B依次拿走每张纸牌。规定玩家A先拿,玩家B后拿。
2024-03-16 23:19:05
694
原创 体系班第十七节(经典递归)
写一个大方法,大方法包括两步:第一步将最后一个圆盘上面的所有的放到第二个塔上面,然后将最后一个圆盘放到最后塔上面,再把第二个塔上面圆盘全放在第三个塔上面。递归思路:第一个参数是原字符串,第二个index是当前来到的字符,path是之前已经选好的部分串,第三个参数是所有结果的保存。在上一题代码做改动,如果某个字符已经试过了,那就在后面在遇到时就不尝试了。3题 求所有不同的子序列,只要改成set结构收集答案即可。不停地做字符串前一位和后一位交换,而且是在原字符串上面交换。2打印一个字符串的全部子序列。
2024-03-16 21:09:19
680
原创 体系班第十六节(图论)
用并查集实现,每次从小的边开始选,如果这个边能形成环(也就是说这条边的两个端点已经在集合里面存在了)就不要这条边,不能的话就要。小根堆根据距离的大小组织,每次弹出堆顶,然后更新堆中元素,由于需要找到对应的点,所以必须用加强堆做。从某一个点开始,选一个最小的边,同时把相连的点解锁,同时这两个点找最小的边。要标记所有已经选过的点,不能再选,慢的原因是不停遍历所有点选最小。给一个点,求出他能到达的所有点最小值,到不了的为无穷。7单元最短路径算法Dijkstra。5 克鲁斯卡尔算法求最小生成树。
2024-03-16 18:36:04
432
原创 体系班第十五节
给定一个二维数组matrix,里面的值不是1就是0,上、下、左、右相邻的1认为是一片岛,返回matrix中岛的数量。递归解法:设计一个类似感染的函数,将所有连成一片的1感染成2,之后统计总共感染了几次。并查集:是1就合在一起,不是就不合,最后返回集合的数目。2 岛问题(递归解法 + 并查集解法 + 并行解法)1一群朋友中,有几个不相交的朋友圈(力扣547)并查集法二: 直接对应成一个一维数组。先分开算 ,再看边界是否能合并。用字符串代表位置来进行优化。要求的是每一步动态岛数量。
2024-03-09 20:45:49
390
原创 体系班第十四节
例如,给定数组{10,20,30},代表一共三个人,整块金条长度为60,金条要分成10,20,30三个部分。2一些项目要占用一个会议室宣讲,会议室不能同时容纳两个项目的宣讲,给你每一个项目开始的时间和结束的时间。比如长度为20的金条,不管怎么切都要花费20个铜板,一群人想整分整块金条,怎么分最省铜板?说明:每做完一个项目,马上获得的收益,可以支持你去做下一个项目,不能并行的做项目。下一个是.,灯数加,无论i+2是什么,情况都一样,之后i跳三格。下一个是x,灯得到该处放,灯加,然后i跳两格。
2024-03-09 18:41:53
381
原创 体系班第十三节
5给定一个由字符串组成的数组strs,必须把所有的字符串拼接起来,返回所有可能的拼接结果中字典序最小的结果。// 这名员工有哪些直接下级。分情况:x来,x不来,定义一个结构体,保存两个值,x来时候的最大值,x不来时候的最大值。3给定一棵二叉树的头节点head,和另外两个节点a和b,返回a和b的最低公共祖先。2 给定一棵二叉树的头节点head,返回这颗二叉树中最大的二叉搜索子树的头节点。树的头节点是公司唯一的老板,除老板之外的每个员工都有唯一的直接上级。长度不同:较短的补上最小的阿斯克码值,然后与长的比较。
2024-03-09 11:36:31
1007
原创 体系班第十二节
方法:最大最小值,是否为搜索,最大搜索二叉树大小,自己的大小,当最大搜索二叉子树大小为自己大小时,此时即可判断他是搜索,所以不需要设置是否为搜索二叉树变量。只给要删除的节点,如何删除该节点,抖机灵做法:把下一个节点值改到该节点上,然后删下一个节点,但这种做法删不掉最后一个节点,该习惯在工程上也非常不好。2)在上一步的假设下,讨论以X为头节点的树,得到答案的可能性(最重要)6)写代码,在代码中考虑如何把左树的信息和右树信息整合出整棵树的信息。需要获得的信息:左是否为搜索,右是否为搜索,左右的最大最小值。
2024-03-08 21:47:09
331
1
原创 体系班第十一节
如无右树,则应该一直往上,看是否为他父亲的右孩子,若是,则继续往上,直到变成父亲左孩子。请把一段纸条竖着放在桌子上,然后从纸条的下边向上方对折1次,压出折痕后展开。此时有三条折痕,从上到下依次是下折痕、下折痕和上折痕。给定一个输入参数N,代表纸条都从下边向上方连续对折N次。此时折痕是凹下去的,即折痕突起的方向指向纸条的背面。如果从纸条的下边向上方连续对折2次,压出折痕后展开。N=2时,打印: down down up。该二叉树规律:头结点凹,左节点凹,右节点凸。N=1时,打印: down。
2024-03-08 11:48:11
355
1
原创 体系班第十节
要求如果两个链表长度之和为N,时间复杂度请达到O(N),额外空间复杂度请达到O(1)请实现一个函数,如果两个链表相交,请返回相交的第一个节点。如果不相交返回null。1给定两个可能有环也可能无环的单链表,头节点head1和head2。两个链表要不均有环,要不均无环,有环还可分为入环节点是否相同。2二叉树先序、中序、后序的非递归遍历。容器法:用哈希表遍历。
2024-03-03 21:28:43
366
原创 体系班第九节
rand指针是单链表节点结构中新增的指针,rand可能指向链表中的任意一个节点,也可能指向null。3给定一个单链表的头节点head,给定一个整数n,将链表按n划分成左边<n、中间==n、右边>n。给定一个由Node节点类型组成的无环单链表的头节点head,请实现一个函数完成这个链表的复制。返回复制的新链表的头节点,要求时间复杂度O(N),额外空间复杂度O(1)输入链表头节点,奇数长度返回中点前一个,偶数长度返回上中点前一个。输入链表头节点,奇数长度返回中点前一个,偶数长度返回下中点前一个。
2024-03-02 20:34:44
363
原创 左程云新手班第八节
方法先找最大值,不够最大数的位数的位上补零,然后建10个桶,这几个数按个位数字进桶,然后从0号桶往外倒数字,先进的先出去,之后根据十位数字进桶,之后循环直到每一位都进过桶。2计数排序:已经知道要排序的数的限制范围,建立多个桶来排序(代码略)稳定:冒泡(合理处理相等时情况)插入 归并(相等时先拷贝左边)3 排序算法稳定性:相同大小数据经过排序后是否改变相对次序。这两种排序都为桶排序思想,不是基于的比较排序。在非基础类型排序方面有用,比如学生年龄排序。基数排序:范围非负数且十进制表示。
2024-03-02 17:40:28
337
原创 体系班第七节
方法二:将线段按开始位置由小到大排序,再建立一个小根堆,将小根堆内部小于开始位置的数全弹出,此时小根堆有几个数就重合几条线段,并将该线段结尾加入小根堆。指标发生变化,系统提供的堆做不到o(logn)级别调整 系统提供的堆只能弹出顶部元素,不能自由删除元素,要建立反向索引表。意义在于以每条线段为左边界时,会有几条线段越过他往外穿,因为最大重合区域一定是有某一个左边界。1 给定很多线段,每个线段都有两个数[start, end],方法一:枚举所有区间上每个“.5”包含的线段,比较求出最大值。
2024-03-02 15:35:20
345
原创 体系班第六节
插入删除的时间复杂度:由于每次只和自己的父节点或者子节点比较,所以时间复杂度相当于二叉树高度(logn)将数组中的数构成大根堆,然后将大根堆的头节点去掉放在原数组中最后,之后调整前面的大根堆,周而复始。4已知一个几乎有序的数组。几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离一定不超过k。请选择一个合适的排序策略,对这个数组进行排序。完全二叉树的子树最大值在根部的为大根堆,最小值在根部的为小根堆。左孩子在2*i+1,右孩子2*i+2,父节点为(i-1)/2。堆为数组实现的二叉树结构。
2024-02-28 21:03:21
344
原创 体系班第四节
2在一个数组中,任何一个前面的数a,和任何一个后面的数b,如果(a,b)是降序的,就称为降序对。3在一个数组中,对于任何一个数num,求有多少个(后面的数*2)依然
2024-02-28 15:50:26
349
原创 体系班第三节
master公式分析递归时间复杂度。1在链表中删除指定值的所有节点。3实现有getMin功能的栈。2用环形数组实现栈和队列。6递归得到数组最大值。
2024-02-26 21:08:31
353
1
原创 体系班第二节
a&(-a)即可,因为一个数取反后,最右侧的1右边的数全会变成1,最右侧的1处的数变成了0,加一后最右侧的1以后的全部恢复为0,该处也恢复为1。3一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这两种数。2一个数组中有一种数出现了奇数次,其他数都出现了偶数次。2怎么把一个int类型的数,提取出二进制中最右侧的1来。4一个数组中有一种数出现K次,其他数都出现了M次。1 异或运算实现交换。
2024-02-26 17:30:18
341
1
原创 左程云新手班第七节
5 判断搜索二叉树 //中序遍历递增也可解出来。4在二叉树上收集所有达标的路径和。1二叉树按层遍历并收集节点。2 判断是否是平衡二叉树。
2024-02-07 21:55:44
384
1
原创 左程云新手班第六节
5用先序数组和中序数组重建一棵树。7二叉树先序、中序、后序遍历。2 判断两颗树是否结构相同。3判断一棵树是否是镜面树。4返回一棵树的最大深度。
2024-02-06 13:22:02
332
1
原创 左程云新手班第四节
例子 1 -> 3 -> 3 -> 5 -> 7 2 -> 2 -> 3 -> 3-> 7。返回 1 -> 2 -> 2 -> 3 -> 3 -> 3 -> 3 -> 5 -> 7。调整前:1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8,k = 3。调整后:3 -> 2 -> 1 -> 6 -> 5 -> 4 -> 7 -> 8。例子 4 -> 3 -> 6 2 -> 5 -> 3。给定两个有序链表的头节点head1和head2,
2024-02-05 18:57:45
364
1
原创 新手班第三节
此时数组不需要排序,只要第二个数小于等于第一个数,且倒数第二个数比倒数第一个数小,此范围内一定有最小值。1.2有序数组中找到>=num最左的位置。1.3有序数组中找到<=num最右的位置。1.4局部最小值问题。
2024-01-30 18:36:52
350
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人