自定义博客皮肤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)
  • 收藏
  • 关注

原创 Day21、二叉树part07

给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。用一个pre节点记录一下cur节点的前一个节点。结点左子树中所含结点的值小于等于当前结点的值。结点右子树中所含结点的值大于等于当前结点的值。是搜索树,那它中序遍历就是有序的。左子树和右子树都是二叉搜索树。

2024-01-31 22:46:30 391

原创 Day20、二叉树part06

要定义一个longlong的全局变量,用来比较遍历的节点是否有序,因为后台测试数据中有int最小值,所以定义为longlong的类型,初始化为longlong最小值。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。如果root->val > val,搜索左子树,如果root->val < val,就搜索右子树,最后如果都没有搜索到,就返回NULL。递归函数的参数传入的就是根节点和要搜索的数值,返回的就是以这个搜索数值所在的节点。

2024-01-29 20:49:08 912

原创 Day18、二叉树part05

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum。给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树。给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。遍历从根节点到叶子节点的路径看看总和是不是目标和。这里视频,方便理解。

2024-01-28 21:53:21 406

原创 Day17、二叉树part04

这道题目要求从根节点到叶子的路径,所以需要前序遍历,这样才方便让父节点指向孩子节点,找到对应的路径。给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。这道题目涉及到回溯,因为我们要把路径记录下来,需要回溯来回退一个路径再进入另一个路径。判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断其左孩子是不是左叶子。给定二叉树的根节点 root ,返回所有左叶子之和。给定一个二叉树,判断它是否是高度平衡的二叉树。

2024-01-28 20:41:58 329

原创 Day16、二叉树part03

二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)而根节点的高度就是二叉树的最大深度,所以本题中我们通过后序求的根节点高度来求的二叉树最大深度。求二叉树的最小深度和求二叉树的最大深度的差别主要在于处理左右孩子不为空的逻辑。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

2024-01-28 20:19:19 278

原创 Day15、二叉树part02

需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。要遍历两棵树而且要比较内侧和外侧节点,所以准确的来说是一个树的遍历顺序是左右中,一个树的遍历顺序是右左中。给你二叉树的根节点 root ,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。给你一个二叉树的根节点 root ,检查它是否轴对称。用深度优先遍历和广度优先遍历。

2024-01-25 21:34:08 347

原创 Day14、二叉树part01

实现代码int val;

2024-01-23 22:51:51 352 1

原创 Day13、栈与队列part03

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。想到的是用队列来存k个值,然后每次移动,取得最大的值,弹出最左侧的值,存入右侧的值。但是这样要维护整个队列,每次还要比较得出最大值。这里使用单调队列,只维护最大的值比较方便。有点难理解,看视频更容易理解。返回 滑动窗口中的最大值。

2024-01-22 22:50:45 342

原创 Day11、栈与队列part02

该算式的逆波兰表达式写法为 ( ( 1 2 + ) (3 4 + ) * )。给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 )。给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。

2024-01-21 12:21:42 356 1

原创 Day10、栈与队列part01

你只能使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size,和is empty 操作是合法的。你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。使用栈来模拟队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈一个输入栈,一个输出栈。push(x) – 将一个元素放入队列的尾部。

2024-01-21 10:49:22 332 1

原创 Day09、字符串part02

"aabaa"的前缀为[a, aa, aab, aaba],后缀为[abaa, baa, aa, a],最长共有元素为[aa],长度为2;拿上面得到的前缀表[0,1,0,1,2,0]为例,next数组(前缀表统一减一后得到)[-1,0,-1,0,1,-1]。"aaba"的前缀为[a, aa, aab],后缀为[aba, ba, a],最长共有元素为[a],长度为1;"aa"的前缀为[a],后缀为[a],最长共有元素为[a],长度为1;那么我们这时就可以得到前缀表为[0,1,0,1,2,0]

2024-01-19 23:06:13 857 1

原创 Day08、字符串part01

给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。对于这题反转字符串,可以想到之前的206.反转链表,也是一样的思路,使用双指针的方法。给你一个字符串 s ,请你反转字符串中 单词 的顺序。

2024-01-17 22:33:55 729

原创 Day07、哈希表part02

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!= k ,同时还满足 nums[i] + nums[j] + nums[k] == 0。依然还是在数组中找到 abc 使得a + b +c =0,我们这里相当于 a = nums[i],b = nums[left],c = nums[right]。接下来如何移动left 和right呢, 如果nums[i] + nums[left] + nums[right] > 0 就说明此时。

2024-01-16 22:22:25 889 1

原创 Day06、哈希表part01

最直接的方法就是遍历数组 nums1,对于其中的每个元素,遍历数组 nums2 判断该元素是否在数组 nums2 中,如果存在,则将该元素添加到返回值。给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。主要要了解哈希表的内部实现原理,哈希函数,哈希碰撞,以及常见哈希表的区别,数组,set 和map。对于什么时候想到用哈希法,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。

2024-01-15 22:33:58 772 1

原创 Day04、链表part02

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。这道题目容易想到的是先遍历一遍链表,得到链表的长度L,然后再进行一遍遍历到第L-n-1个的结点,第L-n个的结点就是删除的结点。给定一个链表的头节点 head ,返回链表开始入环的第一个节点。给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

2024-01-14 19:11:12 762 1

原创 Day03、链表part01

void addAtIndex(int index, int val) 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。所以链表中的节点在内存中不是连续分布的 ,而是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理。给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回新的头节点。改变链表的next的指向,首先定义一个cur指针,指向头结点,再定义一个pre指针,初始化为null。cur = tmp;

2024-01-12 22:59:45 879

原创 Day02、数组part02

给你一个按非递减顺序排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。窗口就是满足其和 ≥ s 的长度最小的连续子数组。在循环过程中保持不变的性质。

2024-01-11 20:16:09 307

原创 Day01、数组part01

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。这道题目的前提是数组为有序数组,同时题目还强调数组中无重复元素,满足如上条件的时候,要想一想是不是可以用二分法了。写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。不同编程语言的内存管理是不一样的。

2024-01-10 22:30:05 876

空空如也

空空如也

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

TA关注的人

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