- 博客(43)
- 收藏
- 关注
原创 贪心算法总结
i 每次移动只能在 cover 的范围内移动,每移动一个元素,cover 得到该元素数值(新的覆盖范围)的补充,让 i 继续移动下去。
2024-09-02 15:32:29 1381
原创 动态规划-子序列问题
1.位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值。。3. dp[i](即最长递增子序列)起始大小至少都是1.4. 从前向后遍历。
2024-08-25 22:01:47 464
原创 动态规划-股票问题
单独列出一个状态的归类为「不持有股票的状态」,因为本题有冷冻期,而冷冻期的前一天,只能是 「今天卖出股票」状态。1. dp[i][j]中 i表示第i天,j为 [1 - 4] 四个状态,dp[i][j]表示第i天状态j所剩最大现金。4. 从前向后遍历。4. 从前向后遍历。
2024-08-25 21:02:13 720
原创 动态规划-背包问题
力扣(LeetCode)本题与上一题是一个意思。只是对dp[target]的处理方式不同。只要尽量让石头分成重量相同的两堆,相撞之后剩下的石头就会是最小的。在计算target的时候,target = sum / 2 因为是向下取整,所以sum - dp[target] 一定是大于等于dp[target]的。那么相撞之后剩下的最小石头重量就是 (sum - dp[target]) - dp[target]。sum += i;//初始化dp数组i++) {//采用倒序j--) {
2024-08-19 17:41:04 1023
原创 2024.08.14 用友笔试-2-Java
小友正在优化财务报表分析功能。给定一个由不同整数构成的数组revenues,每个元素表示在不同时间段内的收入。我们用以下方式定义一个与revenues长度相同的数组maxDurations:maxDurations[i]:是一个子数组revenues[l...r] 的最大长度,该子数组中的最大收入等于revenues[i]。返回数组 maxDurations。注意,子数组是数组的连续部分。第一行输入n,表示数组的长度输入长度为n的数组的各个元素6。
2024-08-15 10:13:17 606
原创 消息队列总结
如果某个 Topic 消息量很大,应该给它多配置几个 Queue,并且尽量多分布在不同 broker 上,以减轻某个 broker 的压力。分区是 Kafka 读写数据的最小粒度,比如主题 A 有 15 条消息,有 5 个分区,如果采用顺序轮询的方式,15 条消息会顺序分配给这 5 个分区,后续消费的时候,也是按照分区粒度消费。由于分区可以部署在多个不同的机器上,所以可以通过分区实现 Kafka 的伸缩性,比如主题 A 的 5 个分区,分别部署在 5 台机器上,如果下线一台,分区就变为 4。
2024-07-21 21:30:43 594
原创 排序思想-快排
快速排序核心思想就是每次在当前区间 [left, right] 中选择出一个元素 nums[p],然后将区间内所有大于它的元素和所有小于它的元素都放到其两侧【具体放在哪一侧取决于是升序还是降序】,然后再递归去处理两侧区间。将大于切分值的元素都放到左侧,小于切分值得元素都放到右侧。因此我们可以使用双指针分别从两端往中间搜索,分别找到左侧小于切分值的元素和右侧大于切分值的元素,交换之,直到两个指针相遇。
2024-07-17 14:51:05 463
原创 并查集练习
表示每行中有多少列。如果我们知道每行的列数,那么我们知道需要跳过多少个元素才能从一行移动到下一行。注意:为确保索引唯一性,index 函数应使用网格列数 m 进行行列转换。通常不表示每列中的元素数目(除非是在一个完全对称的网格中,即。
2024-06-27 13:43:42 160
原创 深(广)度优先遍历
从某个结点出发,BFS 首先遍历到距离为 1 的结点,然后是距离为 2、3、4……当处理完所有的 g[i] 后,将所有的入度为 0 的课程(含义为没有前置课程要求的科目)进行入队操作,跑一遍「拓扑排序」,若所有课程都能顺利出队,说明所有课程都能使完成。实际上就是求腐烂橘子到所有新鲜橘子的最短路径。若课程 a 存在前置课程 b 的话,我们添加一条从 b 到 a 的有向边,同时统计所有点的入度。还有一个点要明确:节点的值仅仅表示从根节点到本节点的路径构成的字符串是否有效而已。1.找到入度为0的点,入队。
2024-06-20 16:29:12 167
原创 高频考题-LRU缓存机制
删除操作需要找到该节点的前驱节点和后继节点。对于寻找前驱节点,单向链表需要从头开始找,也就是要O(n)时间,双向链表可以通过前向指针直接找到,需要O(1)时间。随着节点的插入,dummy 的 next指向链表的第一个节点,prev指向链表的最后一个节点。这样以来,我们首先使用哈希表进行定位,找出缓存项在双向链表中的位置,随后将其移动到双向链表的头部,即可在 O(1)的时间内完成 get 或者 put 操作。双向链表按照读取的顺序存储键值对,靠近头部的键值对是最近使用的,尾部的键值对是最久未使用的。
2024-06-18 11:23:22 413
原创 技巧栏练习题
在这之后,我们遍历哈希映射中的所有键值对,返回值最大的键。我们同样也可以在遍历数组 nums 时候使用打擂台的方法,维护最大的值,这样省去了最后对哈希映射的遍历。对于哈希映射中的每个键值对,键表示一个元素,值表示该元素出现的次数。我们将数组下标 n 和数 nums[n] 建立一个映射关系为 n->f(n)。首先明确前提,整数的数组 nums 中的数字范围是 [1,n]。2.找到数组中的重复整数 <==> 找到链表的环入口。任何数和0 做异或运算,结果仍然是原来的数。位其实就是从低位到高位的第一个下降的数。
2024-06-13 16:38:02 365
原创 矩阵练习2
规律:对于矩阵中第 i行的第 j 个元素,在旋转后,它出现在倒数第i 列的第 j 个位置。可以使用辅助数组,如果不想使用额外的内存,可以用一个临时变量。还可以通过水平翻转后再进行主对角线翻转。
2024-06-11 11:59:40 467
原创 矩阵练习1
首先我们需要标记需要置零的行和列,可以在遍历矩阵中的元素遇到0,则将其行首和列首元素置为0。在此过程中首行、首列会受影响,因此先用两个变量记录首行、首列是否需要被置0,接着遍历非首行、非首列的元素。
2024-06-06 11:35:06 439
原创 数组练习1
步骤:对数组进行一次遍历,对于遍历到的数 x=nums[i],如果 x∈[1,N],交换 nums[i]和 nums[x−1],这样 x 就出现在了正确的位置。在完成交换后,新的 nums[i]\ 可能还在[1,N] 的范围内,需要继续进行交换操作,直到 x∉[1,N]。这里我采用的是通过置换将数组恢复成[1, 2, ..., N] 的形式,但其中有若干个位置上的数是错误的,每一个错误的位置就代表了一个缺失的正数。实际上,对于一个长度为 N 的数组,其中没有出现的最小正整数只能在 [1,N+1] 中。
2024-06-04 11:09:10 222
原创 回溯练题03
组合型回溯括号的个数是确定的,不选左括号,就选右括号,因此可以根据选不选左括号来考虑。如果左括号个数还不够,就可以选左括号,否则,只能选右括号。另外右括号的个数不能超过左括号个数,比如左右括号个数相等的时候,就只能选择左括号了。
2024-05-28 12:26:18 184
原创 二维dp01
dp[i][j]:考虑到达位置[i,j]的不同路径数;代码如下:1.可以分条件讨论2.由于只能向下或是向右移动,所以0行和0列的不同路径只有1条。直接写出dp值。
2024-05-22 12:50:47 221 1
原创 背包动态规划
该题是完全背包序列 DP 通常需要结合题意来寻找前驱状态,即需要自身寻找拓扑序关系(例如本题,需要自己通过枚举的方式来找左端点,从而找到可转移的前驱状态dp[j−1]。dp[i] :考虑前 i个字符,能否使用 wordDict 拼凑出来:当 dp[i]=truef 代表 s[1...i] 能够使用 wordDict 所拼凑,反之则不能。
2024-05-21 11:58:11 121
原创 二维动态规划
思路二:区间dp,从区间的首尾来尝试,整个过程是从下往上,从左往右,要得到的是右上角。3.其余位置,又分为区间端点值相等否两种情况讨论。该题无法整理出严格位置依赖,其路径取决于上下左右中小的一个。不过题意严格递增,不会出现走回头路的情况,只需要挂个dp表记录即可。1)当区间值不等(s[L]!= s[R])时,取[L,R-1] 和 [L+1, R] 区间的最大值。2)当区间值相等(s[L] == s[R])时,2+[L+1, R+1]思路一:原始串与逆序串的最长公共子序列,就是原串的最长回文子序列。
2024-03-24 15:06:26 275 1
原创 List常用操作
List<泛型> list= new ArrayList<>();方法:删除List中包含在指定集合中的所有元素;将指定集合中的所有元素添加到List的末尾;删除List中第一个出现的指定元素;返回第一次出现指定元素的索引位置。将指定元素添加到List的末尾;返回List索引位置上的元素。
2024-03-18 13:55:49 249
原创 栈与队列区别
访问队头元素:peek();取栈顶元素:peek();队列大小:size();入队:offer();入栈:push();出队:poll();
2024-03-17 17:14:45 117 1
原创 链表小总结
/ 结点的值int val;// 下一个结点// 节点的构造函数(无参)// 节点的构造函数(有一个参数)// 节点的构造函数(有两个参数)
2024-03-13 21:21:05 1526 1
原创 二分查找总结
根据左右指针计算中间位置 m,并比较 m 与 m+1 的值,如果 m 较大,则左侧存在峰值,r = m,如果 m + 1 较大,则右侧存在峰值,l = m + 1。思路:旋转之后部分有序,我们找到mid,如果[left,mid]区间有序,且mid值在端点值之间,就在这部分有序数据中查找,否则,在无序数据中查找。思路:通过比较中值与右值,可以确定最小值的位置范围,从而决定边界收缩的方向。题意是:在排序数组中寻找是否存在一个目标值,存在返回值,不存在则返回按顺序插入的位置。将计算的mid映射到矩阵的下标。
2024-03-12 17:17:21 336 1
原创 Bean的生命周期,找不到@PostConstruct和@PreDestroy
1.出现这种情况的原因是:我使用的是JDK17的版本,而JDK11就移除了这些注解。2.解决办法就是在父工程的pom.xml文件中添加必要的依赖项。3.最后刷新一下maven就可以了。
2024-01-10 17:31:19 583 1
原创 【算法】二分查找
//表示查找值在左半区域,故右指针前移,其指向的m索引在上一次循环已经判断过,不需要再次判断。特点:①不在循环内找target,循环只是缩小范围,当范围内只剩下i时,退出循环,在循环外比较arr[i]与target。2)当target=arr[m]时,用变量candidate=m,然后继续向左找,缩小边界j=m-1;2)当target=arr[m]时,用变量candidate=m,然后继续向右找,缩小边界i=m+1;2)while(i<=j):“=”是多考虑一次,即当指针i=j=m指向同一元素。
2023-08-27 15:36:44 106
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人