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

原创 代码随想录day28 | leetcode 56.合并区间 738.单调自增的数字 968.监控二叉树

请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。解法::首先想让strNum[i - 1]减一,strNum[i]赋值9。贪心:找到链接最多的节点。让叶子节点的父节点有摄像头。每个节点的状态:1.有摄像头。节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。题目:给定一个二叉树,我们在树的节点上安装摄像头。整体情况:一个摄像头最大可以覆盖上层与下层。计算监控树的所有节点所需的最小摄像头数量。题目:当且仅当每个相邻位数上的数字。解法:重叠区域类似。

2025-01-12 18:02:18 409

原创 代码随想录day27 | leetcode 452.用最少数量的箭引爆气球 435.无重叠区间 763.划分字母区间

如果当前气球的开始位置不大于前一个气球的结束位置,这意味着两个气球重叠。在这种情况下,不需要额外的箭,但是需要更新当前气球的结束位置为两个重叠气球中较小的结束位置。这样做是为了确保下一轮比较时,如果下一个气球与当前气球重叠,它的结束位置也是最小的。注意:算法的效率很高,因为它只需要对数组进行一次排序(O(n log n)时间复杂度),然后一次遍历(O(n)时间复杂度),所以总的时间复杂度是O(n log n)。解法:先排序,比较第一个区间的右边界与第二个区间的左边界大小,来判断是否重叠。

2025-01-12 17:58:57 423

原创 代码随想录day26 | leetcode 134.加油站 135.分发糖果 860.柠檬水找零 406.根据身高重建队列

如果 ratings[i] > ratings[i + 1],此时candyVec[i](第i个小孩的糖果数量)就有两个选择了,一个是candyVec[i + 1] + 1(从右边这个加1得到的糖果数量),一个是candyVec[i](之前比较右孩子大于左孩子得到的糖果数量)。此时局部最优:只要右边评分比左边大,右边的孩子就多一个糖果,全局最优:相邻的孩子中,评分高的右孩子获得比左边孩子更多的糖果。是要排序的二维整数数组,其中每个元素都是一个整数数组,表示一个人的身高和前面高于或等于其身高的人数。

2025-01-12 17:55:49 749

原创 代码随想录day25 | leetcode 122.买卖股票的最佳时机II 55.跳跃游戏 45.跳跃游戏II 1005.K次取反后最大化的数组和

每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。解法:解题的时候,要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最少步数!题目描述:给你一个非负整数数组 nums ,你最初位于数组的 第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。题目:给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。每次选最小的买入,最大的卖出,之间的波动如何限制。返回 你能获得的最大利润。

2025-01-12 17:47:41 334

原创 代码随想录day24 | 贪心算法理论基础 leetcode 455.分发饼干 376.摆动序列 53. 最大子序和

如序列 [1,3,2,4] 中,1 也是一个「谷」,4 也是一个「峰」。为了尽可能满足最多数量的孩子,从贪心的角度考虑,应该按照孩子的胃口从小到大的顺序依次满足每个孩子,且对于每个孩子,应该选择可以满足这个孩子的胃口且尺寸最小的饼干。误区:如果输入用例都是-1,或者 都是负数,这个贪心算法跑出来的结果是 0, 这是又一次证明脑洞模拟不靠谱的经典案例,实际为最大负数。for循环不利于控制移动,舍弃这种普遍思维,习惯用变量的移动控制,学习数据处理的元素控制,区分识别动态,非动态,目标值,固定值。

2025-01-12 17:43:39 709

原创 代码随想录day24 | leetcode 491.递增子序列 46.全排列 47.全排列 II

题目:给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素。排列中要使用之前的元素,剪枝与去重不同于之前。解法:使用used布尔类型的数组,来记录以取过的数,path中存的数的是未选过的数。题目:给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列。题目:给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。解法:使用used布尔类型的数组,来记录以取过的数,path中存的数的是未选过的数。这是去重逻辑的核心部分。

2025-01-12 17:38:24 268

原创 代码随想录day23 | leetcode 93.复原IP地址 90.子集 90.子集II

在Java中,StringBuilder 类提供了 insert 方法,允许你在字符串的任意位置插入字符或字符串。这道题目和78.子集 (opens new window)区别就是集合里有重复元素了,而且求取的子集要去重。题目:给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的 子集(幂集)。题目:给你一个整数数组 nums ,数组中的元素 互不相同。返回该数组所有可能的子集(幂集)。返回的解集中,子集可以按 任意顺序 排列。特殊符号返回,终止条件3个.,切割子区间怎么找,

2024-12-30 18:03:16 1582

原创 代码随想录day22 | leetcode 39.组合总和 40.组合总和II 131.分割回文串

之后,如果下一层的sum(就是本层的 sum + candidates[i])已经大于target,就可以结束本轮for循环的遍历。没有理解这两个层面上的“使用过” 是造成大家没有彻底理解去重的根本原因。剪枝优化 :其实如果已经知道下一层的sum会大于target,就没有必要进入下一层递归了。都知道组合问题可以抽象为树形结构,那么“使用过”在这个树形结构上是有两个维度的,去重:设置一个数组来映射原数组,当前元素使用过,另新数组对应位置的值为1。强调一下,树层去重的话,需要对数组排序!是同一树枝上使用过,

2024-12-30 17:56:32 421

原创 代码随想录day21 | leetcode 77.组合 77.组合 加剪枝操作 216.组合总和III

举个例子,n = 4,k = 3, 目前已经选取的元素为0(path.size为0),n - (k - 0) + 1 即 4 - ( 3 - 0) + 1 = 2。如果for循环选择的起始位置之后的元素个数 已经不足 我们需要的元素个数了,那么就没有必要搜索了。在集合n中至多要从该起始位置 : n - (k - path.size()) + 1,开始遍历。省去树的分支,剪枝的地方就在递归中每一层的for循环所选择的起始位置。为什么有个+1呢,因为包括起始位置,我们要是一个左闭的集合。变为[1, 2, 3]

2024-12-30 17:53:42 436

原创 回溯与递归

在递归的上下文中,“向上归”是回溯的一种形式,因为它涉及到撤销之前的选择(或状态),并返回到之前的状态以探索其他可能的解决方案路径。总的来说,递归回溯和循环指针滑动在探索所有可能解的算法设计上是相似的,但它们在实现细节和性能特性上有所不同。总的来说,递归中的“向上归”可以看作是一种回溯过程,但通常它的含义比回溯算法中的回溯要窄,因为它更多地关注于函数调用的返回过程,而不是算法上的状态重置和路径探索。递归回溯和循环指针滑动这两种方法在本质上是相似的,因为它们都用于探索所有可能的状态或路径,以找到问题的解。

2024-12-30 17:48:58 782

原创 代码随想录day20 | leetcode 669.修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树

构造二叉树:为了保证平衡,使左区间的节点数与右区间的节点数相同,从中间选取根节点,切割数组使用左闭右闭,递归重复步骤。从树中可以看出累加的顺序是右中左,所以我们需要反中序遍历这个二叉树,然后顺序累加就可以了。排列,请你将其转换为一棵 平衡 二叉搜索树。中序遍历:从小到大。

2024-12-30 17:39:24 362

原创 代码随想录day19 | leetcode 235.二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

因此,当将 val 插入到以 root 为根的子树上时,根据 val 与 root.val 的大小关系,就可以确定要将 val 插入到哪个子树中。此时,p 和 q 要么在当前节点的不同的子树中,要么其中一个就是当前节点。如果当前节点的值大于 p 和 q 的值,说明 p 和 q 应该在当前节点的左子树,因此将当前节点移动到它的左子节点;如果当前节点的值小于 p 和 q 的值,说明 p 和 q 应该在当前节点的右子树,因此将当前节点移动到它的右子节点;我们从根节点开始遍历;

2024-12-20 09:52:46 229

原创 代码随想录day17 | leetcode 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236.二叉树的最近公共祖先

如果 频率count 等于 maxCount(最大频率),当然要把这个元素加入到结果集中(以下代码为result数组),频率count 大于 maxCount的时候,不仅要更新maxCount,而且要清空结果集(以下代码为result数组),因为结果集之前的元素都失效了。先遍历一遍数组,找出最大频率(maxCount),然后再重新遍历一遍数组把出现频率为maxCount的元素放进集合。(因为众数有多个)。遇到在二叉搜索树上求什么最值啊,差值之类的,就把它想成在一个有序数组上求最值,求差值,这样就简单多了。

2024-12-17 16:48:29 430

原创 代码随想录day16 | leetcode 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

创建一个函数,该函数接受两个二叉树的根节点作为参数。

2024-12-17 16:43:26 220

原创 代码随想录day15 | leetcode 513.找树左下角的值 112.路径总和 106.从中序与后序遍历序列构造二叉树

中序数组我们都切成了左中序数组和右中序数组了,那么后序数组就可以按照左中序数组的大小来切割,切成左后序数组和右后序数组。此时应该注意确定切割的标准,是左闭右开,还有左开右闭,还是左闭右闭,这个就是不变量,要在递归中保持这个不变量。第四步:切割中序数组,切成中序左数组和中序右数组 (顺序别搞反了,一定是先切中序数组): 后序数组的最后一个元素为切割点,先切中序数组,根据中序数组,反过来再切后序数组。第二步:如果不为空,那么取后序数组最后一个元素作为节点元素。第五步:切割后序数组,切成后序左数组和后序右数组。

2024-12-14 08:56:11 379

原创 代码随想录day14 | leetcode 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和 222.完全二叉树的节点个数

一个节点的深度是从根节点到该节点所经过的边的数量。

2024-12-14 08:19:57 333

原创 代码随想录day13 | leetcode 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度

具体而言,在计算当前 N 叉树的最大深度时,可以先递归计算出其每个子树的最大深度,然后在 O(1) 的时间内计算出当前 N 叉树的最大深度。对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,理解这一点就知道了其实我们要比较的是两个树(这两个树是根节点的左右子树),所以在递归遍历的过程中,也是要同时遍历两棵树。二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)题目:二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

2024-12-10 19:16:55 294

原创 代码随想录day12 | 二叉树理论基础 leetcode144.二叉树的前序遍历 145.二叉树的后序遍历 94.二叉树的中序遍历 102.二叉树的层序遍历

因为前序遍历的顺序是中左右,先访问的元素是中间节点,要处理的元素也是中间节点,所以刚刚才能写出相对简洁的代码,因为要访问的元素和要处理的元素顺序是一致的,都是中间节点。那么再看看中序遍历,中序遍历是左中右,先访问的是二叉树顶部的节点,然后一层一层向下访问,直到到达树左面的最底部,再开始处理节点(也就是在把节点的数值放进result数组中),这就造成了处理顺序和访问顺序是不一致的。而广度优先遍历的实现一般使用队列来实现,这也是队列先进先出的特点所决定的,因为需要先进先出的结构,才能一层一层的来遍历二叉树。

2024-12-10 18:51:51 1537

原创 代码随想录day11 | leetcode150. 逆波兰表达式求值 239. 滑动窗口最大值 347.前 K 个高频元素

实现逆波兰式的算法,难度并不大,但为什么要将看似简单的中缀表达式转换为复杂的逆波兰式?与普通队列不同的是,优先队列中的元素按照其自然顺序(或指定的比较器顺序)排序,因此每次访问时,队列中“优先级最高”的元素会被优先处理。每次窗口移动的时候,调用que.pop(滑动窗口中移除元素的数值),que.push(滑动窗口添加元素的数值),然后que.front()就返回我们要的最大值。在这道题中我们要用小顶堆,因为要统计最大前k个元素,只有小顶堆每次将最小的元素弹出,最后小顶堆里积累的才是前k个最大元素。

2024-12-08 20:24:22 722

原创 代码随想录day9 | leetcode151.翻转字符串里的单词 卡码网:55.右旋转字符串 KMP算法

在C语言中,可以实现空间复杂度为O(1)的方法。Java中不能,因为不能在原地修改字符串。去除空格:1.可以全部删除,再在单词间添加。2. 使用双指针,从两端向里移动,先去除两边空格,让left移动,在删除单词间的多余空格。, 是在(新的字符串)tt中以有了,当left又扫到空格时,就不满足 实现了单词间只有一个空格。1.使用三个方法,分别为:多余空格的删除,对字符串整体的翻转,对单词的翻转。2.快慢指针移除空格方法2比方法1的执行用时分布更少。System.arraycopy 是Java中的一

2024-12-07 20:51:04 649

原创 代码随想录day10 | 栈与队列理论基础 leetcode 232.用栈实现队列 225. 用队列实现栈 20. 有效的括号 1047. 删除字符串中的所有相邻重复项

Deque 是 Java 集合框架中的 双端队列,全称为 Double-Ended Queue。它是一种允许在两端(头部和尾部)插入和删除元素的数据结构,支持 FIFO(先进先出)和 LIFO(后进先出)的操作模式。

2024-12-06 22:10:24 630

原创 代码随想录day8 | leetcode344.反转字符串 541. 反转字符串II 卡码网:54.替换数字

题目:给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。这个方法可以高效地在源数组中复制一个连续的元素序列到目标数组中,同时可以选择复制的起始位置和目标数组的起始位置。位运算通常比普通的算术运算更快,因为它们直接在数字的底层表示上操作,不需要进行类型转换或复杂的算术计算。在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。在复杂的情景下,如何灵活处理边界问题。

2024-12-04 17:50:29 739

原创 代码随想录day7 | leetcode454.四数相加II 383. 赎金信 5. 三数之和 18. 四数之和 总结

剪枝操作就是在搜索过程中通过预判某些路径不可能得到有效解,从而提前终止这些路径的搜索。

2024-12-03 23:28:08 1906

原创 代码随想录day6 | 哈希表理论基础 leetcode242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

此外,如果 s 和 t 的长度不同,t 必然不是 s 的异位词。解题思想:map目的用来存放我们访问过的元素,因为遍历数组的时候,需要记录我们之前遍历过哪些元素和对应的下标,这样才能找到与当前元素相匹配的(也就是相加等于target)。快乐数的定义指出,如果对一个数重复进行“将每个数字替换为每个数字的平方和”的操作,最终结果要么是 1(这是一个快乐数),要么是进入。在随后的迭代中,如果再次遇到一个已经在 record 集合中的数,这意味着我们已经回到了之前某个步骤的数,即进入了循环。

2024-12-02 21:43:28 741

原创 代码随想录day04:链表 | 24. 两两交换链表中的节点、19. 删除链表的倒数第 N 个结点、面试题 02.07. 链表相交、142. 环形链表 I 链表总结

假设有两个链表 A 和 B,如果它们在某个节点 C 开始相交,那么从节点 C 到两个链表的末尾,它们共享相同的节点。这意味着,如果链表 A 的长度为 m,链表 B 的长度为 n,相交节点 C 到链表末尾的长度为 k,那么链表 A 和 B 的相交部分长度为 k。

2024-12-02 18:32:38 865

原创 代码随想录day03:链表 | 203.移除链表元素、707.设计链表、206.反转链表

数组是在内存中是连续分布的,但是链表在内存中可不是连续分布的。链表是通过指针域的指针链接在内存中各个节点。所以链表中的节点在内存中不是连续分布的 ,而是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理。数组在定义的时候,长度就是固定的,如果想改动数组的长度,就需要重新定义一个新的数组。链表的长度可以是不固定的,并且可以动态增删, 适合数据量不固定,频繁增删,较少查询的场景。

2024-12-01 19:25:38 293

原创 代码随想录day2 | leetcode209.长度最小的子数组 | 59.螺旋矩阵II | 区间和|数组总结

数组是存放在连续内存空间上的相同类型数据的集合。需要两点注意的是数组下标都是从0开始的。数组内存空间的地址是连续的正是因为数组在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。

2024-11-29 01:35:06 389

原创 代码随想录day1| leetcode704. 二分查找,35.搜索插入位置 ,27. 移除元素,977.有序数组的平方

数组理论原理数组中的元素是连续的,不能直接删除。数组中的元素长度的方法时间复杂度为O(n)。数组长度改变时,数组所申请的空间并未改变。####二分查找情况 1.左闭右开情况2.左闭右闭。

2024-11-27 23:12:02 191 1

空空如也

空空如也

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

TA关注的人

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