自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 算法刷题 - 贪心算法part1|455.分发饼干|376. 摆动序列|53. 最大子序和

解题思路:在这题中我们可以发现局部最优是当出现一段连续和为负数的情况,那么这个时候应该直接抛弃前面的子数组,因为这样再加下去只会让下一个数更小,应该由下一个新的数作为新的起点。同理可得,如果当前的连续和只要依然还是正数的话就要一直保留,因为正数不管是大是小对于后面的数都是有增大作用的。解题思路:按照规则,为了找到全局最优解,在每一次发放饼干时要尽量不能造成饼干的浪费,我们应该把最大的饼干分给胃口最大的孩子,这个就是局部最优解。

2024-09-24 21:41:27 315

原创 算法刷题 - 回溯算法part3|93.复原IP地址|78.子集|90.子集II

解题思路:在求子集的问题上和之前的组合/组合总和问题在收集结果的方式是不太一样的。组合问题通常是在叶子节点取结果,靠的是终止条件。而子集问题应该在每一个可能的节点都要收集结果。因此在每一次能执行的回溯都需要收集结果。复原IP地址其实和切割字符串类似,只不过在切割的时候需要在原来的字符串上判断当前截取片段的可行性并添加逗点。解题思路:这题是在上一题的思路上加上了去重逻辑,去重部分和昨天的组合问题思路类似。

2024-09-21 01:12:20 224

原创 算法刷题 - 回溯算法part2|39. 组合总和|40.组合总和II|131.分割回文串

因此这个时候需要一个used数组来对每一个节点的使用情况进行跟踪,第二个条件就是used数组对应前一个元素used[i-1]的下标是0,因为回溯之后我们用的是第二个新的‘1’,因此我们可以判断这个是同树层的重复元素,应当跳过。解题思路:这题和之前的组合问题有些不一样的地方在于之前我们所要找的的组合长度是固定的,但是这道题没有固定的长度,因此深度我们也是没办法确定的,而是需要判断和的情况来判断深度。并且下一层回溯中传入的startIdex应该是i而不是i+1,因为元素是可重复的,自身也应该被下一层考虑。

2024-09-20 05:07:36 356

原创 回溯算法part1 - 回溯算法基础|77.组合|216.组合总和III|17.电话号码的字母组合

回溯法指的是回溯搜索法,是一种搜索方式。比如在二叉树的搜索中,在递归的过程中实际上蕴涵了回溯,有递归就有回溯,回溯函数即为递归函数。

2024-09-19 07:44:50 731

原创 算法刷题Day17 - 二叉树Part5|617.合并二叉树|700.二叉搜索树中的搜索|98.验证二叉搜索树

解题思路:这题在搜索二叉树的基础上需要按照二叉搜索树的特性来搜索,如果target是大于当前节点值,那么目标值一定在右子树,这样只需要向右搜索就行了,反之同理。在第一次写递归法的时候想法特别简单,在写判断条件的时候容易陷入一个误区,我们在判断当前节点大于左节点并且小于右节点时就返回true,但其实二叉搜索树的特性是。因为二叉树应该是和整体的根节点来比较的,这样的判断条件只能证明当前遍历到的某个子树满足了二叉搜索树的特性,但不能保证整体是一个二叉搜索树。利用这个特性,我们在。

2024-09-17 04:46:58 289

原创 算法刷题Day16 - 二叉树Part4|513.找二叉树左下角的值|112.路径总和|113.路径总和II|106.从中序后序遍历构造二叉树

同时注意这里的targetSum在遍历左右子树前其实已经是隐式回溯了,因为这里减去root.val是传递给左或右子树的参数的,当前层需要用到targetSum的情况已经在这之前判断过了,因此不用显式地在遍历完左右子树后加回root.val来体现回溯。解题思路:递归题目先确定终止条件,终止条件除了根节点为空,其次就是叶子节点,在叶子节点判断叶子节点的值是否是targetSum,如果是的话就返回true。解题目标:给定一个二叉树和目标和,记录该树所有叶子节点到根节点的路径和等于目标和的情况。

2024-09-14 05:40:48 430

原创 算法刷题Day15 - 二叉树part3|110.平衡二叉树|257.二叉树的所有路径|404.左叶子之和|222.完全二叉树的节点个数

在递归当中,虽然我们单次递归最终求的是当前高度,但是最终我们需要判断的是是否平衡,因此可以向上层传递一个固定的高度为-1,表明当前子节点已经不符合平衡二叉树的定义了,-1则一层层向上传递,因此在最后只需要判断根节点所得到的返回值是否是-1即可。但是这题为满二叉树,以上的方法就是把所有的节点都遍历一遍,复杂度为O(n)。解题思路:这道题依旧是递归并且后序遍历,需要注意的是在判断是否是左叶子的时候不能等到遍历到左叶子的时候再去判断,因为如果只有叶子节点是无法判断其左右的,应该在父节点就判断是否存在左叶子节点。

2024-09-13 05:46:25 341

原创 算法刷题Day14 - 二叉树Part2|226.翻转二叉树|101.对称二叉树|104.二叉树最大深度|111.二叉树最小深度

(左右中),因为当前节点是否翻转与另一边的节点相等需要率先判断左右子节点给到的信息才能得出结果。注意在单次迭代的时候左节点的左子节点相比较的是应该是右节点的右子节点(外侧节点),内侧节点也是同理。左子树比较顺序是左右中,右子树的比较顺序是右左中,最后判断一定是左右都处理完后才判断中节点。解题思路这里的翻转二叉树翻转的不只是数值,而是改变左右指针的指向。解题思路:这道题刚开始自己写的时候思路有错,不能单纯地判断左右子树是否相等,而是相互翻转的关系。(左右中),因为在每一层都要先判断左右子节点的最大高度。

2024-09-12 05:52:15 331

原创 算法刷题Day12~13 二叉树part1|二叉树基础|递归遍历

int val;

2024-09-12 02:45:12 576

原创 算法刷题Day11 - 栈与队列part2|LC.150 逆波兰表达式求值|LC.239 滑动窗口最大值|LC.347 前K个高频元素

解题思路:遍历一个逆波兰表达式,如果遇见数字则加入栈中,如果两个数字遇见了一个操作符,就在栈中消除合成一个数字,再加入到栈中,最后的结果也就是栈中的最后唯一一个元素。同时需要注意的是因为逆波兰表达式的遍历方式是左右中,因此在减和除的操作应该是第二个减或除以第一个数字。逆波兰表达式也称为后缀表达式,我们平常写出来的数学表达式大多为中缀表达式,如(1+2) * (3+4)。中缀表达式需要加括号才能正确运算,但是后缀表达式就可以不用括号表示,用顺序就能计算出正确结果,这个计算过程就是由栈来实现的。

2024-09-10 07:16:53 407

原创 算法刷题Day10 - 栈与队列part1|栈与队列基础|LC.232 用栈实现队列|LC.225 用队列实现栈|LC20.有效的括号|LC1047. 删除字符串中所有相邻重复项

解题思路:用两个栈来模拟队列,先把所有元素入栈stackIn,再依次出栈放到另一个stackOut栈中。stackIn相当于一个暂存区,关键是出栈的逻辑,假如stackOut的元素还没出完是不能添加进去的,否则顺序就乱了,必须先判断stackOut是否为空才能从stackIn出栈再全部加入。解题思路:这题可以只用一个队列来达到目的,在pop的时候得到的是栈的顶层元素,但在队列中就相当于弹出队列中最后一个元素,队列中能够弹出的也只能是头一个元素,因此每一次push就把第1~n-1个元素重新排列进队列即可。

2024-09-07 08:40:35 577

原创 算法刷题Day8 - 字符串part1|LC.344 反转字符串|LC.541 反转字符串 II

解题思路:这题的题目规则似乎很复杂,需要抓取其中的特定规律就可以简化代码,其实就是最好尾部能否凑足k个元素的不同操作的区别只需在每2k个区间内判断是否够k个元素来进行不同区间的反转。注意事项:这里要注意的是临界值判断的问题,这里反转区间统一采用左闭右开区间,在够k个的情况是小于等于的,因为去掉等于的情况就相当于跳过了最后末尾刚好够k个的情况。解题目标:给定一个字符串和正整数k,每2k个字符反转前k个字符,如果最后不够2k个且不够前k个就剩下的都反转,如果够前k个就反转前k个。

2024-09-06 05:37:51 317

原创 算法刷题Day7 - 哈希表part2|LC.454 四数相加 II|LC.383 赎金信|LC.15 三数之和|LC.18 四数之和

实际上可以在这个思路上进一步优化,把前两个数组A[i]+B[j]的元素相加并放入集合,再遍历后两个数组的元素和来对集合里的数进行判断是否有与集合中的元素相加等于0的情况,这样n^2就可以达到目的。还有这题必须要用map来进行统计的原因是A+B数组的元素和可能会有不同的排列组合,比如呀1+4,2+3都是5,因此我们的key保存的是前两个数组元素和的值,value应该要保存两数之和出现的次数,判断中应该每次加的是之前所统计的出现次数而不是单纯的加一。:为什么是分为两组?

2024-09-06 03:40:00 317

原创 算法刷题Day5~Day6 - 哈希表part1|哈希表基础|LC.242 有效字母的异位词|LC349. 两个数组的交集|LC202. 快乐数|LC1. 两数之和

这里的num>0的循环条件并不会形成死循环,按照逻辑处理完所有数位后n会变成小数,但因为num定义为int,Java的除法机制自动丢弃小数部分,因此处理完之后num就是等于0的,退出循环。注意这里键值对中key是数值而不是index,因为我们在查找的时候是根据差值diff来查找的,因此key为数组中的数值,value为index。因为数组里的数值大小我们是无法确认的,这时候做哈希映射的时候用数组就不太合适了,因为确定不了一个固定的数组长度(leetcode上更新了数字大小的上限,其实是可以做的)。

2024-09-04 00:58:03 777 1

原创 算法刷题Day4 - 链表part2|LC.24 两两交换链表中节点|LC.19 删除链表的倒数第N个节点|LC.160 链表相交|LC.142 环形链表

这个写法对于没有交点的情况并不会出现死循环不能正常返回null,因为最后两个指针一定是相等的,判断条件也会停止,也就是两个指针都是null的情况即返回null。这题为双指针思路,fast和cur都从dummy节点开始,快指针fast先移动n个位置,再同时移动cur和fast,因为目标节点和最后一个节点的距离是确定的,注意cur指针指向的应当是。首先比较简单的思路,就是算出两个链表的长度差值n,让长的那个链表先走n步使得两个链表的两个指针在同一起跑线进行移动,循环后可以直接判断是否有交点;

2024-09-03 00:08:26 918

原创 算法刷题Day3 - 链表part1|链表基础|LC203. 移除链表元素|LC707. 设计链表|LC206. 反转链表

在我第一次写的时候疏忽了一个细节,在判断下一个节点是删除对象并且改动next指向的时候不应该把current向后移,因为有可能next所指向的新的节点也是删除对象,直接后移就相当于跳过了,因此要保证检查完下一个不是删除对象的时候current才能往后移。移除链表中的元素,本质上就是改动移除元素的前一个节点的下个指针直接指向移除元素的下一个节点。注意插入节点的操作常犯的错就是步骤的问题,可能会直接把前一个节点之间连接到新的节点,但是新的节点想要链接到下一个节点的时候发现取不到了。链表也有不同的类型,如。

2024-08-31 01:39:35 390

原创 算法刷题Day2 - 数组Part2|LC209. Minimum Size Subarray 最小长度子数组|LC59. Spiral Mareix II 螺旋矩阵 II|

今天这两题是数组中的Medium题,比起昨天的基础的数组增删改查操作的题目稍复杂。

2024-08-29 23:46:51 395

原创 算法刷题Day1- 数组part1|数组基础|LC704. Binary Search|LC27. Remove Element|LC977. Squared of a Sorted Array

数组中移除元素时,删除的时候并不是单纯删除了这个地址位置,而是之后的元素需要一一向前补位,比如 [1,2,3,4,5] 删除元素2, 那么数组就是变成了 [1,3,4,5,_] ,至于最后一个数是什么无所谓,因为我们所需要的结果和最后一个数 无关。双指针思路主要是用fast指针来判断新数组所需要的值(即不等于我们需要删除的target的元素),把fast赋值给slow的位置,slow负责更新新数组的每一个位置,这样只要通过一次遍历并且在原数组上进行操作即可。我们可以抓住平方的特性,最大的平方数一定是在。

2024-08-29 01:01:17 379 1

空空如也

空空如也

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

TA关注的人

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