自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 1227.分巧克力--二分法

听完讲解后明白不要先去考虑整体所有的巧克力怎么划分,先考虑普普通通的其中一块巧克力怎么分析,里面任意一块巧克力的长假设为x,宽假设为y。第一眼看题的思路很乱,考虑的是切出的最大边长需要受到所有巧克力中最小规格巧克力大小的束缚,后来又感觉如果这堆巧克力中大部分巧克力都远大于最小规格的巧克力,就可以不使用最小规格的巧克力。小于等于a的值都可以满足这个块数大于等于k的条件,而我们要取的是满足这个条件时这些a的取值中的最大值,假设为amax。即判断条件:当a取某一值时满足可以切出的巧克力的块数大于等于k。

2024-05-27 20:11:11 304

原创 平衡二叉树,二叉树的路径,左叶子之和

这道题目要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子。判断一个树的左叶子节点之和,那么一定要传入树的根节点,递归函数的返回值为数值之和,所以为。因为是前序遍历,需要先处理中间节点,中间节点就是我们要记录路径上的节点,先放进。当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和。的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么。

2024-03-03 10:37:16 825

原创 二叉树最小深度,最大深度,完全二叉树结点数

确定单层递归的逻辑:先求它的左子树的深度,再求右子树的深度,最后取左右深度最大的数值 再+1 (加1是因为算上当前中间节点)就是目前节点为根节点的树的深度。确定单层递归的逻辑:先求它的左子树的深度,再求右子树的深度,最后取左右深度最大的数值 再+1 (加1是因为算上当前中间节点)就是目前节点为根节点的树的深度。确定单层递归的逻辑:先求它的左子树的节点数量,再求右子树的节点数量,最后取总和再加一 (加1是因为算上当前中间节点)就是目前节点为根节点的节点数量。

2024-03-01 16:42:22 992

原创 d13_二叉树的翻转和对称

因为我们要比较的是根节点的两个子树是否是相互翻转的,进而判断这个树是不是对称树,所以要比较的是两个树,参数自然也是左子树节点和右子树节点。对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了。首先想清楚,判断对称二叉树要比较的是哪两个节点,要比较的可不是左右节点!比较二叉树外侧是否对称:传入的是左节点的左孩子,右节点的右孩子。左节点为空,右节点不为空,不对称,return false。层序遍历一个二叉树。比较内侧是否对称,传入左节点的右孩子,右节点的左孩子。

2024-02-28 12:16:27 1325

原创 day_12二叉树理论基础以及遍历

运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。分析一下为什么刚刚写的前序遍历的代码,不能和中序遍历通用呢,因为前序遍历的顺序是中左右,先访问的元素是中间节点,要处理的元素也是中间节点,所以刚刚才能写出相对简洁的代码,那么再看看中序遍历,中序遍历是左中右,先访问的是二叉树顶部的节点,然后一层一层向下访问,直到到达树左面的最底部,再开始处理节点(也就是在把节点的数值放进。

2024-02-26 20:46:11 1624 2

原创 d11栈与队列

push(value):如果push的元素value大于入口元素的数值,那么就将队列入口的元素弹出,直到push元素的数值小于等于队列入口元素的数值为止。此时我们需要一个队列,这个队列呢,放进去窗口里的元素,然后随着窗口的移动,队列也一进一出,每次移动之后,队列告诉我们里面的最大值是什么。其实队列没有必要维护窗口里的所有元素,只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队列里的元素数值是由大到小的。你只可以看到在滑动窗口内的。但如果把窗口里的元素都放进队列里,窗口移动的时候,队列需要弹出元素。

2024-02-09 12:39:25 831

原创 d10栈的应用

在进一步看,本题中每一个子表达式要得出一个结果,然后拿这个结果再进行运算,那么这岂不就是一个相邻字符串消除的过程,和1047.删除字符串中的所有相邻重复项中的对对碰游戏是不是就非常像了。栈的目的,就是存放遍历过的元素,当遍历当前的这个元素的时候,去栈里看一下我们是不是遍历过相同数值的相邻元素。第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号。因为从栈里弹出的元素是倒序的,所以再对字符串进行反转一下,就得到了最终的结果。返回一个表示表达式值的整数。

2024-02-03 20:12:30 1243 1

原创 d9栈队列的模拟练习

boolean offerFirst(E element): 将指定元素添加到双端队列的头部,如果成功则返回true,如果队列已满则返回false。boolean offerLast(E element): 将指定元素添加到双端队列的尾部,如果成功则返回true,如果队列已满则返回false。队列是先进先出的规则,把一个队列中的数据导入另一个队列中,数据的顺序并没有变,并没有变成先进后出的顺序。E peekFirst(): 获取双端队列的头部元素,但不移除它,如果队列为空则返回null。

2024-02-03 16:36:38 804 1

原创 d8KMP算法练习

数组长度减去最长相同前后缀的长度相当于是第一个周期的长度,也就是一个周期的长度,如果这个周期可以被整除,就说明整个数组就是这个周期的循环。找到了最长相等的前缀和后缀,匹配失败的位置是后缀子串的后面,那么我们找到与其相同的前缀的后面重新匹配就可以了。最长相等前后缀的规则,当一个字符串由重复子串组成的,最长相等前后缀不包含的子串就是最小重复子串。,这样组成的字符串中,后面的子串做前串,前面的子串做后串,就一定还能组成一个。为模式串长度,因为在匹配的过程中,根据前缀表不断调整匹配的位置,可以看出。

2024-02-03 14:39:04 823 1

原创 d7字符串练习

对于字符串,我们定义两个指针(也可以说是索引下标),一个从字符串前面,一个从字符串后面,两个指针同时向中间移动,并交换元素。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为。思路:很多数组填充类的问题,其做法都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作。扫描结束后,光标在读取的最后一个数字后面,光标在本行中。扫描结束后,光标在读取的最后一个字符后面,光标在本行中。

2024-02-01 00:12:36 779 1

原创 d6哈希表练习

在遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。数组里出现过,其实这个思路是正确的,但是我们有一个非常棘手的问题,就是题目中说的不可以包含重复的三元组。首先定义 一个map,key放a和b两数之和,value 放a和b两数之和出现的次数。遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。就不能使用双指针法,因为两数之和要求返回的是索引下标,不能有重复的三元组,但三元组内的元素是可以重复的!

2024-01-30 20:44:04 888 1

原创 d5哈希表练习

set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下标位置,因为要返回x 和 y的下标。目的用来存放我们访问过的元素,因为遍历数组的时候,需要记录我们之前遍历过哪些元素和对应的下标,这样才能找到与当前元素相匹配的(也就是相加等于。本题,就需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是是否出现在这个集合。直白来讲其实数组就是一张哈希表。给出一个元素,判断这个元素是否出现过,如果出现过,返回这个元素的下标。

2024-01-30 17:48:51 739 1

原创 d4链表练习

题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。,请你找出并返回两个单链表相交的起始节点。走一个节点,有环的话,一定会在环内相遇呢,而不是永远的错开呢。我们求出两个链表的长度,并求出两个链表长度的差值,然后。也出发一个指针,这两个指针每次只走一个节点,题目:给你一个链表,删除链表的倒数第。,返回链表开始入环的第一个节点。来表示链表尾连接到链表中的位置(,仅仅是为了标识链表的实际情况。因为要找环形的入口,那么要求的是。

2024-01-29 13:03:44 769

原创 d3链表移除元素,设计,反转

void addAtIndex(int index, int val) 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向。移除头结点和移除其他节点的操作是不一样的,因为链表的其他节点都是通过前一个节点来移除当前节点,而头结点没有前一个节点。以指示链表中的上一个节点。

2024-01-28 13:05:32 839

原创 d2有序数组的平方、长度最小的子数组、螺旋矩阵

滑动窗口根据个人理解就是,先通过遍历起始位置一直到形成第一个大于数组内元素的值的和大于目标值的子数组,接着将这个子数组称为起始窗口。指针进行更新,当其中一个指针到达边界时循环结束,接着分别用两个循环,将其中未遍历到边界的指针进行遍历到边界并将值赋给新数组即可,最后。值为止然后移动结束位置的指针,添加新的元素进入到原来子数组中,接着继续移动起始位置的指针,并修改。并不能决定每一圈的起始位置和边界条件,它们只是循环遍历时的一个进行遍历的工具,的值进行比较,将小的赋值给新数组的方向指针所指向的空间,并对。

2024-01-26 00:16:04 348 1

原创 d1递归练习

第三层有n*(n-1)个分支,每个分支含有一个o(n)的for循环;时间复杂度为o(n*n*(n-1));个分支,每个叶节点需要输出一个方案(也是o(n)的复杂度),因此时间复杂度也是n!(通常按从小到大的顺序枚举得出的结果就是按字典序最小的顺序)个分支,每个分支含有一个o(n)的for循环;第二层有n个分支,每个分支含有一个o(n)的for循环;时间复杂度为o(n*n);第一层只有一个结点,有一个o(n)的for循环;时间复杂度为o(n);简单的斐波那契:(递归实现)总时间复杂度化简为O(n*n!

2024-01-24 20:45:48 733

原创 二分查找、移除元素

if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=因为数组在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。元素的顺序可以改变。

2024-01-24 15:00:52 822

空空如也

空空如也

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

TA关注的人

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