- 博客(44)
- 收藏
- 关注
原创 lc 146. LRU 缓存
如果key不存在,使用key和value创建一个新结点并放到头部,然后判断节点是是否超出容量,如果超出容量,则删除链表尾部节点,并删除出哈希表中对应的项。首先通过哈希表找到该项在双向链表中的位置,然后将其移动到链表的头部。如果key存在,则更新哈希表中的value,并将链表中结点放到头部。哈希表将缓存数据作为key, value为其在双向链表中的位置。如果key存在,通过哈希表找出对应的位置,然后将它移动到头部。//定义哈希表和容量以及头尾结点。双向链表靠近头部是最近使用的键值对。//定义双向链表结构。
2024-11-26 21:03:53
590
原创 lc 153 寻找旋转排序数组的最小值
nums[mid] < nums[right] 时候说明右边是递增的,最小值在左边,有可能是mid,所以去掉右边,right = mid。//所以循环里mid始终小于right,所以nums[mid] 和 nums[right] 永远不会相等。nums[mid] > nums[right]时候说明左边是递增的,最小值在右边,不可能是mid,所以去掉左边。二分的目的,是将目标最小值套住,通过判断mid与左右的大小关系,通过判断mid与左右的大小关系,//left == right时,只剩一个数,退出循环。
2024-11-05 18:49:01
312
原创 lc 33 搜索旋转排序数组
/前半部分有序,剩两个数时,start = mid 这种时候相等,为了符合逻辑这样写。//必须严格介于两端之间(不能包含mid)才能说明,target在前半部分。一种是前半部分有序,表现为nums[start] <= nums[mid],此处相等时考虑了两个数的情况。//必须严格介于两点之间(不能包含mid)才能说明target在后半部分。每种情况首先确定target是否一定在有序部分,否则在另一部分。//否则target在前半部分。每次二分基于这两种情况进行细分。旋转后的数组分为两种情况。
2024-11-05 17:50:44
209
原创 lc 142 环形链表II
/如果存在环 则让一个节点在头部,一个节点在相遇的节点,同时走,相遇的地方即为入口。先判断存在环形链表,然后根据 x = z,得到入口。
2024-11-05 15:36:48
433
原创 lc 141 环形链表ACM模式
/ 假设pos为环的起始节点索引。// 读取环的信息,pos为-1表示无环。双指针fast 和slow。快慢指针相等则代表有环。
2024-11-05 15:34:27
408
原创 lc 148 排序链表
/pre下一轮在这波的末尾,next==null就到地方了。//一会儿要赋head2的值所以cur.next不能为空。通过自底向上的归并算法,满足时间复杂度为O(logN),空间复杂度为O(1)//定义head2后面的一个节点先赋值为空。//保存head2末尾的下一个。//把合并好的链表组装回原位置。//给cur赋下一轮的位置。//合并两个链表使其有序。//每次归并,为上次的二倍。//首先计算链表的长度。
2024-11-05 10:45:37
448
原创 lc 138 随机链表的复制
1.创建新节点在原节点的next,操作为插入节点(原节点1指向新节点1)//必须这样找下一个,要不然无法完全分离。2.新节点i的随机指针(如果有)指向原节点的随机指针的下一个。//相当于互相删除节点。3.拆开链表,相当于互相删除节点。
2024-11-04 11:07:04
252
原创 lc 25 K个一组翻转链表
/end表示上一个的末尾,如果它的下一个为null,那么就结束。// 遍历过程中end为null, 不能.next了。// end 为空说明不够k个,不用翻转。//更新(一开始end和pre是同一位置)//翻转返回头结点并衔接上。//把这段链表截取出来。就是模拟,没什么算法,注意细节,关键要穿上。首先判断链表够不够k个,不够直接break。next表示要反转链表的后继。pre表示要反转链表的前驱。start表示链表开始。
2024-11-03 16:29:56
315
原创 lc 73 矩阵置0 ACM模式
第一行和第一列要单算,设置标志位,flag1 和 flag2 分别对应第一行或第一列中有0。//标志位为true的第一行/和列都为0。遍历矩阵,如果为0 则对应的第一行和第一列都置为0。最后分别遍历第一行和第一列,有0则全行或列置为0。//第一列为0 则对应的行为0。//第一行为0 则对应的列为0。//有0则对应行/列为0。//第一行有0标志位。//第一列有0标志位。标志位最先计算,最后处理。
2024-11-02 15:25:45
333
原创 lc 41 缺失的第一个正数
遍历nums, 如果nums[i]!= nums[nums[i] - 1] nums[i] > 0 且<=len 那就把nums[nums[i] - 1]的值为nums[i],做交换,保证nums[i]在哈希映射后的正确地方。//注意这里的交换顺序不能反过来, nums[nums[i] - 1]中有nums[i],不能先改变nums[i]//nums[i] > 0 && nums[i] <= len 超过这个范围的nums[i] - 1 交换没有意义。
2024-11-02 13:42:11
227
原创 lc 238 除自身以外数组的乘积
先得到左边数乘积的数组,每个数的值等于左边每个数相乘。然后基于左乘数组结果,乘上右乘积的结果为最终结果。每个位置的值等于左边数的乘积×右边数的乘积。
2024-11-02 10:34:42
163
原创 lc 136 只出现一次的数字
把数组中所有数异或运算之后 相同的异或都得0了,结果就是那个只出现一次的数字。任何数与0异或^运算得到的是其本身。
2024-11-01 22:54:01
194
原创 打印list数据
Arrays.toString(list.toArray()) 将数组转换成String类型输出的。List<List<Integer>>打印方式。
2024-10-31 17:19:56
505
原创 回溯算法理论基础
本质就是是穷举,穷举所有可能解决问题:组合问题:N个数里面按一定规则找出k个数的集合 切割问题:一个字符串按一定规则有几种切割方式 子集问题:一个N个数的集合里有多少符合条件的子集 排列问题:N个数按一定规则全排列,有几种排列方式 棋盘问题:N皇后,解数独等等回溯法解决的问题都可以抽象为树形结构集合的大小就构成了树的宽度,递归的深度就构成了树的深度。递归三部曲回溯函数模板返回值以及参数 回溯函数终止条件 回溯搜索的遍历过程for循环就是遍历集合区间,可以理解一个节点有
2024-10-31 11:03:35
188
原创 关系型数据库和非关系型数据库
NoSQL数据库是横向扩展的。因为非关系型数据存储天然就是分布式的,NoSQL数据库的扩展可以通过给资源池。SQL数据库是纵向扩展,也就是说提高处理能力,用速度更快速的计算机,肯定会达到纵向扩展的上限。非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。包括:Oracle ,Mysql,SQL Server,Access,DB2等。关系型数据库是表格形式存储数据的,容易提取数据。SQL语句就是基于关系型数据库的语言,用于操作和检索数据库。SQL数据库支持对事务原子性细粒度控制,并且易于回滚事务。
2024-10-28 15:04:56
202
原创 lc 416 分割等和子集
此公式由二维数组转化而来。先遍历物品,再遍历背包(反过来会导致背包里只有一个物品)dp[j]表示容量为j的背包能装物品的最大价值。背包要倒序遍历,不然会重复拿物品。背包容量为数组总和的一半。
2024-10-28 11:07:24
206
原创 二叉树的存储和遍历
二叉树的存储方式有顺序存储(数组)一层层挨个存。深度优先遍历:可以通过递归和迭代实现。广度优先遍历:通过迭代实现。java中二叉树定义。
2024-10-26 11:25:43
136
原创 lc239 滑动窗口最大值
/满足递减 向队尾添加元素,不满足把队尾的元素弹出来。//当val为队头元素时才把执行弹出头的操作。//先把前k个元素放进去。
2024-10-15 17:30:52
259
原创 lc 560和为k的子数组
map 的 key为前缀和, value为出现的次数。这种前缀和,pre - k存在,说明从。检查之前是否已经存储了。之间的元素值之和就是。
2024-10-14 19:27:11
192
原创 lc128 最长连续序列
while循环判断num+1在不在set里 set.contains()核心:判断num-1在不在set里,如果在说明num不是第一个数字。如果在 长度+1 num+1。首先用set对数组去重。如果不在 长度命为1。最后取最长的long。
2024-10-14 16:27:14
154
原创 lc49-字母异位词分组
遍历字符串数组,然后转成字符数组,然后排序,排序后作为key,然后map.getOrDefault(key, new ArrayList<String>)方法在Java中用于返回映射中所有值组成的集合视图。这个方法不需要任何参数,并且会按照元素插入的顺序返回所有的值。因此将排序后的字符串作为key, value为对应的原字符串组成的list。最后将key,list 放进map。核心:异位词排序后的字符串相同。然后将str放进list。
2024-10-14 15:56:31
357
原创 lc——找到字符串中所有字母异位词
然后从pLen开始遍历s,先把对应的上个窗口位置(i - plen)的数量去掉,再加上着个位置的数量,再与p的数组比较,相等则返回初始位置i - pLen + 1。用Arrays.equals比较两个数组是否相等,相等res.add(0)用数组作映射,标记字符串中所含字母的数量。ArrayList保存结果。滑动窗口,窗口大小固定。
2024-10-14 12:37:12
304
原创 lc 300 最长递增子序列
/求最大的dp[i]就是在0-i中找j < i最大的能+1的dp[j]//定义dp[i]表示前nunms[0-i]的最长递增子序列的长度。//保存最大的dp[i]
2024-09-15 23:56:20
233
原创 lc139 单词拆分
/dp[j]true 并且 j-i是true dp[i] 一定是true。//1.定义长度为i的字符串, 可以被拼接true。//先遍历背包,可以保证排列的顺序。排列问题:先遍历背包,再遍历物品。背包是单词,字典是物品。
2024-09-15 22:41:09
292
原创 lc 279 完全平方数
递归函数 dp[j] = Math.min(dp[j], dp[j - i * i] + 1);//不用像零钱兑换那样需要返回 -1。//dp表示和为j的最小数量。
2024-09-15 16:02:21
251
原创 lc 322 零钱兑换
递推公式搭配dp[j] = Math.min(dp[j - coins[i] + 1, dp[j])//dp[j - coins[i]]能被凑成才有dp[j] 的事。//定义dp数组dp[j]表示凑成金额j的最少硬币个数。//j至少比coins[i]大。//求最小的初值赋值成最大的。
2024-09-15 15:30:14
357
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅