- 博客(24)
- 收藏
- 关注
原创 leetcode hot100 day20
下一个排列组成的整数的增幅要尽可能小,所以从右往左找第一个出现的升序对【i,i+1】,很明显【i+1,end】都是降序的,从这部分数里从后往前找第一个比 i 对应的整数大的数,两个数字交换,然后将降序部分反转为升序。在原数组操作的话,相当于把数组看作链表,转化为寻找环形链表的入口。先移动0,后移动1,只需维护一个指针记录当前移动的位置。由于x的数量多于非x元素,最终剩下的必定是x。由于只能使用常量额外空间,使用异或运算。每个x可以将一个非x元素抵消。136、只出现一次的数字。
2025-08-06 21:31:20
133
原创 leetcode hot100 day19
不断改变中心点,从中心点向两边扩展,(中心点可能有一个或者两个),记录回文子串长度。子串i~j是否是回文,取决于它的首尾元素是否相等,以及里面的字符串是不是回文。1143、最长公共子序列。个字符所需的最小操作数。
2025-08-05 20:55:47
171
原创 leetcode hot100 day 18
完全背包问题,背包最大容量为n,物品为1~n的整数,对应价值是它的平方,每个物品可以取多次,求装满背包的最小物品数量,dp[n]代表装满背包所需的物品最小数量。使用一维dp数组的话,需要先遍历物品在遍历背包,否则每次只会选取一种物品,并且在遍历背包时需要倒序遍历,否则会重复选取相同的物品。同上,完全背包问题,总金额为背包大小,物品是硬币,求装满背包的最小物品数量。dp数组记录的是对应容量可装物品的最大价值,如果有数组和的一半,即为正确。整数为物品,只可用一次,价值为它本身大小,背包容量为数组和的一半。
2025-08-05 17:34:15
300
原创 leetcode hot100 day17
本题就是一个可变长的滑动窗口,我们需要维护当前区间可到的最远距离,如果右边界移动到了这个最远距离,记录当前区间长度,更新左边界到下一个区间,也就是重置窗口。本质就是找几个最长子串的长度,个人感觉这种求子区间的可以使用滑动窗口的思想来解决。动态规划数组的含义,初始化,遍历顺序(在背包问题常需要考虑),递推公式。要么是偷前一家,不要当前这家,要么是前前家加上现在这家。有很明显的状态转移,可以得出递推公式。763、划分字母区间。
2025-07-31 00:23:16
95
原创 leetcode hot100 day16
要实现O(n)的时间复杂度,很显然堆排序也不行,这里使用快速选择算法(我这里写的感觉不太好)在上题的基础上,要求最小跳跃次数,(题目保证可以到达 nums[n-1])在可移动的区间内移动,并且判断下一次可达到的最远距离。一、快速选择法可以一试,只需按频率排序就好。二、最小堆,只需保持最小堆的大小不超过K。只需要记录买入的最低价,以及卖出的最高价。买卖一只股票,而且只能买卖一次。121、买卖股票的最佳时机。347、前K个高频元素。215、第K个最大元素。295、数据流中位数。45、跳跃游戏(二)
2025-07-28 21:23:05
258
原创 leetcode hot100 day15
4、两个有序数组的中位数如果不是时间复杂度的要求,这道题挺简单的,跟之前合并链表一样,直接合并数组就完事了看到这个时间复杂度,只能尝试一下二分查找了,这道题建议多动手模拟20、有趣的括号三种情况:左多、右多、左右不匹配155、最小栈每次压入元素时,将当前最小值同步压入最小栈;弹出元素时同步弹出最小栈顶元素,确保最小栈顶始终反映当前最小元素394、字符串编码。
2025-07-27 17:05:37
266
原创 leetcode hot100 day14
35、二分查找这里使用左闭右开的区间[left,right),所以边界判断应为left<right74、搜索二维矩阵从左上角开始搜索,比较每行最后一个元素,可以判定目标值所在行,也就是从行的维度进行收缩240题类似,是从行和列两个维度进行收缩34、在排序数组中找到元素的第一个位置和最后的位置由于数组已经排序和时间复杂度的原因,选用二分查找不过要修改找到目标值的动作,寻找左边界时,找到目标值就将右指针左移,最后左右指针指向元素的左边界,或者元素会插入的位置(没有找到)
2025-07-24 19:11:25
296
原创 leetcode hot100 day 13
其实,这种给一个候选列表或者数组,要求返回所有符合条件的子集或者排列,可以尝试回溯,但是回溯也算是比较暴力,耗时较多;相较于常规的回溯问题,这道题更适合用DFS,因为只需找到一条路径就可以了,不需要列出所有路径,之前的岛屿问题使用DFS测试连通性,现在是寻找一条合适的路径,只需要记录路径的长度比较就可以了。本质是从字符“(”,“)”中选择合适的字符来进行组合,需要记录左右括号的数量来确保括号的合法。这道题要注意的是,同一个数字可以重复选取,所以进入下一层递归时,可以从当前元素开始遍历。
2025-07-23 19:06:17
203
原创 leetcode hot100 day12
拓扑排序经典问题,解决思路是计算每个节点的出度和入度,将入度为0的节点放入结果集,如果最后节点数不一致说明存在环。bfs:用队列存储要遍历的元素。
2025-07-21 19:39:55
195
原创 leetcode hot100 day11
当前前缀和 - 目标值 = 历史前缀和,若该历史前缀和存在,则说明存在路径满足条件。如果左右子树都找到节点(非 null),说明当前节点就是 LCA。如果是BST,搜索更简单,可以通过节点的值来定位在哪个子树。找到左子树的最右节点(先序遍历中左子树的最后一个节点)移动到新右子树节点(原左子树根节点)继续处理。记录从根节点到当前节点的路径上所有节点值的和。当前节点就是 p 或 q(返回当前节点):根节点左侧是左子树,右侧是右子树。如果只有右子树找到,返回右子树结果。将原右子树接到最右节点的右子树上。
2025-07-18 13:43:51
401
原创 leetcode hot100 day10
因为二叉搜索树的中序遍历结果是一个递增序列,因此中序遍历的第 k 个节点即为第 k 小的元素。递归中序遍历,记录前驱节点值(就是相当于不断更新cur和pre指针,不断比较两个值):由于数组已排序,取中间元素作为根节点可确保左右子树节点数相近,实现平衡。用中序遍历比较简单,因为二叉搜索树通过中序遍历可以看作一个趋势递增的数组。平衡二叉搜索树:任何节点的左右子树高度差不超过1。对于任意节点,其左子树所有节点的值都。右子树:由中间元素右侧的子数组构成。左右子树自身也都是二叉搜索树。其右子树所有节点的值都。
2025-07-16 19:52:53
132
原创 leetcode hot100 day9
本质上是求某个节点的左右子树高度之和(注意此时高度按照边算而不是按照节点数算,所以空节点的高度为-1):对于每个节点,其左右子树高度之和即为通过该节点的最长路径长度(边数),用此值更新全局最大直径。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数,也就是根节点的高度。:每个节点的高度定义为从该节点到最远叶子节点的边数(叶子节点高度为0)。:每个节点的高度为左右子树高度的最大值加1(加上当前节点到子节点的边):将当前节点的左子树指向翻转后的右子树,右子树指向翻转后的左子树。
2025-07-15 21:17:34
211
原创 leetcode hot100 day8
(建议看leetcode题解:https://leetcode.cn/problems/copy-list-with-random-pointer/solutions/2361362/138-fu-zhi-dai-sui-ji-zhi-zhen-de-lian-b-6jeo/):再次遍历链表,根据原节点的随机指针设置拷贝节点的随机指针(拷贝节点的随机指针 = 原节点随机指针的拷贝)。:遍历原链表,在每个原节点后面插入其拷贝节点,形成交替链表(原节点->拷贝节点->原节点->...)。
2025-07-13 19:21:39
404
原创 leetcode hot100 day7
确定当前节点的值(sum % 10)和新的进位(sum / 10):慢指针此时指向倒数第n个节点的前驱节点,直接跳过倒数第n个节点。指向当前要交换的两个节点的前一个节点(带交换组的前驱节点)建议弄一个虚拟头节点,不然跟前面一组节点连接起来比较麻烦。遍历结束后,如果仍有进位(>0),需创建新节点存储。获取当前节点的值(如节点为空则视为0):返回哑节点的下一个节点作为新头节点。返回哑节点的下一节点作为结果链表头。19、删除链表的倒数第N个节点。24、两两交换链表中的节点。指针为交换后的后一个节点。
2025-07-12 21:57:18
143
原创 leetcode hot 100 day6
:如果两个链表相交,那么从相交节点开始,后续节点完全相同。为了找到相交的起始节点,我们需要消除两个链表长度的差异,使两个指针同时到达相交点(如果存在)。快慢指针相遇后,让快指针重置到链表头部,调正速度与慢指针一致,两者再次相遇的地方就是环的入口(建议看代码随想录)最简单的做法是把链表的数据存入list中进行比较。快慢双指针相遇肯定有环,快指针遇到null则无环。21、合并两个有序链表。pre和cur双指针。
2025-07-12 20:04:21
354
原创 leetcode hot100 day5
使用边界模拟法,设置四个边界(上、下、左、右)来表示当前未遍历的矩阵范围。按照顺时针方向(右→下→左→上)逐层遍历矩阵元素。遍历完一层后收缩相应边界,直到所有元素都被遍历完毕。但是题目要求只使用常数级别额外空间的解决方案,所以只能在原来的数组上进行操作。这里可以进行原地哈希,把数组中的正数(1~n,n为数组长度)映射到正确位置(0~n-1),不能从左上角和右下角开始搜索,这样不能确定遍历方向。一样也是先填充边界再收缩,要跟踪num的大小。41、缺失的第一个整数。48、矩阵旋转90度。240、搜索二维矩阵。
2025-07-09 17:37:00
314
原创 leetcode hot100 day4
当前区间和为负的话,无论后面加入的是正数还是负数,都不可能是最大和,所以要重置区间,注意求的是连续的子数组和。由于本题不能使用除法,所以不能只用前缀乘积来求,可以分别把左右侧乘积求出来再相乘,维护重叠区间最大右边界,因为要保存区间,所以遍历数组时要跟已经存入的区间比较。解法类似 452题的射气球,不过那个是维护重叠区间的最小右边界。560 和为K的子数组使用了前缀和的方法。用一个辅助数组备份或者三次反转。238 除自身以外的数组乘积。贪心算法,局部最优推全局最优。
2025-06-17 16:27:07
165
原创 leetcode hot100 day3
560、和为K的子数组求子串或者子数组(元素是连续的)的长度或者索引范围而且数组的元素都是非负的,通常可以尝试一下滑动窗口本题由于存在负数,而且本题要求是不能排序的,较难判断窗口什么时候该拓展,不适合滑动窗口。
2025-06-17 16:25:34
416
原创 leetcode hot100 day2
通常的做法是先选择一个数,然后使用双指针从剩下的元素寻找合适的另外两个数,使用相向双指针可以避免两层的嵌套遍历,跟回溯的思路差不多,都是先固定一个元素再检查后面的元素,只不过两层递归变成了双指针进行一层遍历。这里要注意的是外层循环(也就是选择第一个数)的去重(类似回溯的树层去重),如果使用nums[i]==nums[i+1],不能正确识别-1,-1,2类似这种情况。从数组中选择三个数组成满足特定和的组合,如果使用回溯的做法,相当于进行三个嵌套的for循环,会超时,即时进行剪枝,处理大数据耗时还是过多。
2025-05-28 14:30:42
385
原创 leetcode hot100 day1
要点在于确定连续序列的起点,如果当前元素为起点,向后拓展序列,如果当前节点不是起点,直接跳过;这样能保证集合中的元素最多只被访问两次,一次是遍历集合,一次是向后拓展序列。法二:统计单词中字母出现的次数,字母出现次数一样(将字母映射到数组下标,通过与字符a的偏移量映射)向内移动时,不确定面积是否变大,但是选择保留左右两则较高的柱子,面积一定比保留较低的柱子大。最后得到的slow代表不包括0的数组长度,需要将原数组后面的元素用0覆盖。把元素储存到Set中,达到去重的效果,之后直接遍历集合,
2025-05-26 11:24:25
241
原创 String和StringBuilder
注意string对象是如何产生的和stringbuilder的扩容是如何实现就可以了。StringBuilder对象是可变的,内部会进行扩容。String对象是不可变的,每修改一次就会创建新对象。StringBuilder常用方法。String 常用方法。
2025-04-08 17:42:18
132
原创 day2 内容管理模块——需求分析,实体设计与工程创建
什么是内容管理系统?内容管理系统(content management system,CMS),是一种位于WEB前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理系统来提交、修改、审批、发布内容。这里指的“内容”可能包括文件、表格、图片、数据库中的数据甚至视频等一切你想要发布到Internet、Intranet以及Extranet网站的信息。需求分析:用例分析略(可能后面再补)
2025-04-03 15:55:29
895
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人