- 博客(77)
- 收藏
- 关注
原创 每日一题2609. 最长平衡子字符串
2、当前字符为1,则说明当前计数结束,由于字符串要根据0和1的最少数目来进行构建(“0000111”肯定是按照1的长度来构建,“001111”肯定以0的长度来计算),所以计算结果为min(result, 2 * min(count[0],count[1])).3、当字符为0,且上一个字符为1的时候,说明当前计数的字符串已经不是平衡字符串了,因此清空前面的数据置零,并count[0]+1;直接构建n长度的字符串,使其符合000111的规律,然后滑动进行匹配。1、如果当前字符为0,则正常进行计数。
2023-11-08 12:57:31
308
原创 每日一题318. 最大单词长度乘积
使用哈希表进行暴力解法有个问题,因为一共n个字符串,每个字符串之间都要进行,因此一共需要n!如果每次都使用int[26]的数组进行循环对比非常耗时。因此,由于小写字母的索引是连续的,并且只有26个,因此可以使用位运算的方法来实现快速的对比索引。当两个位运算与操作为0,则说明没有重叠的数据。直接构建二维数组,将每个字符串的哈希表存储进入二维数组,然后逐个进行对比。如果符合计算要求,则进行长度乘积计算,并存储最大值作为结果。所以将哈希操作替换为二进制位掩码操作,然后进行逐个校验。
2023-11-06 16:05:22
257
原创 每日一题411数组中两个数的最大异或值(哈希表、前缀树:实现前缀树)
其实因为算法从高位计算,如果高位已经确定可以到达1,那么后面就由这个结果倒推罢了(交换律,在高位已经置1的条件下进行接下来的推导)因此并不会出现这种问题。个人理解,字典树适合查询一些可重复的状态类别,比如当前需要查询的数据,是之前所有已经放入的数据总和的情况下,字典树十分方便。可能有人会疑问,这样循环30次,会不会可能导致每次异或的i和j,与上一轮k的不一样,那不就不符合唯一的i 和 j了嘛?因此便可以应用异或的交换律,将数组中的数值num右移k位以映射为当前从30位到第k位的二进制数值。
2023-11-04 14:23:45
315
原创 JAVA二刷-Day16 | 104.二叉树的最大深度, 111.二叉树的最小深度, 222.完全二叉树的节点个数 (递归)
本题应当注意的是,比较的最小深度指的是root节点到最近的叶子节点的深度,不能直接判定如果左右子树有一个为null便直接返回数值。要注意递归的整体架构可以确定为前序遍历,中序遍历,后序遍历三种类型。完全二叉树由于特有的性质,可以看做是很多个小的满二叉树的集合,因此可以通过满二叉树的特性来进行计算,即满二叉树的节点个数为。,n为满二叉树的高度。因此,可以当判定节点空或者为满二叉树时,计算节点数并返回,如果没有满足,则向下递归。因此通过满二叉树的特点进行了截断,避免了冗余的递归操作。
2023-07-27 11:26:10
128
原创 JAVA二刷-Day15 | 层序遍历*10, 226.翻转二叉树, 101.对称二叉树
LeetCode题目:102.二叉树的层序遍历107.二叉树的层次遍历II199.二叉树的右视图637.二叉树的层平均值429.N叉树的层序遍历515.在每个树行中找最大值116.填充每个节点的下一个右侧节点指针117.填充每个节点的下一个右侧节点指针II104.二叉树的最大深度111.二叉树的最小深度。
2023-07-26 17:05:05
111
原创 JAVA二刷-Day14 | 144.二叉树的前序遍历, 145.二叉树的后序遍历, 94.二叉树的中序遍历
迭代方法由于要满足弹出时候的左中右或者中左右或者左右中顺序。
2023-07-25 12:48:27
238
原创 JAVA二刷-Day13 | 239. 滑动窗口最大值, 347.前 K 个高频元素
今天的内容涉及到:双向队列的定义和库:https://blog.youkuaiyun.com/top_code/article/details/8650729小顶堆优先级队列的库:https://blog.youkuaiyun.com/BillieFan/article/details/107578057LeetCode题目链接:https://leetcode.cn/problems/sliding-window-maximum/ 考虑到时间复杂度的问题,如果使用暴力解法的时间复杂度为O(n∗k)O(n*k)O(n∗k),因
2023-07-24 13:40:18
64
原创 JAVA二刷-Day11 | 20. 有效的括号, 1047. 删除字符串中的所有相邻重复项, 150. 逆波兰表达式求值
因此根据以上特性,可以轻松写出代码,本题应注意的是将string转为int类型变量可以调用Integer.parseInt(String s)。遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中。新的右括号一定要和最后的左括号进行比较,因此是LIFO策略的栈进行计算比较合适。要消除相邻重复项,思路和消除相邻的左右括号类似,相同便进行出栈和跳过操作。逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。由于内置jdk的原因,不能使用a == "+"方法比较。平常使用的算式则是一种中缀表达式,如。
2023-07-22 11:20:46
45
原创 JAVA二刷-Day10 | 232.用栈实现队列, 225. 用队列实现栈
队列属于FIFO(先进先出)类型,因此想要模仿栈的后进先出,可以通过单个队列的循环进行,直接单个队列循环到最后一个,并将最后一个元素只pop,不再push进入队列即可。由于栈是LIFO(后进先出),因此想要吧最里面的拿出来,需要多设计一个栈来进行顺序的颠倒,然后进行pop操作后再复位。特别的,注意队列的压入和弹出,使用的是offer和poll、同时,java中的队列是通过linkedlist的接口实现,所以new创建的是linkedList。
2023-07-21 17:05:02
58
原创 JAVA二刷-Day9 |KMP: 28. 实现 strStr(), 459.重复的子字符串
KMP的主要思想是当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配了。因此,重点在于如何记录已经匹配的文本内容?核心在于引入记录索引的地址,即可以看做,如果前面存在已经匹配的内容了,我们应该通过一个索引值来确定已经匹配内容的位置,并以这个位置重新进行迭代。记录这个索引的方式就叫做前缀表(prefix table: next),如何理解这个概念呢?举一个例子:要在文本串:aabaabaafa 中查找是否出现过一个模式串:aabaaf。
2023-07-21 17:03:43
96
原创 JAVA二刷-Day8 | 344.反转字符串, 541. 反转字符串II, 剑指Offer 05.替换空格, 151.翻转字符串里的单词, 剑指Offer58-II.左旋转字符串
先看题目,想要翻转题目中的字符串,首要的操作应该是消除掉多余的空格,这里需要特别注意几点,在消除空格的时候,设置双指针来进行覆盖操作,此时单词之间需要添加空格。此时需要注意的是该题的判定条件比较复杂,如果用正常的迭代思路来做,需要先进行一次是否2k的判定,再判定后再对k的范围进行判断,然后进行翻转。此外,也需要注意在之后翻转时,先对整体进行翻转,在对逐个单词进行翻转,此时如果判定到空格再进行翻转的话,那么最后一个单词一定不会被翻转到。技巧题,这种局部进行翻转的题目,把握整体翻转后局部翻转的技巧即可。
2023-07-19 11:29:43
54
原创 JAVA二刷-Day7 | 哈希表 454.四数相加II, 383. 赎金信, 15. 三数之和, 18. 四数之和
k+1不循环是对数值的保护。在特殊情况,比如数组所有元素值相同的时候,第一个元素不进行去重是为了能将四个数值都在数组中的位置初始化出来。就像第一层循环要k>0在进行后面判断一样,一方面是为了可以查询到k-1,另一方面也保证就算所有元素相同,代码也可以初始化出四个数的位置,以此跑一次完整的流程。使用java的时候,因为是连续的字母作为map进行搜索所以其实不用使用hashmap结构,增加冗余的搜索,直接使用char[]数组即可。进行去重的时候不仅是第一个数字需要去重,其他的两个数字在使用后也应当进行去重。
2023-07-18 13:05:39
98
原创 JAVA二刷-Day6 哈希表 242.有效的字母异位词, 349. 两个数组的交集, 202. 快乐数, 1. 两数之和
快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。因此涉及到查询,可以使用哈希表进行存储,因为要输出索引,因此存储时应当存储数值和索引两个值的pair。注意java中获取string中字符使用的是charAt(index)方法,同时数组的长度为.length,不加()。特别注意,因为要求交集元素唯一,所以在查询到一次后,该处元素应该不再被查询,代码上将查询后的哈希值赋值为0。
2023-07-17 13:13:00
93
原创 JAVA二刷-Day4 24. 两两交换链表中的节点, 19.删除链表的倒数第N个节点, 面试题 02.07. 链表相交, 142.环形链表II
再使长度不等的链表中较长的链表去除头部元素,使其到尾部节点的距离相同,再进行迭代,就可以轻松判定出是否相交了。先看题目,首先需要判断链表是否有环,因此可以进行判断,一旦指针在迭代时出现->next=NULL则说明不存在环形,跳出循环并返回NULL。删去倒数第n个元素,那么首先要知道整个链表的长度,在已知链表长度的基础上,可以得出倒数第n个值是正数的第几个节点。之后进行环形判断,当链表存在环形,易得快慢指针一定存在交点。为一个环形,因此可以看作:从交点位置出发,与从链表头出发,一定会在环形的起点处相遇。
2023-07-17 13:10:42
83
原创 JAVA二刷-Day3 203.移除链表元素,707.设计链表 ,206.反转链表
LeetCode题目链接:https://leetcode.cn/problems/remove-linked-list-elements/
2023-07-14 15:05:37
99
原创 JAVA二刷-DAY2 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II
LeetCode题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/
2023-07-14 15:04:54
107
原创 JAVA二刷-DAY1 二分查找 + 移除元素
LeetCode题目链接:https://leetcode.cn/problems/binary-search/
2023-07-14 15:04:19
168
原创 代码随想录算法训练:个人感想总结篇
此外,也吃到了Markdown的安利,之前从来不喜欢在网上和电脑上记录笔记,但经过这60天,确确实实有什么项目的东西也会想开个markdown记一下笔记和思路,相信对以后也会有不小的帮助。特别是去打算法比赛(真的是第一次),开始很紧张,当时好像刚跟完回溯部分,中间有一道题就用了Carl哥教的回溯模板和思想写了出来,最后拿了个三等奖。所以这次正巧那段时间事情不多,把小论文投了出去,老板没有什么项目,就报了一个网上的算法挑战赛和卡哥的训练营,狠狠地开始刷算法。
2023-07-08 18:13:21
1389
原创 Day60 | 84.柱状图中最大的矩形
此时,当遇到比栈顶元素要小的当前元素值的时候,就可以从当前栈顶元素作为高度,栈顶元素的下标和当前元素值的下标求差值,即是矩形的宽度。如果在该题中维护一个从栈顶到栈底单调递增的单调栈,那么计算的面积都会被最小的高度值所限制,需要各种的判定不说,计算结果也存在问题!末尾加0:如果数组本身就是升序的,例如[2,4,6,8],那么入栈之后 都是单调递减,一直都没有走 情况三 计算结果的哪一步,所以最后输出的就是0了。首部加0:数组本身是降序的,那么第一个元素会因为代码逻辑的问题,提取后栈为空值,无法进行计算。
2023-07-08 17:57:26
295
原创 Day59 | 503.下一个更大元素II, 42. 接雨水
本题与上一个i的区别在于末尾的元素也要进行单调栈的对比操作。因此,可以让循环多向后进行一个长度的循环即可。此外不用对两个数组进行操作,因此使用单个的单调栈循环即可,无需额外的操作。
2023-07-08 17:55:51
267
原创 Day58 | 739. 每日温度, 496.下一个更大元素I
单调栈的简单扫盲题目。主要体现出单调栈的思想:维护一个单调递增或是单调递减的序列,以便于题目中的操作。要维护单调栈的单调性,因此需要向栈中初始化一个元素,否则没有参照对比,没办法确定单调性。本题使用单调栈维护后,遇到大于当前栈顶元素的值,即相当于最近的一天确定了最近一次温度比自己高的天数,然后进行栈的弹出。
2023-07-08 17:54:59
257
原创 Day57 | 647. 回文子串, 516.最长回文子序列
回文子串主要的难点在于遍历顺序和数量的确定方法。因为回文要求从首尾两端进行判定,因此一维DP无法满足同时包含起始点和终止点的信息。因此需要二维DP。同时,如果判断首尾两端相同,且内部存在两个以上的字符,则需要对内部的状态进行判定,判断是否内部也是回文,如果内部也是回文字符串,则状态转移成功,当前也是。为了此处的判断,DP数组应该使用bool来作为状态值。此外,遍历顺序也是需要考虑的。如果两次循环均从头开始进行遍历,会造成重复计算某些状态,产生重复的计数。因此,采用倒序遍历的方法进行循环。bool。
2023-07-07 22:06:12
278
原创 Day56 | 583. 两个字符串的删除操作, 72. 编辑距离
今天的两道题与昨天类似,DP数组的设定就是以i - 1结尾的word1字符串,和j - 1结尾的word2字符串相同需要的最小步数。因此同理可以进行初始化,当word1为0时候,那么Word2想要相同,就只能减去word2字符数量的字符。也就是进行j次操作。Word2为0的时候Word1也同理。因此初始化同样,每个新的状态都由三种转移的可能,当i - 1 和j - 1的字符相同时,则说明当前匹配的字符不需要删除,因此从对角状态转移,即 dp[i][j] = dp[i - 1][j - 1];
2023-07-07 22:05:22
206
原创 Day55 | 392.判断子序列, 115.不同的子序列
判断子序列,只需要双指针法就能简单写出,但为了编辑距离铺垫,还是用动态规划来写一下。对于动态规划,主要在于DP数组的设定,由于本身就存在两个字符串之间对比,因此状态一定是存在有两个维度的,因此是二维的DP数组,数组代表含义为:下标到i - 1位置的字符串s和下标到j - 1位置的字符串t所匹配的字符个数。
2023-07-07 22:04:09
245
原创 Day53 | 1143.最长公共子序列, 1035.不相交的线, 53. 最大子序和(动态规划)
与要求连续的子数组不同,此时所求为公共子序列的长度,因此并不会要求长度必须连续。因此,会出现新的状态值更新情况。当满足text1[i] == text2[j]的条件时,与原先连续的情况相同,继承i-1和j-1状态时的长度值。当不满足状态时,该位置的状态则由两个状态决定:dp[i - 1][j]和dp[i][j - 1],因为要求为最长公共子序列长度,因此应该选择两个状态值中的最大值来继承。int。
2023-07-01 13:20:43
173
原创 Day52 | 300.最长递增子序列, 674. 最长连续递增序列, 718. 最长重复子数组
因为所求是子序列,因此不要求连续。dp[i]设定为当到达下标为i的位置时,所得到的最长子序列长度。同时,由于是求子数组,所以一定是要求连续的序列,只有符合两个值相等的情况下才可以进行。所继承的状态为上一次nums1[i]和nums2[j]相等的情况时的长度值,i和j同时向前进一位,即dp[i][j] = dp[i - 1][j - 1] + 1;首先,因为是在两个数组内部进行求,涉及到了两个维度,因此需要构建二维dp,分别代表在第一个数组下标在i位置,且第二个数组下标在j位置时候,所存在的最长重复子数组。
2023-07-01 13:17:08
164
原创 Day51 | 309.最佳买卖股票时机含冷冻期, 714.买卖股票的最佳时机含手续费
买卖股票包含冷冻期的情况下,不持有股票的情况下存在三种不同的状态:(1)持续不持有股票且度过冷冻期。(2)不持有股票且正在冷冻期。(3)当天准备不持有股票,即执行卖出股票操作。三种情况只有(1)和(2)状态可以在第二天执行股票的买入操作。因此通过两种状态和持有股票前一天的状态来进行计算。,而其他三个状态则由本身进行递推,当时,它的最大收益应当从度过冷冻期的持有股票状态获取,即从上一天的状态(1)和状态(2)对比获取。当时,它的上一个状态应该是当天准备不持有股票的时候,因此直接从上一天的状态(3)获取。当。
2023-06-29 11:43:11
110
原创 Day50 | 123.买卖股票的最佳时机III, 188.买卖股票的最佳时机IV
买卖股票的最佳时机问题III,此时要求最多购买两次股票。因此对股票的递推公式需要进行一定程度的限制。其限制的核心在于要对当前持有股票时候收益的递推公式进行限制:(1)当只能进行一次股票购买的时候,在持有股票的状态下,之前是不可能发生任何持有股票的事件,因此上一天的dp[i - 1][0]只能和0 - prices[i]0收益减去当前股票价格来进行比较。(2)当不限制次数进行股票购买的时候,在持有股票前可能会存在收益,且收益为前一天不持有股票时候手里的资金。
2023-06-28 20:25:44
109
原创 Day49 | 121. 买卖股票的最佳时机, 122.买卖股票的最佳时机II
买卖股票的最佳时机问题,由于只能购买一次股票,且肯定用i来代表天数,dp的数值来代表收益。因此,单个的状态量很难同时维护购买股票的次数和当前可获得的最大收益等信息。所以需要对两个状态进行维护,分别用来代表当前持有股票的最大收益(因为持有的时候一定为负数,可以理解为维护持有最小花费的股票),当前不持有股票的最大收益(从上一个状态和当前状态来进行对比得到,隐含了一个判断:即如果最小股票和当前股票价格的差值是负数,那么就默认不买,赋值为0)因此,由以上推理,至少需要初始化两个状态才能完成上述状态转移。
2023-06-27 11:00:58
96
原创 Day48 | 198.打家劫舍, 213.打家劫舍II, 337.打家劫舍III(树形DP)
打家劫舍问题的初始问题,很明显,当存在i个房子的时候,打家劫舍的最大收益应该是多少?谈到最大收益,可以判断应该需要使用max来进行处理。同时,打家劫舍要求至少间隔一间房屋,所以递推公式需要考虑当前位置的临近位置,和间隔位置两种情况。因此可以看做是max(间隔房间 + 当前房间收益, 临近房间最大收益),共同来决定最大的收益。因此,由以上推理,至少需要初始化两个值才能完成上述状态转移,其中最开始位置一定是当前房屋的收益。而存在两个房间的时候应该是收益最大值。
2023-06-26 17:34:17
341
原创 Day46 | 139.单词拆分, 关于多重背包,你该了解这些!, 背包问题总结篇
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6VWlPW75-1687771786267)(背包问题1.jpeg “背包问题总结”)]片转存中…(img-6VWlPW75-1687771786267)]
2023-06-26 17:30:00
68
原创 Day45 | 70. 爬楼梯 (进阶), 322. 零钱兑换, 279.完全平方数
爬楼梯问题现在可以抽象成一个完全背包的排列问题。因为每次指定上一个台阶或者两个台阶,所以可以看成有两个分别重量和价值均为1,2的物品可以反复取用。台阶即为背包的容量。因此,由以上推理,问题可以化为:当可以取到x的台阶容量时,有多少种方法组成。即此时dp的容量上限为x,dp[i]意为容量为x时最多有多少种组合方法。所以递推公式为dp[j] += dp[j - nums[i]];
2023-06-24 12:07:33
281
原创 Day44 | 完全背包, 518. 零钱兑换 II, 377. 组合总和 Ⅳ
完全背包和01背包之间的差别就在于,01背包每个物品只可以放一次,而完全背包可以放无数次。因此,与01背包中的一维滚动不同,完全背包不需要在第二次循环时候从右向左去遍历。以此来避免重复取到物品带来的状态提前转移问题。此外,对于完全背包,如果求的是背包容量下的最大价值,两层循环并无不同,因为最后都是得到一个最大值即可。但如果是装满背包的方案问题则存在差异。当第一层循环为物品价值,第二层循环为背包容量的时候,由于每层先对物品进行循环,所以当背包容量判定的时候,物品价值的顺序是确定的。当前状态一定是对。
2023-06-23 18:31:28
197
原创 Day43 | 1049. 最后一块石头的重量II, 494. 目标和, 474.一和零
因此,由以上推理,问题可以简化为:当可以取到第x个物品时,此时dp的容量上限为i,j(二维),dp[i][j]意为二维容量分别为i和j时最多能放下多少物品?因此可以看作多算一个容量部分的01背包问题,所以递推公式为dp[i][j] = max(dp[i - x][j - y] + 1, dp[i][j]);因此可以递推当前第i位置的j容量背包所能承载最大价值为:max(i-1位置容量背包的最大价值,i-1位置背包容量为j-第i个位置物品的容积时背包的最大价值 + 第i个位置的物品价值)。
2023-06-23 16:44:26
574
原创 Day42 | 01背包问题,你该了解这些!, 01背包问题,你该了解这些! 滚动数组, 416. 分割等和子集
其实背包问题画成表格可以更好的理解状态的转移。
2023-06-21 14:10:15
61
原创 Day39 | 62.不同路径, 63. 不同路径 II
同时,为了匹配输入数组的下标,i,j应该代表的是第i+1行j+1列的坐标,所以递推公式基本不产生改变,主要对障碍部分进行条件限制。按照五步进行分析,dp数组在本题目中的含义为坐标(i,j)所具有的可到达路径数量。递推公式由地图特性可观察得,dp[i][j] = dp[i-1][j] + dp[i][j-1]。对于地图中的位置,dp[i][0]和dp[0][j]的值是可以直接得到的单一路径,所以初始化第一行和第一列的值为1。确定遍历方法,由于每个dp的条件应该由之前的条件确定,因此需要进行正序遍历。
2023-06-19 12:30:46
74
原创 Day38 | 509. 斐波那契数, 70. 爬楼梯, 746. 使用最小花费爬楼梯
重点在于方法论的使用上面:1、确定dp数组(dp table)以及下标的含义2、确定递推公式3、dp数组如何初始化4、确定遍历顺序5、举例推导dp数组。
2023-06-19 10:44:21
138
原创 Day37 | 738.单调递增的数字, 968.监控二叉树
由于需要遍历二叉树,同时父节点需要统合两个子节点的状态来进行赋值,因此采用的是后序遍历的方法。确定遍历方法,接下来需要对终止条件进行确定,对于监控二叉树,之后便是空节点的叶子节点一定是尽量不进行摄像头设置的。同时,传递给上一层的状态也应该是无覆盖状态。因为要求所求得的结果,从高位向低位数字大小依次递增,如果从高位向低位进行判定的话,很容易出现在进行数字改变时无法顾及原先高位数字的情况。此外,为了避免当根节点的下层节点为覆盖时候,根节点此时为无覆盖状态,且后续无递归导致比实际情况要少一个摄像头。
2023-06-18 16:18:03
335
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人