- 博客(135)
- 收藏
- 关注
原创 5.7 滑动窗口最大值(LC239-H,单调对列)
此时我们需要一个队列,这个队列呢,放进去窗口里的元素,然后随着窗口的移动,队列也一进一出,每次移动之后,队列告诉我们里面的最大值是什么。单调队列:维护元素单调递减的队列,
2024-09-03 14:24:07
329
原创 4.7重复的子字符串(LC_459-E)
给定一个非空的字符串s,检查是否可以通过由它的一个子串重复多次构成。s = "abab"true可由子串 "ab" 重复两次构成。s = "aba"falsetrue可由子串 "abc" 重复四次构成。(或子串 "abcabc" 重复两次构成。所以判断字符串s是否由重复子串组成,只要两个s拼接在一起,里面还出现一个s的话,就说明是由重复子串组成。当然,我们在判断 s + s 拼接的字符串里是否出现一个s的的时候,,这样避免在s+s中搜索出原来的s,我们要搜索的是中间拼接出来的s。
2024-08-23 13:56:24
402
原创 3.9三数之和(LC15_M)
给你一个整数数组nums,判断是否存在三元组满足i!= ji!= k且j!= k,同时还满足。请你返回所有和为0且不重复的三元组。答案中不可以包含重复的三元组。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。注意,输出的顺序和三元组的顺序并不重要。[]唯一可能的三元组和不为 0。[[0,0,0]]唯一可能的三元组和为 0。
2024-08-09 14:31:30
710
原创 Hot100-链表
请注意相交节点的值不为 1,因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说,它们在内存中指向两个不同的位置,而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点,B 中第四个节点) 在内存中指向相同的位置。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。中(从头节点开始)跳到交叉节点的节点数。
2024-05-27 17:12:12
1007
原创 Hot100-栈
Java中虽然没有专门的Stack类,但可以使用Deque接口及其实现类如LinkedList或ArrayDeque来实现栈的功能。Deque接口提供了非常灵活且高效的栈操作,因此在实际应用中更为推荐。双端队列(Deque)确实可以实现栈的功能,尽管栈是“先入后出”(LIFO,Last In, First Out),而队列是“先入先出”(FIFO,First In, First Out)。
2024-05-23 19:21:41
377
原创 Hot100-普通数组(Kadane算法)
只需要和result中的最后一个区间比较即可(result中存储的都是合并好的区间,由于intervals是按左边界升序排的,只需要判断result中最后一个区间的右边届是否小于当前的左边界)在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5。同时,你不能在买入前卖出股票。这类问题的目标是在给定整数数组中找到一个连续的子数组,使其元素之和最大(数组含有负数)。返回你可以从这笔交易中获取的最大利润。设计一个算法来计算你所能获取的最大利润。
2024-05-20 17:02:04
1093
原创 Hot100-滑动窗口
因为字符串 p 的异位词的长度一定与字符串 p的长度相同,所以我们可以在字符串 s 中构造一个长度为与字符串 p的长度相同的滑动窗口,1.若S的长度小于P的长度,不能返回null,应该直接返回一个空数组,因为这个方法要求返回值是List每种字母的数量与字符串 p 中每种字母的数量相同时,则说明当前窗口为字符串 p 的异位词。判断的是两个数组是否是同一个数组对象,而不是它们的内容是否相同。比较的是两个数组对象的内存地址,而不是它们的内容。指由相同字母重排列形成的字符串(包括相同的字符串)。
2024-05-16 16:50:02
970
原创 Hot100-哈希法
本题呢,我就需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是 是否出现在这个集合。,当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。将返回一个包含字符 ‘H’, ‘e’, ‘l’, ‘l’, ‘o’ 的字符数组。1.int是基本属性,所以直接用nums.length,不用调用方法()因为本题,我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,map.put(nums[i], i):将键值对存入map。
2024-04-28 15:29:02
876
原创 9.16单词拆分(LC139-M)
"apple", "pen" 是物品,那么我们要求 物品的组合一定是 "apple" + "pen" + "apple" 才能组成 "applepenapple"。"apple" + "apple" + "pen" 或者 "pen" + "apple" + "apple" 是不可以的,那么我们就是强调物品之间顺序。dp[i] 的状态依靠 dp[j]是否为true,那么dp[0]就是递推的根基,dp[0]一定要为true,否则递推下去后面都是false了。dp[i]:i为字符串的长度(装满背包的容量);
2024-03-19 17:24:22
443
1
原创 9.12零钱兑换(LC518-M)(开始完全背包,与01背包的不同仅在于遍历顺序)
这是一道典型的背包问题,一看到钱币数量不限,就知道这是一个完全背包。但本题和纯完全背包不一样,
2024-03-06 22:27:09
1019
原创 9.11一和零(LC474-M)
理解成多重背包的同学主要是把m和n混淆为物品了,感觉这是不同数量的物品,所以以为是多重背包。只不过这个背包有两个维度,一个是m 一个是n,而不同长度的字符串就是不同大小的待装物品。装满重量为m(m个0)和重量为n(n个1),两个维度的背包,最多能装多少物品。
2024-03-06 20:38:53
367
原创 9.10目标和(LC494-M)
加法的绝对值的集合left减法的绝对值的集合rightnums集合的总和sum这里的left和right都是绝对值:→ left = (target + sum)/2 ,target 和sum都是常量若target + sum为奇数,则无法整除,其实实际意义就是,没有组合能够得到目标和target。
2024-03-04 17:02:13
594
原创 9.9最后一块石头的重量②(LC1049-M)
视为注释,而不是有效的代码。因为重量都不会是负数,所以dp[j]都初始化为0就可以了,这样在递归公式dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);本题中,石头的重量是 stones[i],石头的价值也是 stones[i] ,可以 “最多可以装的价值为 dp[j]” == “最多可以背的重量为dp[j]”01背包中:dp[j]的含义-容量为j的背包,最多可以装的价值为 dp[j]。本题物品的重量为stones[i],物品的价值也为stones[i]。
2024-03-03 11:49:27
915
原创 背包问题(理论)
对于面试的话,掌握,就够用了,最多可以再来一个。至于背包九讲其他背包,面试几乎不会问,都是竞赛级别的了,leetcode上连多重背包的题目都没有,所以题库也告诉我们,01背包和完全背包就够用了。而完全背包又是也是01背包稍作变化而来,即:完全背包的物品数量是无限的。leetcode上没有纯01背包的问题,都是01背包应用方面的题目,也就是需要转化为01背包问题。
2024-02-12 19:59:22
340
原创 9.7不同的二叉搜索树(LC96-M)
dp[j]为j为头结点左子树节点数量,dp[i - j-1]为以j为头结点右子树节点数量。dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索树的数量 + 元素3为头结点搜索树的数量。元素1为头结点搜索树的数量 = 右子树有2个元素的搜索树数量 * 左子树有0个元素的搜索树数量。元素2为头结点搜索树的数量 = 右子树有1个元素的搜索树数量 * 左子树有1个元素的搜索树数量。元素3为头结点搜索树的数量 = 右子树有0个元素的搜索树数量 * 左子树有2个元素的搜索树数量。
2024-02-09 10:19:23
1322
原创 9.5不同路径②(LC63-M)
从递归公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 中可以看出,一定是从左到右一层一层遍历,这样保证推导dp[i][j]的时候,dp[i - 1][j] 和 dp[i][j - 1]一定是有数值。从(0, 0)的位置到(i, 0)的路径只有一条,所以dp[i][0]一定为1,dp[0][j]也同理。这意味着即使在第一列中遇到了障碍物,仍然会继续向下遍历,继续赋值。dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。
2024-02-05 09:38:04
1234
原创 9.3使用最小花费爬楼梯(LC746-E)
dp[i]的定义:到达第i台阶所花费的最少体力为dp[i]。调到dp[i],不仅需要体力花费(dp[i - 1]或dp[i - 2] 跳1/2阶),还需要金钱花费(cost[i - 1]或 cost[i - 2])也就是说:dp[i - 1] 跳到 dp[i] 需要花费 dp[i - 1] + cost[i - 1]。dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] + cost[i - 2]。那么究竟是选从dp[i - 1]跳还是从dp[i - 2]跳呢?一定是选最小的,所以dp[i]
2024-02-05 08:06:44
378
原创 9.1斐波那契数(LC509-E)
一定要写在dp[1] = 1之前;否则当n=0时,就会在dp[1]处报错。dp[i]是依赖 dp[i - 1] 和 dp[i - 2]dp[i]的定义为:第i个数的斐波那契数值是dp[i]那么遍历的顺序一定是从前到后遍历的。
2024-02-02 10:57:04
248
原创 8.16单调递增的数字(LC738-M)
拿一个两位的数字来举例。例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。此时是从前向后遍历还是从后向前遍历呢?举个例子,数字:332:若从前向后遍历:那么就变成了329,此时2又小于了第一位的3了,真正的结果应该是299。若从后向前遍历:332的数值变化为:332 -> 329 -> 299。
2024-01-27 10:07:48
330
原创 8.14划分字母区间(LC763-M)(附.length,.length(),.size()使用原理)
在遍历的过程中相当于是要找每一个字母的边界,。此时前面出现过所有字母,最远也就到这个边界了。
2024-01-27 08:42:20
391
原创 8.13无重叠区间(LC435-M)
此时问题就变成:求非交叉区间的最大个数。区间,1,2,3,4,5,6都按照右边界排好序。当确定区间 1 和 区间2 重叠后,如何确定是否与 区间3 也重贴呢?就是取 区间1 和 区间2 右边界的最小值,因为这个最小值之前的部分一定是 区间1 和区间2 的重合部分,
2024-01-26 11:16:38
477
原创 8.12用最少数量的箭引爆气球(LC452-M)
可以看出首先第一组重叠气球,一定是需要一个箭,气球3,的左边界大于了 第一组重叠气球的最小右边界,所以再需要一支箭来射气球3了。以题目示例: [[10,16],[2,8],[1,6],[7,12]]为例。java所使用的内置函数用的是快速排序需要 logn 的空间。局部最优:当气球出现重叠,一起射,所用弓箭最少。是比较这两个元素的第一个值的大小。排序需要 O(nlogn) 的复杂度。方法默认是按照升序进行排序的。分别代表数组中的两个元素,个元素的第一个值,而。Lambda 表达式。按照数组中每个元素的。
2024-01-26 10:47:15
455
原创 8.11根据身高重建队列(LC406-M)
a和b代表了people数组中的两个元素,每个元素都是一个一维数组,表示一个人的身高和前面的人数。a[0]表示第一个人的身高,a[1]表示第一个人的前面人数。b[0]表示第二个人的身高,b[1]表示第二个人的前面人数。因此,中的比较逻辑根据这些元素的身高和前面的人数进行排序。如果a和b的身高相同(),则表示根据前面的人数升序排列。( a - b 是升序)如果a和b的身高不同,则表示根据身高降序排列。( b - a 是降序)
2024-01-26 09:35:30
1456
原创 8.10柠檬水找零(LC860-E)
只需要维护三种金额的数量,5,10和20。此时大家就发现 情况一,情况二,都是固定策略,都不用我们来做分析了,而唯一不确定的其实在情况三。账单是20的情况,为什么要优先消耗一个10和一个5呢?遇到账单20,优先消耗美元10,完成本次找零。完成全部账单的找零。
2024-01-26 08:30:09
267
空空如也
sklearn实现recal时报错?
2022-12-12
如何用ImageNet预训练模型分类自己的数据集?
2022-12-05
TA创建的收藏夹 TA关注的收藏夹
TA关注的人