- 博客(33)
- 收藏
- 关注
原创 leetcode刷题|动态规划-什么是动态规划?
动态规划,英文名:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的。
2023-12-01 21:40:14 96
原创 leetcode刷题|贪心算法总结
简单题目分发饼干K次取反后最大化的数组和柠檬水找零中等题目摆动序列单调递增数字解决股票问题买卖股票的最佳时机I I买卖股票最佳时机含手续费两个维度问题分发糖果根据身高重建队列区间问题跳跃游戏跳跃游戏II用最少的数量的箭引爆气球无重叠区间划分字母区间合并区间。
2023-11-30 20:12:55 103
原创 leetcode刷题|贪心 无重叠区间 划分字母区间 合并区间
其实就是用合并区间后左边界和右边界,作为一个新的区间,加入到result数组里就可以了。如果没有合并就把原区间加入到result数组。按照右边界排序,从左向右记录非交叉区间的个数。最后用区间总数减去非交叉区间的个数就是需要移除的区间个数了。从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点。统计每一个字符最后出现的位置。
2023-11-29 21:47:23 88
原创 leetcode刷题|柠檬水找零 根据身高重建队列 用最少数量的剑引爆气球
【代码】leetcode刷题|柠檬水找零 根据身高重建队列 用最少数量的剑引爆气球。
2023-11-28 22:06:46 43
原创 leetcode刷题|贪心算法 K次取反后最大数组和 加油站 分发糖果
【代码】leetcode刷题|贪心算法 K次取反后最大数组和 加油站 分发糖果。
2023-11-28 19:34:29 89
原创 leetcode刷题|排列问题 去重你了解了吗
因为需要用到所有的元素,所以排列问题是不用startIndex的,但是需要一个used记录已使用的元素(而used数组,其实就是记录此时path里都有哪些元素使用了,一个排列里一个元素只能使用一次)递增子序列去重,不能进行数组排序,所以去重的逻辑是在单层逻辑处理中,新增一个遍历HashSet保存已使用过的节点。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。数组中包含重复的元素,所以需要进行去重,去重的话需要进行数组排序。排列问题:是有序的,排列是收集的叶子节点。
2023-11-22 18:33:06 49
原创 leetcode刷题|回溯算法一周总结 子集问题
回溯算法抽象为树型后,for循环是横向遍历,递归是纵向遍历,回溯是不断的调整结果集回溯三步曲if (终止条件) {存放结果returnfor (选择本集合的结果) {处理节点回溯 撤回处理节点组合问题组合组合II电话号码的字母组合组合总和组合总和II (树层去重)切割问题分割回文串复原IP地址子集问题子集子集II (树层去重)
2023-11-21 12:04:05 36
原创 leetcode刷题|组合总和 分割回文串
去重是指:树层的去重,强调一下,树层去重,数组需要进行排序;与组合之和不同之处,集合中有重复的元素,但是集合中的元素在组合中不可重复使用。组合:在选取a之后,在bcde中选取第二个,选取b之后在cde中选取下一个。切割:在切割a之后,在bcde中切割第二段,切割b之后在cde中切割下一段。组合中元素可以重复使用,则单层逻辑处理-递归,使用i,不再是i+1。同一个集合中使用startIndex,控制for循环的起始位置。无重复的数组,组合中的元素可以重复使用。组合中不能包含重复的组合,所以需要去重。
2023-11-21 00:43:58 69
原创 leetcode刷题|组合 电话号码的字母组合,相同集合和不同集合间的组合
确定返回值和参数:返回值为void,参数是n k sum。单层逻辑:for循环,i<=9,处理和回溯是一一对应的。使用startIndex:同一个集合中,组合。不使用startIndex:不同集合中,组合。res添加path;
2023-11-21 00:21:47 40
原创 leetcode刷题|回溯-什么是回溯算法?
回溯算法也叫回溯搜索法,一种搜索方式有递归就会有回溯回溯的本质是穷举,穷举所有可能,然后得到想要的答案,效率不是很高。
2023-11-17 19:45:04 44
原创 leetcode刷题|构造二叉树,来挑战吧?
确定单层逻辑:左/右树不为空,则递归遍历,最重要的是:每次回溯时,要把添加在path数组中的最后一个值移除掉(递归中要先把节点值offer到path数组中,count是目标值-=)确定返回值和参数:返回是二叉树TreeNode,参数是中序数组,数组开始下标,数组结束下标,后序数组,数组开始下标,数组结束后下标。确定单层逻辑:左右节点不为空,则递归遍历,如果返回的为true则直接返回。确定终止条件:节点为叶子节点,且count==0,返回值中添加该路径。递归遍历中序数组区间,后序数组区间。
2023-11-14 23:26:50 55 1
原创 leetcoded刷题|二叉树搜索树-一个有序的数组
保存高频率节点,如果count>maxCount,则清空resList,添加当前节点到resList,maxCount更新;确定终止条件:root == null || root==p || root==q return root;中:节点计数,如果节点为null或者当前节点不等前一个节点值,则count=1;确定返回值和参数:返回值是节点TreeNode;如果左节点为空&&右节点为空,则返回null。如果左节点为空&&右节点不为空,则返回右节点。如果左节点不为空&&右节点为空,则返回做节点。
2023-11-14 23:14:06 56 1
原创 leetcode刷题|验证二叉搜索树 二叉树中也可以用指针吗?
方法一:递归-中序遍历后二叉搜索树节点添加到数组,是一个递增的数组,for循环判断当前值是不是大于前一个值。确认返回值和参数:返回值是构造的最大二叉树 TreeNode,参数是数组,数组开始下标,数组结束下标。确定返回值和参数:返回值是搜索值的子树TreeNode,参数是root,val(搜索值)确定终止条件:如果root==null 或者root.val==val,则返回root;while循环遍历,搜索值大于root.val,则root=root.right。终止条件:root==null;
2023-11-14 16:09:03 54 1
原创 leetcode刷题|平衡二叉树,首次回溯 来看看?
确定终止条件:root.left==null && root.right==null return 数组(把path数组转换成String)获取两树的高度差的绝对值,如果高度差>1,返回-1(此时不是平衡树);求的是左叶子节点之和,注意叶子节点是左右孩子都为空。左叶子,即是左叶子节点不为空,但左叶子节点的左右孩子都为空。确定单层逻辑:中间节点添加到StringBuilder字符串,递归左子树,递归右子树。获取左子树高度,高度=-1,return -1;获取右子树告诉,高度=-1,return -1;
2023-11-13 00:05:40 44
原创 leetcode刷题|二叉树的最大 最小深度以及节点数【DFS】
注意不能按照最大深度写法,因为如果根节点没有左孩子,或者右孩子的话,最小值就是1而非最近的叶子节点的路径上的节点数。采用后续遍历的方式,因为是N叉树,所以要循环遍历N叉树 Node<List> root.children。二叉树的高度:叶子节点到任意根节点的最长路径节点数(叶子节点为1)二叉树的深度:根节点到任意叶子节点的最长路径节点数(根节点为1)避免误区,如果没有左子树,最小深度就是 1+ 右子树的高度。确定返回值和参数:返回int类型,参数是root节点。确定单层的逻辑:左子树+右子树+1。
2023-11-09 23:28:02 62 1
原创 leetcode刷题|二叉树层序遍历 学会后可打10道题,来挑战吧
注意对称二叉树不是比较左右孩子,而是比较根节点的左子树和右子树是不是相互翻转的。借助队列,先进先出,根据每层的长度进行循环模拟加入队列。与二叉树的程序遍历唯一区别是,返回的结果翻转一下。117.填充每个节点的下一个右侧节点指针II。116.填充每个节点的下一个右侧节点指针。递归方式 前序、后序递归都可以翻转二叉树。把每个节点的左右孩子翻转一下就可以。使用addFirst函数即可。515.在每个树行中找最大值。104.二叉树的最大深度。111.二叉树的最小深度。
2023-11-09 10:57:34 40 1
原创 leetcode刷题|堆和队列 经典题目&总结
栈是容器适配器,底层容器使用的不同的容器,导致栈内的数据在内存中是不连续分布的栈的经典题目括号匹配问题是典型的栈的使用三种不匹配的情况(左边括号多了、左右括号不匹配、右边括号多了)在匹配到左括号的时候,在栈中push右括号,只需要比较当前元素是不是与栈顶相同,匹配完之后栈为空,则说明匹配完成;不为空则说明匹配不完成字符串重复问题把字符串按照顺序push到栈中,只需比较当前字符串与栈顶是不是相同,相同则弹出,最后字符串不为空则调整字符串的顺序即可逆波兰表达式。
2023-11-06 18:56:46 60
原创 leetcode刷题|栈 有效括号,模拟栈你会了吗?
最后栈不为空,则为不重复的字符串,while循环改变字符串顺序。字符串未遍历完,栈顶对象与字符串不匹配(左边不匹配)逆波兰表达式,也叫后缀表达式(遍历顺序:左右中)运算,运算的结果还是添加到栈中,直到循环结束。字符串未遍历完,栈已经空了(左边括号多)不存在栈中的添加到栈中,与栈中匹配的消除。字符串遍历完,栈不为空(右边括号多了)匹配的字符串添加到栈中,然后做消消乐。循环数组,添加到栈中,然后模拟。使用栈的思路,循环遍历字符串。使用栈模拟不匹配的三种场景。结果为移除栈中的对象。
2023-11-04 20:05:18 39 1
原创 leecode刷题|栈和队列 它们是容器吗?
栈是后进先出,栈是以底层容器完成工作的,对外提供统一的接口,栈是可以插播的(我们可以选择使用哪种容器),栈的底层可以是deque、list、vector,主要是数组和链表实现。栈和队列不是容器,是容器适配器。队列是先进先出。
2023-11-03 21:22:10 78 1
原创 leetcode刷题|字符串总结&双指针回顾
字符串反转+2K反转在for循环上做文章+左旋旋转KMP算法+前缀表+Next数组-1的实现方式。
2023-11-02 23:23:45 41 1
原创 leetcode刷题|花式反转字符串,还不够?
反转字符串(方法类似于反转字符串,344反转字符串是char[],这个是stringBuilder.setCharAr(index, element))双指针法:可以动态扩充,本题是标点替换为空格,所以没有扩充,while遍历,进行数据替换。while循环,left<right,移动之后,left++、right--StringBuilder是新增了一个字符串空间,循环符合条件的。使用双指针法,两个指针同时向中间移动,并交换字母。在当前循环中,i是开始反转的起点,终点是。最后返回String类型的数据。
2023-11-01 21:45:38 42 1
原创 leetcode刷题|哈希表 学会两数之和之后,挑战三数之和 四数之和 甚至N数之和?
while循环right>left,如果sum0,right指针左移,sum=0,找到了三元组,通过Arrays.asList(a,b,c)添加到结果集;nums[i],left=i+1,right=nums.length-1,a=nums[i],b=nums[left],c=nums[right]获取三数之和。最后遍历数组record,如果有
2023-10-31 13:08:24 52 1
原创 刷题Day4|链表-环形链表你会了吗?
一个虚拟节点dummy,两个相邻的节点交换需要三个步骤:dummy➡️2,2➡️1,1➡️3,dummy后移两位继续循环,当dummy.next || dummy.next.next 为null,终止循环。
2023-10-28 18:32:24 60 1
原创 刷题Day3|链表-指针的魔力
链表是由指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域,一个是指针域(指向下一个节点的指针),最后一个节点的指针域指向null。链表单链表:指针只能指向下一个节点双链表:有两个指针,一个prev(指向上一个节点)、一个next(指向下一个节点)循环链表:首尾相连的链表链表插入/删除时间复杂度查询时间复杂度适用场景链表O(1)O(n)数据量不固定,频繁删除,较少查询数组O(n)O(1)数据量固定,频繁查询,较少删除。
2023-10-28 00:35:01 65 1
原创 算法刷题Day2|数组篇之977. 有序数组的平方 209. 长度最小的字数组 59.螺旋矩阵II
双指针法,最大平方和一定是在两边,循环左右指针往中间比较定义一个新数组,大小和原数组一样。while循环左右指针,若左边的平方和大于右边的平方和,新数组中把左边的平方和赋值,index--,left++;反之,右边的平方和赋值新数组,index--,right--
2023-10-26 22:26:51 237
原创 算法刷题Day1|数组篇之704.二分查找法 27.移除元素
遵循循环不变量原则,确定数组的区间,左闭右闭、左闭右开,target在middle左区间,则右边界移动;反之左边界移动,相等则middle为target的下标。双指针,快指针查找不用删除的元素;慢指针:更新数组元素的下标。循环快指针,如果快指针找到val,则slowindex不用更新;写在末尾:开始写算法刷题博客的第一天,特此记录,用来激励自己持续输出。路漫漫其修远兮,吾将上下而求索,与君共勉。
2023-10-25 20:36:50 411
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人