算法
文章平均质量分 55
Zonda要好好学习
这个作者很懒,什么都没留下…
展开
-
代码随想录算法训练营day31|134.加油站、135. 分发糖果、406.根据身高重建队列
如下图所示:当索引一道2的时候,剩余油量的总量=1+3-6 < 0,这个时候说明以索引0为起点不合适,将起点更新为索引3.两点证明:1.如果我们从蓝色段中间选一个点开始,是不是最后sumGas就不小于0?不会,我们可以看如下图,如果蓝色sumGas<0,sumGas1>0==>可以推出sumGas2<0,这样就不符合我们在蓝色段结束才sumGas<0的条件。2.最终所有的剩余油量相加大于等于0就一定可以跑完一圈吗?。原创 2024-06-26 10:33:57 · 249 阅读 · 0 评论 -
代码随想录算法训练营day30|跳跃游戏、45.跳跃游戏||、1005.K次取反后最大化的数组和
这道题目的重点在于:1.不管每次能跳多远,只管跳跃范围的覆盖范围,如果最后能覆盖到最后一个元素,则可以到达最后一个下标2.覆盖的范围是随着i的遍历而不停增加的,相当于“”,每个数的最大覆盖范围应该是i+nums[i],如果大于之前的cover,就更新cover,直到有某一次cover能超过最后的索引,说明可以跳到最后。原创 2024-06-24 00:38:26 · 183 阅读 · 0 评论 -
代码随想录算法训练营day 29|376. 摆动序列、53. 最大子序和
如果前面的序列和为小于0,那么对于后面的序列取最大值没有任何帮助,不如舍弃前面的序列,重新开始开始计算序列和。1.保存最大值的maxValue。2.计算和的count。原创 2024-06-22 14:29:48 · 140 阅读 · 0 评论 -
代码随想录算法训练营day26|39. 组合总和、40. 组合总和||、8.分割回文串
由题意可知,数组中的每一个数都可以重复相加,因此我们在绘制树形图的时候,每次取完某一个数,下一次回溯的时候还可以用该数,比如2、3、6,每次取完2,候选还剩2、3、6。而最后答案也确实是2、2,所以2每次取完不能排除。另外对于存储满足条件结果的path,每次从纵向的回溯过程出来之后,要将这一层回溯加进去的值减掉给横向的循环的下一个值腾出空间,一边进入下一个值的回溯。同时要给一个sum的值记录和。我觉得这道题目卡个2讲的已经够好了,多看几遍理解透彻就行。原创 2024-06-20 10:43:43 · 325 阅读 · 0 评论 -
代码随想录算法训练营day23|669.修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
这道题目需要考虑当前节点是否在[low,high]之间,因为是平衡二叉树,所以当当前节点值小于low时,那么其左节点肯定更小,因此删除该节点的方式是给root节点返回其,注意:这里不是直接返回右节点,是因为在右子树中也有可能存在不满足条件的节点,需要继续递归排查;当当前节点值大于high时,那么其右节点肯定更大,因此删除该节点的方式是给root节点返回其。如果root.val符合在[low,high]的区间内,其左右节点承接左右节点的返回值即可。最终返回root。原创 2024-06-16 17:18:30 · 367 阅读 · 1 评论 -
代码随想录算法训练营day22|701.二叉搜索树中的插入操作、 450.删除二叉搜索树中的节点、 235. 二叉搜索树的最近公共祖先
这道题较为简单,只需要通过递归找到符合要求的叶子节点,并将节点插入即可。原创 2024-06-15 15:40:55 · 406 阅读 · 0 评论 -
代码随想录算法训练营Day17|404.左叶子之和 110.平衡二叉树 222.完全二叉树的节点个数
1、这道题需要统计出所有左叶子结点的值的和,首先要明确左叶子节点指的2.但是光凭叶子结点本身是无法判定左叶子的,因为左右孩子都是null,所以要从上一层节点往下判定。所以判断左叶子的条件语句应该是3.另外,这道题目采用后序遍历是最方便的。并且要明确递归三要素:返回值、终止条件、递归逻辑。原创 2024-06-07 18:05:08 · 420 阅读 · 0 评论 -
代码随想录算法训练营Day15|102.二叉树的层序遍历 226.翻转二叉树 101.对称二叉树
只总结一句话:每一个节点需要知道自己的左右节点是否对称才可以判断以自己为根节点的子树是都对称,从叶子节点向上不断返回左右节点对称判定结果的与,最终返回到根节点,得到最终结果。这其实是和方法传参的机制有关,我们都知道在Java中,对象是通过引用传递的。当你将一个对象作为参数传递给方法时,实际上是传递了一个指向该对象的。swap方法中,一个是将待翻转节点的左右节点分别传入,一个是直接将待翻转节点传入。我们可以看出,这个方法只能将left和right指针的副本进行互换,不能对本身的right和left指针互换。原创 2024-06-05 14:52:46 · 484 阅读 · 0 评论 -
代码随想录算法训练营Day14| 递归遍历 、迭代遍历实现前中后序遍历、 统一迭代
不多加赘述。原创 2024-06-04 17:36:17 · 208 阅读 · 0 评论 -
Java中的大小顶堆的实现方式
在java中没有一个现成的大小顶堆的数据结构,但可以用PriorityQueue类代替。原创 2024-06-03 22:34:19 · 213 阅读 · 0 评论 -
代码随想录算法训练营Day12|347.前 K 个高频元素、 239. 滑动窗口最大值
1、是一个基于优先级的队列,它使用了一个优先队列算法(通常是堆结构)来保证队列头部(peek或poll方法返回的对象)总是队列中具有最高优先级的对象。3、如果堆中的值的个数不满k个,直接加入Entry,如果正好k个,每次加入一个都会将堆中最小的那个值弹出,从而保证堆中的k个元素使所有当前已经遍历的值中的前k个。2、小顶堆维持了一个最多只有k个元素的堆,这个堆在java中可以用一个实现了Queue接口的PriorityQueue对象去模拟。4、当全部遍历完毕,堆中的元素是所有元素中前k个大。原创 2024-06-03 11:42:08 · 402 阅读 · 0 评论 -
代码随想录算法训练营Day11| 20. 有效的括号、 1047. 删除字符串中的所有相邻重复项、 150. 逆波兰表达式求值
这道题几个注意点都在注释中标注。原创 2024-06-01 20:49:20 · 225 阅读 · 0 评论 -
代码随想录算法训练营Day10| 232.用栈实现队列、 225. 用队列实现栈
【代码】代码随想录算法训练营Day9| 232.用栈实现队列、 225. 用队列实现栈。原创 2024-05-31 13:09:17 · 214 阅读 · 0 评论 -
代码随想录算法训练营Day8|541. 反转字符串II、替换数字、151.翻转字符串里的单词、卡码网:55.右旋转字符串
卡哥的方法,先整体反转,再去除多余的空格,最后再对每一个单词反转。卡哥要求空间复杂度为O(1),那方法一就不符合要求了。这道题目很简单,但是解决了我长久以来关于ACM模式的一个困惑:连续用scanner向系统键入两个量的时候,会报错。1.这道题刚开始把题意理解错了,以为对于任意长度的字符串都只反转[0,k-1]以及[2k,3k-1]区间的值。方法一:自己想的方法,思路比较简单,但是调试了好久,贴在这里梳理一下思路。之前写的一个方法,用字符数组做的,时间复杂度和空间复杂度都很低。3.需要自己导入必要的包。原创 2024-05-30 01:12:10 · 363 阅读 · 0 评论 -
代码随想录算法训练营Day7|454.四数相加II、 383. 赎金信、15. 三数之和、 18. 四数之和
四个数组分成两组进行for循环,先用HashMap存储所有第一组for循环出现的和的次数。再进行第二组for循环,每一次得出的和判断其负数是否在map的key中,如果存在,就加上这个value。和有效的字母异位词那道题目类似。原创 2024-05-29 12:17:31 · 287 阅读 · 0 评论 -
代码随想录算法训练营Day6| 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和
对于ASCII字符集,字符’a’的Unicode编码是97,字符’b’的编码是98,以此类推,直到字符’z’的编码是122。**关键:**如果map中没有target-nums[i],说明在之前没有出现可以和当前数配对相加为target的数,那么就先把他加进map,等到那个输出现,再将他们的索引成对返回。2.创建一个set集合,存储每一个按照规则算出来的数,一旦出现之前已经加入到set的数了,说明开始循环了,就跳出while,res置为false,这个数不是快乐数。记录字符串s中字符出现的次数。原创 2024-05-29 11:59:57 · 1109 阅读 · 0 评论 -
代码随想录算法训练营Day4|24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、 142.环形链表II、面试题 02.07. 链表相交
这道题的关键在于:1、在置换两个节点的时候,当前节点需要在这俩节点之前一个节点。并且要提前保存cur.next以及cur.next.next。2、每次置换完一组节点,cur = cur.next.next3、判断结束的标志:奇数个节点:cur.next.next!= null 偶数个节点:cur.next!= null 为了保证cur.next.next不会产生空指针,需要先判断next!= null4、最终返回的是虚拟节点的下一个节点,因为最初的head节点已经不在链表最前面了。原创 2024-05-25 16:16:21 · 627 阅读 · 0 评论 -
代码随想录算法训练营Day3|203.移除链表元素、206.反转链表、707.设计链表
1、首先,删除链表中的一个节点,为了不影响head节点,我们要定义一个curNode节点。2、但是,如果要删除的节点是头结点,如图(a)所示,对于头结点来说,需要加一个虚拟节点作为它的curNode,这样才可以和图(b)一样通过curNode.next赋值为curNode.next.next来跳过这个需要删除的节点。其实当cur为null的时候就可以停止了,因为这个时候cur为null,不需要再让cur指向pre操作了,这个时候就可以停止了,因此while循环的判断条件为while(cur!原创 2024-05-24 15:17:18 · 1014 阅读 · 0 评论 -
Day2 数组小结
1、数组的小标从0开始且地址连续2、数组定位元素的效率非常高,几乎是O(n)的时间复杂度,因此查找很快3、因为内存连续,因此进行删除或者添加的话,需要移动后面的元素4、二维数组空间并不是连续的,如{{1,2,4},{2,3,4,},{2,3,4}}中{1,2,4},{2,3,4},{2,3,4}是地址连续的,但是1,2,4,2,3,4,2,3,4这所有的元素并不一定内存连续。原创 2024-05-24 01:08:37 · 174 阅读 · 0 评论 -
代码随想录算法训练营Day2|977.有序数组的平方、59.螺旋矩阵||、 209.长度最小的子数组
每次判断大小,如果是left指针的平方数大,left右移一位;如果是right指针的平方数大,right左移一位,直到right=left,为什么要等于?原创 2024-05-24 00:51:49 · 352 阅读 · 0 评论 -
代码随想录算法训练营Day1|704.二分查找、27. 移除元素
if (nums[mid] > target) right 要更新为mid,target要在[left,mid)之间去寻找,实际上已经把mid索引的值排除在外,因此不需要不需要像左闭右闭一样将right更新为mid-1。注意每次当target在nums[mid]左边时,right更新为mid-1;当target在nums[mid]右边时,left更新为mid+1。快指针是用来查找哪些数组元素是我们需要的,慢指针是用来保存我们需要的值。关键在于右边界为开区间,因此这个右边界的值实际上是取不到的。原创 2024-05-22 09:51:28 · 362 阅读 · 0 评论 -
华为机试HJ23删除字符串中出现次数最少的字符
实现删除字符串中出现次数最少的字符,若出现次数最少的字符有多个,则把出现次数最少的字符都删除。输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。数据范围:输入的字符串长度满足 1≤𝑛≤20 ,保证输入的字符串中仅出现小写字母字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。删除字符串中出现次数最少的字符后的字符串。输入:aabcddd输出:aaddd。原创 2024-04-18 11:54:37 · 442 阅读 · 0 评论 -
华为机试HJ8合并表记录超时原因解析
在 Java 中,HashMap 内部是通过数组和链表(或红黑树)实现的,当插入的键值对数量较多时,HashMap 会进行扩容操作,即重新分配更大的数组,并将原来的键值对重新哈希到新的数组中。如果预先指定了初始容量,HashMap 在初始化时会直接分配具有指定大小的数组,这样可以减少扩容的次数,提高效率。在一些情况下,尤其是处理大量数据时,这种差异可能会导致执行时间的变化。在以上超时和不超时的示例中,HashMap 的初始化方式不同,其中一个是通过指定初始容量,而另一个则没有指定初始容量。原创 2024-04-17 10:53:58 · 346 阅读 · 1 评论