算法学习
文章平均质量分 58
idiotyi
这个作者很懒,什么都没留下…
展开
-
【算法学习】高级班九
思路:设置一个窗口L到R,当还欠字符时,即all不为0时,R往右扩,更新欠债表{a,b,c},当all为0时,记录此时index=L时,字符串长度,把L往右移,更新欠债表。思路:二维双向链表。每个词频构建一个桶,桶和桶之间双向链表,相同词频的数据放一个桶,并且桶内部还是双向链表。因为从H出发都不能走完一圈,H到尾部的点的油量一定>=0,那么H尾部的点的油不够走完一圈。要求时间复杂度O(1),则不能遍历,也不能有序表(O(logN))从A出发,发现H是良好出发点,那么往后只用看点是否能接上H的头即可。原创 2023-08-11 22:09:04 · 179 阅读 · 0 评论 -
【算法学习】高级班八
(1)i在from,则还在把1到i-1挪到to的步骤。(2)i在to,则在把i+1到L挪到to的状态。(3)i在other,-1,不存在。原创 2023-08-10 16:36:05 · 79 阅读 · 0 评论 -
【算法学习】高级班七
沿着左孩子的右分支,(10,12,16)都小于18,因此他们的左孩子一定也小于18,但20大于18,因此舍弃这个分支。由公式可以依次类推下一个数字应该去的下标,但是有可能一组数字构成一个循环,而与别的数字不相交,即依次类推这样的做法最后得到了多个环。比如(2,6)和(3,6)有重复部分,不需要重复计算,dp[2][6] = dp[2][4]+dp[3][6]补充:如何做到一个数组的两部分交换位置,空间复杂度O(1)。(3)用上面的方法调整那8个数,然后剩下的重复步骤1到3。(1)求最接近的k,k=8。原创 2023-08-10 10:20:05 · 80 阅读 · 0 评论 -
【算法学习】高级班六
从右上角开始往回推,发现0到7范围的答案来自1到7,说明index=10的位置等于index=0,依此类推。a. 先搞定i前面的字符,然后添一个和i一样的,即dp[i][j]=dp[i+1][j]+1。b. 先搞定j后面的字符,然后添一个和j一样的,即dp[i][j]=dp[i][j-1]+1。c. 若i=j,则dp[i][j]=dp[i+1][j-1]dp[i][j]表示i到j范围到底有多少种保留方案。画勾的可以两两配对一条船了,画叉的进一步分析。左边的叉可以两个一组,右边的只能一个一条船。原创 2023-08-08 19:21:25 · 59 阅读 · 0 评论 -
【算法学习】高级班五
假设没有括号,设置一个int num和一个栈,遇到数字置num,遇到符号,把num和符号一起压栈,num清空。可以发现,如果没有缓存,(6,6)和(7,6)都需要多次计算。9=576,把576和下一个+一起压栈。或\时,栈中弹出两个元素做乘除,然后再压栈。如num=9且遇到+时,栈顶是。原创 2023-08-08 15:54:40 · 30 阅读 · 0 评论 -
【算法学习】高级班4
解题思路:拿的时候让异或和变为0,那么下一个人不管怎么拿异或和都不是0,先手每次都可以让异或和重新为0。即谁先导致异或和=0出现,谁就会一直赢。将每个位置数组替换表达:如(2,5,6)变成(2,add, 6)和(5,del,6)使用两个有序表map1(统计最大高度和出现次数),map2(统计坐标位置和最大高度)最后map2中的就是轮廓线。原创 2023-08-06 11:15:08 · 30 阅读 · 0 评论 -
【算法学习】高级班1
当kth<s时,第k大的数只可能出现在短数组或长数组的前k个数里面,因此求前k个数的上中位数就行了。求上中位数的方法是通过确定两个数组的中位数进行优化的。对于i位置,最优划分意味着一定是离i最近的能实现xor等于0的位置进行划分,假设划分k到i,若k不是最近的,中间还存在一个L,那么k到L和L到i可以形成两个划分。shorts[kth-l - 1]>=longs[l-1]代表longs中的所有数字在shorts可能是第k大的数字前面。k<短的数组长度时,答案位于两个数组的前k个数字中。原创 2023-08-06 09:58:28 · 29 阅读 · 0 评论 -
【算法学习】中级班9
设一个二维dq数组,dp[i][j]表示str1[0…i]编辑成str[0…去掉天数增加,钱没有增加的。原创 2023-08-02 18:33:37 · 29 阅读 · 0 评论 -
【算法学习】中级班8
贪心:对于任意.位置,如果i+1是x,则i位置放灯,若i+1是.则放i+1位置。使用hash表记录中序数组中每个数字的位置,不再需要遍历找find数字。4. 最长递增子序列问题。法二:O(logN)原创 2023-08-02 11:30:27 · 34 阅读 · 0 评论 -
【算法学习】中级班六
解释:组成三角形要求x+y<=z,即最大的边长度大于等于其他两条边,对于任意i位置,只要i-2和i-1位置相加不大于i位置,则前面也肯定不大于,因此只要使f(i)=f(i-1)+f(i-2)事实上就是斐波那契数列,设F(i)表示长度为i时的达标字符串数,由定义知道,i位置的数字只能是1,则F(i) = F(i-1)+F(i-2)有序表:先按难度由小到大排,难度一样按照报酬由大到小。即求木棍中斐波那契数有哪些,就是可以保留的木棍。原创 2023-08-01 13:40:54 · 26 阅读 · 0 评论 -
【算法学习】中级班五
6. 咖啡杯问题:arr代表冲咖啡的几台机器分别需要的时间,N代表喝咖啡的人数,a和b分别代表洗咖啡杯的时间和自然挥发干净的时间(要么一个个洗干净,要么自然变干净,前者只能串行后者可以并行)。当全局的max在左边时,右边最大值一定>=arr[N-1],那么max|max左-max右|是划分在arr[N-1]处;设计一个小根堆,里面的每一个元素是一个二维的:(咖啡机空闲时间,咖啡机泡咖啡的时间),按照二维数字和组织小根堆。p2表示如果当前被子直接晾干,完成所有杯子清洗所需的时间。2的倍数但不是4的倍数b个;原创 2023-07-27 21:09:45 · 38 阅读 · 0 评论 -
【算法学习】中级班四
boolean f是控制斜线的打印方向,从右上往左下(true),还是反过来(false)。定义A和B两个点,A一直往右走,B一直往下走(走到头就往右走),若压在一条斜线就打印。假设[100,0,0,0],节点的结果是[75,75,50,25]每次确定左上和右下两个点,打印完一圈,这两个点向内移动。a和b是左上角的行列,c和d是右下角的行列。取所有节点结果的最大值。原创 2023-07-25 20:43:07 · 44 阅读 · 0 评论 -
【算法学习】中级班二
分析发现,只有两个集合平均值不相等,从大的往小的拿才可能导致两个平均值变大,应该拿介于两个集合平均值之间的数据。为了使次数最多,应该每次把两个平均值之间的数排序,拿最小的那个。F(i)*F(N-i-1),i从0到N-1。代表左右两棵树的方法数乘积。原创 2023-07-25 15:19:59 · 31 阅读 · 0 评论 -
【算法学习】中级班三
如果此时i位置是右括号,i-1位置值是p,往前推,若i-p-1位置是左括号,则i位置应该是i-1位置的值+2+(i-p-2)位置的值;若i-p-1是右括号,则为0。设置count,左括号+1,右括号-1,count达到的最大值就是深度。先看第二列,由于5小于7,则5左边的数一定不等于7,同理排除6。相当于求每个括号所在位置为右边界(左边界)的最长有效括号子串。假设找7,从右往左看第一行,确认前两列的最小值都小于7。2. 给你一个括号字符串,找到最长的有效括号子串。左括号所在位置一定是0。原创 2023-07-25 10:46:15 · 31 阅读 · 0 评论 -
【算法学习】中级班题目训练一
题意:变成左侧全是R,右侧无R使用两个数组分别记录arr[0…L]上的R数和arr[L…可以肯定的是奇数个肯定不能装下。原创 2023-07-22 19:48:35 · 38 阅读 · 0 评论 -
【算法学习】暴力递归和动态规划
马(马走日)从(0,0)到(x,y)位置,必须走k步,棋盘大小是9X10,返回方法数。给一个整数数组,代表零钱,给一个int,零钱凑成int,最少需要几个零钱。一个数组,两个人依次拿牌,可以拿头或尾,求最大分值。给定棋盘,可以上下左右走,越界则死亡,求生存概率。所有step层的数都只和step-1层相关。变化的参数有三个: x, y, step。每个格子的值等于左上角+右上角的值。如果不求最少,有多少种方法。原创 2023-07-19 15:40:43 · 40 阅读 · 0 评论 -
【算法学习】大数据题目和位运算
10MB约等于3kb,定义一个int[]数组,数组每一个元素占4字节,3kb/4字节,相当于每个4字节占用差不多512空间,即需要512个int,现在相当于把2^32分到512空间(512个int),即每个int分到8388608(int[]是用来做词频统计的,对于每一个数字,除以8388608可以分到int[]中不同位置,即对应位置词频++,40亿个数字分完后,一定有一个区间不够8388608。一个10G文件,存储的无符号int,现在变成一个新文件,有序且只有5G内存,怎么实现。原创 2023-07-15 18:06:15 · 34 阅读 · 0 评论 -
【算法学习】二叉树的Morris遍历等
判读一棵树是不是搜索二叉树:中序遍历是升序则是搜索二叉树。原创 2023-07-13 11:16:31 · 27 阅读 · 0 评论 -
【算法学习】滑动窗口、单调栈结构等
维护一个单调栈,依次添加元素进去,当遇到一个数字添加会违反单调性,弹出,弹出的数字就可以得到理他最近的左边(他下面的数字)和右边的最大值(让他违反单调性的数字)对于一个数组,求对于每个数字,左边离他最近的比他大的,右边最近的比他大的。思路: 求以每个数为最小值,向两边扩的最长数组。原创 2023-07-13 09:44:10 · 25 阅读 · 0 评论 -
【算法学习】KMP、Manacher算法
维护一个单调栈,依次添加元素进去,当遇到一个数字添加会违反单调性,弹出,弹出的数字就可以得到理他最近的左边(他下面的数字)和右边的最大值(让他违反单调性的数字)当str1走到x,str2走到y时发现不匹配,查看y之前的最大前后缀匹配,str2推到最大后缀处和str1重新比较。对较短的str2中的每个字符都需要求k,求的是每个字符之前的字符串的最长前缀和后缀匹配。对于一个数组,求对于每个数字,左边离他最近的比他大的,右边最近的比他大的。时间复杂度从O(N^2)变成O(N)0位置和1位置默认-1和0。原创 2023-07-12 21:49:41 · 29 阅读 · 0 评论 -
【算法学习】有序表、并查集等
union(a, b): 指针挂上去,最好是少的集合挂在多的上面。假设分成左右两块用两个cpu,记录边界信息,进行并查集操作。isSameSet(a, b): 往上找看是不是一个集合。好处是下次寻找某个节点的head不用遍历整个链表了。原创 2023-07-12 15:29:20 · 26 阅读 · 1 评论 -
【算法学习】哈希函数和哈希表
传统底层数据服务器存储是用哈希值取模的方法,那么如果高频,中频,低频取模后在数据服务器上均匀分布,则认为负载均衡。删除某个index后,把最后一个str移过去(为了保证index连续,避免random时出现空)假设每个机器m都有1000个虚拟节点,现在抢环不是m抢,是3000个虚拟节点抢,按比例抢环。某个格子串的链表可能过长,扩容(增加格子数),然后将17个格子的东西放到新的格子里。好处是在环上增加一个机器m4时数据迁移的代价小,只用迁移增加处的数据。即可以根据实际机器的状况给机器分布不同数量的虚拟节点。原创 2023-07-09 11:49:48 · 47 阅读 · 1 评论 -
【算法开发】动态规划相关
ArrayList作为形参,使用add等接口方法是地址传递,如果用=是值传递。打印一个字符串的全部子序列,包括空字符串。法1更好,可变参数少。原创 2023-07-08 18:04:39 · 43 阅读 · 1 评论 -
【算法学习】前缀树和贪心算法
colLim|leftDiaLim|rightDiaLim是全部的限制,pos代表能放皇后的位置。nexts可以换成HashMap,当字符特别多的时候,不止26个。(2)对数组中的字符串拼接,使最后拼接的大字符串的字典序最小。哈夫曼编码:按照字符的概率分配码长,实现平均码长最短的编码。平衡树+堆:某个堆的size比另一个大2时弹出进入另一个。先从小根堆取出现有资金能满足的,再按利润放进大根堆。使用比较器比较字符串a和b的拼接:ab原创 2023-07-06 18:08:30 · 57 阅读 · 1 评论 -
【算法学习】图
getMinDistanceAndUnselectedNode()是指从distanceMap中选一个最小距离的点,并且不能是选过的点。任选一个起始点,挑一个最小边(与起始边相连的边中)新增一个点后,再在所有最小边中选一个最小边。最小生成树:图联通且边的权值最小。依次加入最小边(只要没有出现环)set是为了防止环出现死循环。每次取图中入度为0的点,去掉。原创 2023-07-05 16:04:00 · 52 阅读 · 1 评论 -
【算法学习】二叉树
先一直遍历到最后一棵左子树(过程中preValue一直不变),然后preValue变成最后一棵左子树的head(preValue<head),此时遍历head的右子树(右节点>preValue(head)),依次往上。每次preValue先变成左节点,再变成head(上一层的左节点)每压一个节点入栈,如果他有左分支,需要把左分支这条直线也入栈。使用队列(先进先出),弹出一个数,然后放其左再放右进去队列。(2)x无右树,往上找,直到寻找到某一层的左节点。(1)x如果有右树,右数上的最左节点为后继节点。原创 2023-07-05 14:37:22 · 148 阅读 · 1 评论 -
【算法学习】链表
第7条即一律8字节快指针一次走两步,慢指针一次走一步,快指针走完时,慢指针正好到中点。原创 2023-07-01 21:05:45 · 20 阅读 · 0 评论 -
【算法学习】排序问题
快排是最优选,如果有空间限制再选堆,需要稳定性选归并。坑:很难,经典快排的划分不具有稳定性,需要进行论文级别的研究。原创 2023-07-01 16:57:03 · 119 阅读 · 0 评论 -
【算法学习】位运算
本专题是对算法课程学习的一个笔记整理,本节内容主要是关于位运算的常见操作。原创 2023-06-29 20:34:22 · 31 阅读 · 0 评论