自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 收藏
  • 关注

原创 Day34(1005.K次取反后最大化数组和,134.加油站,135.分发糖果)

然后我们再考虑第二种情况,即左边比右边大,此时我们要以左边为基准, 所以应该从后向前遍历,若rating[i]>rating[i+1],此时按照常规应该是candy[i] = candy[i+1] +1,但是我们已经完成了从前向后的遍历,目前candy这个数组里面已经有数据了,为了取得最少的糖果使用量,所以从后向前遍历的时候candy[i] = max(candy[i] , candy[i + 1]+1)。

2023-11-15 16:51:31 274

原创 Day32(122.买卖股票的最佳时机||,55.跳跃游戏,45.跳跃游戏||)

解题思路:本题解题的关键点是对利润的拆解假设第0天买入,第3天卖出,则利润是prices[3]-prices[0],则利润可以拆分为prices[3]-prices[2]+prices[2]-prices[1]+prices[1]-prices[0],所以采用贪心的思路,贪就贪在只收集利润为正的天数。解题思路:这题的关键也是求能够跳跃的范围,设置两个变量分别记录当前最远覆盖范围和下一次跳跃最远的覆盖范围。

2023-11-14 16:12:57 161

原创 Day31(贪心算法455.分发饼干,376.摆动序列,53.最大子序列和)

按照题目要求,若只有两个元素且不相同的时候,则为两个峰值,但是此时无法同时计算出prediff和curdiff的值,例如[2,5],我们不能对prediff和curdiff完成计算,所以我们可以将[2,5]等价替换为[2,2,5]相当于造一个平坡给他。此时我们默认最右边的元素就是一个峰值,然后第一个元素按照规则来判断。解题思路:这题使用贪心算法求解,总体思路就是当当前的子序列和为负数的时候直接抛弃当前子序列和,从下一个元素重新开始求和,因为当子序列和为负数的时候,只会拖累总体的序列和。

2023-11-13 15:52:16 252

原创 Day29(491.递增子序列,46.全排列,47.全排列||)

解题思路:这题需要求的是子序列,所以不能对原始序列进行排序,且这一题也需要对结果进行去重,重点同样也是在于“树层”去重,即已经使用过的数值在本层后面不能够再次使用,否则会出现重复结果的问题。解题思路:这题是排列问题,与组合问题不同,在一个集合内的元素相同位置不同也是不同的排列,所以应该使用一个used数组来记录哪些元素使用过,哪些元素没有使用过,同时这题应该没有startindex索引,因为排列和组合不同,元素所在位置不同即是不同排列,且这题需要列出所有的全排列,即这题应该在叶子节点收集结果。

2023-11-10 16:00:36 108

原创 Day28(93.复原ip地址,78.子集)

3、单层递归逻辑:首先进入for循环之后使用isvalid函数进行判断,验证分割的字符串是否合法,若合法则向分割的地方插入“.”然后进行下一层的递归,若不合法则直接break跳出本次循环。3、单层递归逻辑:每次进行一次递归则都需要将结果向result里面保存,进入for循环之后将遍历到的节点压入path里面,然后进行下一层的递归,最后进行回溯操作。解题思路:这题和之前的不同点在于,之前都是遍历到叶子节点收集结果,而这题需要收集每个节点的结果,把这一点理解了就能够很好的解题。

2023-11-09 10:57:50 95

原创 Day27(39.组合总和,40.组合总和||,131.分割会回文串)

1、函数返回值和传入参数:遍历全局所以函数没有返回值,传入参数应该有candidates,target,sum,startindex和used,前面几个参数在之前的题目中都有提到,但是最后一个use是bool类型的数组,用来记录哪些元素已经被使用。解题思路:这题比较特殊,组合中的元素能够重复但是组合不能重复,所以这题重点在于“去重”,如何保证符合题意要求的结果是关键,这就需要考虑到纵向去重和横向去重,这题中组合能够出现重复的数值,但是不能出现重复的组合,所以这题应该是横向去重。然后进行回溯的操作。

2023-11-08 21:10:10 46

原创 Day25(216.组合总和|||,17.电话号码的字母组合)

1、函数返回类型和传入参数:因为要遍历所有情况,所以没有返回值,而传入的参数是(int n , int k , int sum , int startindex)其中n,k是题目所给定的数值,sum是求k个数的总和,而startindex用来记录起始索引位置,防止出现重复组合。3、单层递归逻辑:首先根据输入字符取出数,然后取出这个数对应的字符,然后使用for循环遍历这个字符,将遍历到的字符压入s内,进行下一层的递归,最后进行回溯。此时的i的范围应该是n - (k - path.size(()) +1;

2023-11-07 11:18:49 108

原创 Day24回溯算法(77.组合)

解题思路:这题给出了n和k两个数的数值,即在n个数中求出数量为k的组合,若k较小例如2,3则能够使用多层循环来解决,(k=2则使用两层for循环,k=3则使用三层for循环),然而当k的值较大的时候显然这样用暴力的循环解决是不现实的。在 这个n叉树里面,用递归来控制树的深度,而for循环来控制树的宽度,即使用递归来纵向控制,for循环横向控制。因为我们所求的是组合即[1,2]和[2,1]是为同一个组合所以此时我们需要设置一个startindex来控制只取大于当前的值来构成组合,这样就能避免出现重复的组合。

2023-11-06 20:56:27 58

原创 Day23(669.修剪二叉搜索树,108.将有序数组转换成二叉搜索树,538.将二叉搜索树转换成累加树)

解题思路:按照题目要求这题需要构造平衡二叉搜索树,而按照平衡二叉搜索树的特性,即左孩子小于根节点,右孩子大于根节点,我们即可将数组的区间中点设置成根节点,然后将数组划分成左右孩子,再继续到左右孩子里面按照区间中点设置成根节点的规则来构建二叉搜索树,即使用递归的方式来完成。3、单层递归逻辑:寻找区间中点,mid = (right + left)/2,将区间中点的值设置成根节点,然后因为是左闭右闭区间,所以向左递归的时候的区间应该是[left,mid-1],向右递归的区间是[mid+1,right]。

2023-11-06 10:34:46 84

原创 Day(235. 二叉搜索树的最近公共祖先 ,701.二叉搜索树中的插入操作,)

其次要找最近的公共祖先则就是找到位于q,p这两个节点值区间内的节点,而第一次遇到的位于q,p区间内的节点就是最近公共祖先,因为如果再往左遍历或再往右遍历都会错过其中一个节点,而成为另外一个节点单独的祖先。3、单层递归逻辑:当cur->val同时小于p,q节点的值的时候,此时应该向右遍历,当cur->val同时大于q,p节点值的时候,此时应该向左遍历,直到cur->val位于q,p节点值的范围内。1、终止条件:当节点为空的时候,即为需要插入节点的地方,即新建一个节点并且返回该节点。

2023-11-02 20:46:43 65 1

原创 Day21(530.二叉搜索树的最小绝对差,501.二叉搜索树中的众数,)

c.单层递逻辑:因为是中序遍历所以先向左递归,然后是中间的处理操作,当count == max_count的时候,则向result里面压入cur->val,当count>max_count的时候表示当前元素出现的频率为最高频率,之前result里面保存的元素都比最新的这个元素出现的频率小,所以要清空result,然后跟新max_count,即max_count = count。2、递归函数返回类型和传入参数:因为返回的是节点,所以返回的是TreeNode*类型,而传入的是参数是根节点和目标节点p,q。

2023-10-31 21:09:38 98 1

原创 DAY19(654.最大二叉树,617.合并二叉树,700.二叉搜索树中的搜索,98.验证二叉搜索树)

解题思路:同样是使用递归的方式来解决,但是需要注意二叉搜索树的特性是左子树所有的值小于根节点,右子树所有的值大于根节点,即如果将二叉搜索树按中序遍历展开的话应该是一个有序数组,所以很容易踩坑,可能出现右子树的左子树中的某个值小于这个二叉树的根节点的情况。3、单层递归逻辑:首先找到这个数组中的最大值的索引,然后将这个最大值赋给根节点,然后以这个最大值的索引进行切割,左边的数组是左子树,右边的数组是有子树,然后将这两个数组分别传入递归函数,继续寻找。解题思路:同时操作两个二叉树,进行同步遍历。

2023-10-30 16:01:50 112 1

原创 Day18(513.找树左下角值,112.路径总和,106.从中序与后序遍历构造二叉树)

今天把这三题弄明白花了不少时间,思路下次整理更新。

2023-10-28 20:35:49 29 1

原创 DAY17(110.平衡二叉树,257.二叉树所有路径,404.左叶子之和)

采用一个path来记录路径,一个result来存储结果,当遍历到下一个节点的时候则保存进path中,当达到了遍历终止的条件的时候,即到达叶子节点,即返回path中所存储的路径,然后使用pop将已经收集到的路径节点弹出,继续收集新的路径。若使用当前节点进行判断的话, 则无法判断出这个节点是左叶子还是右叶子,所以需要用父节点进行判断,即父节点的左孩子不为空,左孩子的左孩子为空,左孩子的右孩子为空,即为左叶子节点,然后进行搜集信息。1、函数返回值类型为int,用来返回左叶子的和,传入参数即节点。

2023-10-27 11:23:10 107 1

原创 DAY16(104.二叉树最大深度,111.二叉树最小深度,222.完全二叉树的节点个数)

什么是二叉树的高度和深度深度:根节点到某个节点的路径(从上往下)高度:叶子节点到某个节点的路径(从下往上)

2023-10-26 20:42:21 27

原创 DAY15(102.二叉树的层序遍历,226.翻转二叉树,101.对称二叉树)

解题思路:使用一个队列que和一个计数器size来实现,size是当前队列的大小,即遍历完当前所在层需要循环弹出元素多少次。具体操作如下图所示,首先将根节点1放入队列中,此时队列大小为1,即只需要循环弹出1个元素即进入第二层遍历。弹出1之后,将1的左右孩子压入队列中,此时size为2即需要循环弹出两次元素才能完成第二层的遍历,且在弹出元素2之后,需要将2的左右孩子压入队列中,再弹出3,且加入3的左右孩子。此时size为4,即需要循环弹出4次才能完成这一层的遍历。

2023-10-26 17:22:14 26

原创 day14(144.二叉树的前序遍历,94.二叉树的中序遍历,145.二叉树的后序遍历)

思路:中序遍历的时候由于遍历的节点和操作的节点不一样,所以需要使用栈来保存。解题思路:对于前序遍历而言,遍历的节点和操作的节点是相同的,所以直接将遍历的节点压入栈内再弹出,然后再将其右孩子和左孩子压入站内,此时栈的顶部就是节点的左孩子,然后继续上述的操作,即先将该节点弹出,然后再压入其右孩子和左孩子,直到节点的左右孩子为空,然后再依次弹出站内元素,并且重复操作该元素,最后即可实现前序遍历。后序遍历迭代实现的方式很简单,只需要在前序操作的基础上调换左右孩子入栈的顺序,最后将数组做一个倒序,即可实现后序遍历。

2023-10-26 10:58:11 92

原创 DAY14二叉树基本理论

int val;

2023-10-26 09:03:57 32

原创 DYA13(239.滑动窗口最大值,347.前K个高频元素)

题目描述:解题思路:首先想到的是暴力解法,即按滑动窗口的大小来依次遍历元素,然后每次完成遍历之后选取其中最大值进行输出保存。优化思路:能够维护一个单调队列,使得队列出口处的元素为最大值,对每次需要弹出的元素进行判断,若需要弹出的元素与队列出口处元素相同则弹出,否则不进行任何操作。对队列入口处的元素进行判断,若需要进入队列的元素大于队列里面的元素,则挨个向后弹出队列里面的元素,直到队列为空或则队列中的元素大于需要进入队列的元素。实现单调队列之后按照题目示例1给出的数据,下图是具体的实现流程。

2023-10-23 16:38:52 33

原创 DAY11(20.有效括号,1047.删除字符串中的所有相邻重复项,150.逆波兰表达式求值)

20.有效括号使用栈来解决。最原始的思路就是遍历字符串,然后将遍历到的字符存入栈内。如果发现有相匹配的括号的话,则弹出这一对括号,即完成“消消乐”。但是从代码实现上,会比较繁琐,且容易出错。现对不匹配的情况进行总结。有三种情况会出现return false的情况。1、左括号多了;2、右括号多了;3、左右括号不匹配。当遍历到左括号的时候,则往栈内存入对应的右括号。

2023-10-22 20:56:54 90 1

原创 算法训练营DAY10(232.用栈实现队列,225.用队列实现栈)

解题思路:栈只能先入后出,而队列需要实现先入先出,所以理想情况则是先将所有元素全部压入stack1,然后按照先入后出的顺序再全部压入stack2中,然后依次弹出stack2中的元素,则实现了先入先出的效果。首先将元素压入queue1中,然后挨个弹出queque1中的元素,queue2用来暂存这些元素,直到仅剩下最后一个元素,此时这个元素就是按照栈的顺序弹出的第一个元素,即实现了出栈的操作。然后再将queue2中暂存的元素全部转到queue1中,继续上述操作,即可实现栈的操作。

2023-10-21 09:56:16 24 1

原创 算法训练营DAY8(344.反转字符串, 541. 反转字符串II ,剑指Offer 05.替换空格, 151.翻转字符串里的单词 , 剑指Offer58-II.左旋转字符串)

解题思路:遍历字符串的时候使用步长为2k进行遍历,如果剩余字符串长度大于k,即i+k<s.size(),则将前k个字符串反转。反之则将所有字符串反转。解题思路:新学了一个解题思路,部分反转+整体反转。有一定难度,还未完全理清楚。LCR 122.路径加密。

2023-10-20 15:35:17 27 1

原创 算法训练营DAY7( 454.四数相加II, 383. 赎金信, 15. 三数之和 , 18. 四数之和 )

3、如果,nums[i] + nums[left] + nums[right] > 0,则将right向左移动,即逐步缩小nums[right],直到nums[i]+ nums[left] + nums[right] == 0,则将结果存储。2、如果,nums[i] + nums[left] + nums[right] < 0,则将left向右移动,即逐步扩大nums[left],直到nums[i]+ nums[left] + nums[right] == 0,则将结果存储。解题思路:使用双指针来求解。

2023-10-20 09:22:48 22 1

原创 DAY6(242.有效的字母异位词 ,349. 两个数组的交集 , 202. 快乐数,1. 两数之和 )

解题思路:首先编写一个函数用来计算每个位置上的平方然后求和,因为题目要求无限循环,所以创建一个unordered_set(set),若每次求和之后的sum没有出现在set中则将sum添加到set中直到最后求得的sum=1。解题思路:将nums1映射成unordered_set(num_set),然后遍历nums2,若在nums2中的元素出现在unordered_set中,则将其保存在result(unordered_ser)中,完成遍历后返回result。总结:这几道题都不是很难,思路正确了很容易解决。

2023-10-17 15:55:48 68

原创 DAY4( 24. 两两交换链表中的节点 ,19.删除链表的倒数第N个节点 ,面试题 02.07. 链表相交 ,142.环形链表II )

(PS:忙着写中期报告,只完成了代码的实现,解题思路等有空了补齐,顺便一起复习了这些知识点)

2023-10-15 19:49:43 26

原创 算法训练营DAY3(203.移除链表元素,707.设计链表,206反转链表)

需要注意的是,新增节点的时候一定要先将新节点(newnode)的指针指向cur->next(红线),然后再将cur->next指向newnode(蓝线),因为如果第一步直接将cur->next指向newnode的话,newnode->next就不知指向何处了。当使用虚拟头节点的时候需要重新new一个头节点,而这个虚拟头节点的下一个节点就是原始链表的头节点。使用第一种方式的话需要区分删除的节点是不是头节点,因为是头节点的话只需要将头节点的指针重新赋值为指向头节点的下一个节点的指针。

2023-10-14 21:02:20 387

原创 算法训练营DAY2(977有序数组的平方、209长度最小的子数组、59螺旋矩阵)

(ps:最近最近忙着测评、笔试、面试,所以没有写思路和总结,只是动手敲了一遍代码,后续有时间的话会补充思路和总结收获)学习时长2.5小时。

2023-10-12 14:02:28 649

原创 算法训练营DAY1(二分查找、移除元素)

704. 二分查找题目描述:解题思路:看见数组是升序排列且需要寻找到目标值,即可确定使用二分查找问题1:循环条件是left

2023-10-11 11:31:37 945

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除