算法
舍人_1
这个作者很懒,什么都没留下…
展开
-
深入PriorityQueue底层原理与源码解析
优先级队列:一般使用堆数据结构实现,堆一般使用数组存储集合中的每个元素都有一个权重值,每次出队都弹出优先级最大或最小的元素。原创 2024-05-24 23:42:39 · 575 阅读 · 0 评论 -
环形链表(双指针)
设置两个快慢指针,循环若能相遇则是环形链表,否则不是。原创 2024-05-22 23:44:38 · 173 阅读 · 0 评论 -
LRU缓存机制
也就是说,在每次插入结点/访问结点的时候,都会将相应结点移动到双向链表的尾部,从而达到按访问顺序进行排序的目的。loadFactor的默认值为0.75f,是官方给出的一个比较好的临界值。LinkedHashMap的底层数据结构和HashMap一样,采用数组+单向链表(JDK1.8之前)的形式,只是在节点Entry中增加了before和after变量,用于维护一个双向链表来保存LinkedHashMap的存储顺序。总结:这就是LRU的底层实现了,get和put方法的时间复杂度都是O(1),执行效率非常高。原创 2024-05-19 18:03:54 · 238 阅读 · 0 评论 -
滑动窗口总结
---核心:左右双指针(L,R)在起始点,R向右逐位滑动循环。---核心:左右双指针(L,R)在起始点,R向右逐渐滑动循环。如果窗内元素满足条件,L向右缩小窗口,并更新最优结果,如果窗内元素满足条件,R向右扩大窗口,并更新最优结果。满足XXX条件(计算结果,出现次数,同时包含)如果窗内元素不满足条件,L向右缩小窗口。如果窗内元素不满足条件,R向右扩大窗口。例如:长度最小的子数组。----每次滑动过程中。----每次滑动过程中。子串/子数组/子序列。-----R达到结尾。使用思路(寻找最短)原创 2024-05-16 23:19:44 · 287 阅读 · 0 评论 -
有序数组的平方
双指针变种,两头向中间遍历,既然找不到最小值在哪,那就判断最大值,逆序插入。原创 2024-05-15 21:55:28 · 237 阅读 · 0 评论 -
独一无二的出现次数
题目中要求的是是否有相同的频率出现,那么需要再定义一个哈希表(数组)用来记录频率是否重复出现过,boolean flag [1002];定义布尔类型的就可以了,因为题目中强调1原创 2024-05-14 20:49:35 · 179 阅读 · 0 评论 -
找到出现了K次的数
然后看这个数组的每个位置,假设0位,这个位置如果是7的整数倍,那么数字A一定没在这个位置出现过。就是说给一个数组arr[] 给两个数字3, 7 其中3和7 就是K和M。这个数组中 有一种数出现了3次,其他数字都出现了7次 ,怎么找到出现了3次的数。我们用这个数组每个位置1的和表示多个数字,虽然这样数字就区分不开了,先不管。一个数组中有一种数出现了K次,其他数都出现了M次,M>1 ,K<M。假设其他所有数字出现了7次,只有一种数字(A)出现了2次。每个数字都累加到这个数组中。原创 2024-05-14 20:07:23 · 269 阅读 · 0 评论 -
找数字
在定义一个变量result1 让result1 去异或数组全部,但是只是异或第i位是1的,这样就会得到a。但是没完,因为只是知道了result 的值是a和b异或出来的。result ^ result1 等价于 a ^ a ^ b 得到b。因为result1 = a ,result = a^b。我们找到result中最靠右的1,比如是i。假设a的第i位是1 b的第i位是0。一类是 第i位置上 0的 A组。说明这个位置上a和b的值是不同的。a和b一定是在这两个不同的数组中。一类是第i位置上是1 B组。原创 2024-05-14 20:02:36 · 353 阅读 · 0 评论 -
如何不用额外变量交换两个数
b = a ^ b;等价于 b = xyy;因为y^y = 0 x^0 = x 所以b = x。这里要注意,i和j 不能指向同一个内存地址。否则会导致成0. 可以是相同的数字,但是不能是相同内存地址。a = a ^ b;等价于 a = x ^ y;a = a ^ b;等价于 a = xyx;这个代码都见过,都写过。原创 2024-05-13 22:58:12 · 363 阅读 · 0 评论 -
力扣203.移除链表元素(java版)
还要说明一下,就算使用C++来做leetcode,如果移除一个节点之后,没有手动在内存中删除这个节点,leetcode依然也是可以通过的,只不过,内存使用的空间大一些而已,但建议依然要养成手动清理内存的习惯。这样移除了一个头结点,是不是发现,在单链表中移除头结点 和 移除其他节点的操作方式是不一样,其实在写代码的时候也会发现,需要单独写一段逻辑来处理移除头结点的情况。移除头结点和移除其他节点的操作是不一样的,因为链表的其他节点都是通过前一个节点来移除当前节点,而头结点没有前一个节点。原创 2024-02-21 16:22:16 · 363 阅读 · 0 评论 -
KMP算法(洛谷P3375)(力扣28.找出字符串中第一个匹配项的下标)
说到KMP,先说一下KMP这个名字是怎么来的,为什么叫做KMP呢。因为是由这三位学者发明的:Knuth,Morris和Pratt,所以取了三位学者名字的首字母。所以叫做KMP。KMP主要应用在字符串匹配上。KMP的主要思想是。原创 2024-01-27 19:30:34 · 1189 阅读 · 0 评论 -
力扣42.接雨水,洛谷P1318积水面积(C++,Java版)
n1n。原创 2024-02-21 19:22:09 · 421 阅读 · 0 评论 -
算法训练第一天|704.二分查找、27.移除元素
快指针一直走到数据结束,只有当快指针元素不是要删除元素时,快指针元素赋给慢指针元素,并且慢指针往前走一个。,两个指针从数组两端往中间走,遇到要移除的元素直接放到数组最后面。注意:相向双指针法改变数组中元素顺序,快慢指针法不改变数组中元素顺序。,两种区间对于边界的操作有所不同。,注意确定查找的区间,可以是。原创 2024-02-23 14:49:12 · 456 阅读 · 1 评论 -
算法训练第二天
给你一个字符串path,表示指向某一文件或目录的 Unix 风格(以'/'开头),请你将其转化为更加简洁的规范路径。在 Unix 风格的文件系统中,一个点()表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//')都被视为单个斜杠'/'。对于此问题,任何其他格式的点(例如,'...')均被视为文件/目录名称。请注意,返回的'/''/''/''.''..'返回简化后得到的。奶牛贝茜刚刚完成了自己的期末测试。原创 2024-02-24 20:40:00 · 342 阅读 · 0 评论 -
算法训练第三天(DFS)
n−皇后问题是指将 n个皇后放在 n×n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。每个解决方案占 n 行,每行输出一个长度为 n 的字符串,用来表示完整的棋盘状态。给定一个整数 n ,将数字 1∼n 排成一排,将会有很多种排列方法。现在给定整数 n,请你输出所有的满足条件的棋子摆法。现在,请你按照字典序将所有的排列方法输出。按字典序输出所有排列方案,每个方案占一行。每个方案输出完成后,输出一个空行。共一行,包含一个整数 n。共一行,包含整数 n。原创 2024-02-26 19:41:48 · 385 阅读 · 1 评论