登录社区云,与社区用户共同成长
邀请您加入社区
本文探讨了四种高级贪心算法策略,通过降维、反向排除和错位插空等技巧解决复杂问题。首先在俄罗斯套娃信封问题中,通过巧妙排序将二维问题降为一维LIS问题;其次在可被三整除的最大和问题中,采用反向排除法根据余数选择最优解;最后在条形码和字符串重构问题中,利用错位插空法确保相邻元素不同。这些策略展示了贪心算法在复杂场景下的灵活运用,能有效提升解题效率。
本文介绍了股票买卖问题中的状态机模型解法,通过分析不同交易限制条件下的状态转移关系来求解最大利润。主要涵盖三种典型问题:含冷冻期、含手续费和最多两笔交易的情况。对于含冷冻期问题,定义了持有股票、可交易和冷冻期三个状态;含手续费问题简化为持有和空仓两种状态;最多两笔交易问题则引入交易次数作为新维度。每种情况都给出了清晰的状态转移图和对应的动态规划实现代码,展示了如何将复杂交易规则转化为状态转移方程,
摘要 本文系统讲解网格图动态规划模型,从一维跳台阶问题扩展到二维网格路径问题。核心内容包括: 基础套路:定义dp[i][j]表示到达(i,j)的状态值,通过多开一行一列处理边界条件。 经典题型: 不同路径:计算无障碍网格从左上到右下的路径总数 带障碍路径:遇到障碍物时路径数为0 礼物最大值:取上方或左方的最大值加上当前值 实现技巧:虚拟边框初始化(如dp[0][1]=1),统一处理边界情况,避免复
一文带你万字解读C++异常,通俗易懂,易用
这题有一个要特别注意的点 箱子也占一格 可能会把人挡住 所以不能一开始就用并查集预处理空白点的联通性 要动态判断两点间的联通性。不是人走的步数 人可以走任意步数 每次推箱子 要走到箱子移动方向的另一头 如果此时没有路能到这个点 就不能推。'S’是玩家初始位置'B’是箱子初始位置 'T’是箱子目标位置。比如有时候人在箱子右边 上下都是墙 人就会被箱子挡住。箱子在同一个点 人在箱子左边 这时候就不会被
贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,只做出在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
“脱单”
元旦快乐
LinkedList的底层是双向链表结构,由于链表没有将元素存储在连续的空间中,元素存储在单独的节点中,然后通过引用将节点连接起来了,因此在任意位置插入或者删除元素时,不需要搬移元素,效率比较高。在集合框架中,LinkedList也实现了List接口,具体如下:【说明】LinkedList实现了List接口。LinkedList的底层使用了双向链表。LinkedList没有实现RandomAces
哈希表
本篇博客讲述了两道超经典的题目,通过这两道题目的学习,我们对链表的理解便也会更加的深入,在以后数据结构的学习的过程当中也就更加得心应手!
【优选算法 — 双指针】双指针小专题和为 s 的两个数快乐数盛最多水的容器三数之和四数之和
前缀和是指从数组的起始位置到某一位置(或矩阵的某个区域)的所有元素的和。这种算法通过预处理数组或矩阵,计算出每个位置(或区域)的前缀和,并将其存储在一个额外的数组或矩阵中,以便在后续查询中可以快速获取任意区间(或区域)的和。对于一维数组,可以使用递推公式来计算前缀和;对于二维矩阵,可以使用类似的递推公式,但需要考虑更多的边界情况。接下来我会用两个题来详细讲解前缀和的使用。
★ 算法OJ题 ★ 二分查找算法
果继续像⽅法⼀⼀样,重新开始统计第⼆个元素( left2 )往后的和,势必会有⼤量重复的计算(因为我们在求第⼀段区间的时候,已经算出很多元素的和了,这些和是可以在计算下次区间和的时候⽤上的)。让滑动窗⼝满⾜:从 i 位置开始,窗⼝内所有元素的和⼩于 target (那么当窗⼝内元素之和。断是否满⾜条件并更新结果(因为左端元素可能很⼩,划出去之后依旧满⾜条件)▪ 如果窗⼝内元素之和不满⾜条件: ri
left[cur1]>right[cur2],由于两个数组都是升序的,那么我们可以断定,此刻left数组中[cur1,2]区间内的3个元素均可与right[cur2]的元素构成逆序对,因此可以累加逆序对的数量ret+=3,并且将right[cur2]加⼊到辅助数组中,cur2++遍历下⼀个元素。left[cur1]==right[cur2],因为right[cur2]可能与left数组中往后的元素
在传递给函数之前, nums 在预先未知的某个下标 k(0 <= k < nums.length) 上进⾏了旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1],通过图像我们可以发现, [A,B] 区间内的点都是严格⼤于 D 点的值的, C 点的值是严格⼩于 D 点的值的。例如, [0,1,2,4,5,6,7] 在下标 3 处
可以利用left和right双指针,此时需要一个统计数kinds去记录这个区间水果的种类,当kinds不超过2时right向右进行移动,便是利用hash思想,如果说超过便停止,此时移动left,这是只需要用双指针将整个数组遍历一遍(这里用数组不用hash是因为题目给的范围用数组会更高效,范围比较小如果用hash反而一直进出,时间复杂度会变高),那么整个题的时间复杂度便非常可观!然⽽,农场的主⼈设定
么)abcdef),)abefcd),)cdabef),)cdefab),)efabcd),和)efcdab)都是串联⼦串。输⼊:s=)wordgoodgoodgoodbestword),words=[)word),)good),)best),)word)]输出:[]输⼊:s=)barfoofoobarthefoobarman),words=[)bar),)foo),)the)]输出:[6,9,1
⼤思路与求逆序对的思路⼀样,就是利⽤归并排序的思想,将求整个数组的翻转对的数量,转换成三部分:左半区间翻转对的数量,右半区间翻转对的数量,⼀左⼀右选择时翻转对的数量。但是在我们归并排序的过程中,元素的下标是会跟着变化的,因此我们需要⼀个辅助数组,来将数组元素和对应的下标绑定在⼀起归并,也就是再归并元素的时候,顺势将下标也转移到对应的位置上。这⼀道题的解法与求数组中的逆序对的解法是类似的,但是这⼀道
第⼀项是数字1描述前⼀项,这个数是1即“⼀个1”,记作"11"描述前⼀项,这个数是11即“⼆个1”,记作"21"描述前⼀项,这个数是21即“⼀个2+⼀个1”,记作"1211"描述前⼀项,这个数是1211即“⼀个1+⼀个2+⼆个1”,记作"111221"要描述⼀个数字字符串,⾸先要将字符串分割为最⼩数量的组,每个组都由连续的最多相同字符。countAndSay(4)=读"21"=⼀个2+⼀个1="1
想知道有多少个「以 i 为结尾的和为 k 的⼦数组」,就要找到有多少个起始位置为 x1, x2, x3... 使得 [x, i] 区间内的所有元素的和为 k。那么 [0, x] 区间内的和是不是就是。• 设 [0, x - 1] 区间内所有元素之和等于 a , [0, i] 区间内所有元素的和等于 b ,可得。sum[i] - k。设 i 为数组中的任意位置,⽤ sum[i] 表⽰ [0, i]
【oj刷题】——双指针篇:双指针在我们做题还有完成小项目时都会经常用到,本篇详细讲解了双指针的原理和使用场景,欢迎各位大佬到访!!!
733.图形渲染,200.岛屿数量,695.岛屿的最大面积,130.被围绕的区域