- 博客(47)
- 收藏
- 关注
原创 45 找到字符串中所有字母异位词
滑动窗口+字符串计数countPpcountSp.size()scountP遍历字符串 s 一次,窗口中的字符频率更新需要O1。总时间复杂度为On,其中 n 是字符串 s 的长度。使用了两个固定大小的数组countP和countS(长度 26),所以空间复杂度为O1。
2024-12-16 10:19:00
526
原创 44 无重复字符的最长字串
44 无重复字符的最长字串44.1 无重复字符的最长字串解决方案解决思路:核心思想:滑动窗口,使用滑动窗口的方法来维护当前无重复字符的字串,遍历字符串的过程中动态调整窗口的左右边界。滑动窗口:定义窗口的左右边界left和right。当right向右移动时,记录字符是否重复。如果出现重复字符,移动left,直到窗口中不再有重复字符。借助哈希表记录字符索引:使用一个哈希表记录当前窗口中字符的最新索引。当遇到重复字符时,更新左边界到重复字符的下一位。更新结果:每次调整窗口厚
2024-12-15 16:18:25
332
原创 39 矩阵置零
解题思路:代码解释:时间复杂度和空间复杂度:假设有以下矩阵:初始化标记:rowZero = false (假设第一行不需要置零)colZero = false (假设第一行不需要置零)检查第一行和第一列是否包含零使用第一行和第一列标记需要置零的行和列矩阵如下:遍历:值是0,因此我们将和都置为,表示第二行和第二列需要置零。此时矩阵变为:遍历 (1,2):值是 6,不需要做任何操作。遍历 (2,1):值是 7,不需要做任何操作。遍历 (2,2):值是 8,不需要做任何操作。矩阵变为
2024-12-08 11:46:40
927
原创 38 岛屿数量
解题思路:解释:时间复杂度:假设有如下的网格(‘1’ 表示陆地,‘0’ 表示水):遍历网络:从网络的左上角开始,逐个检查每个位置。如果当前位置是,说明我们找到一个岛屿的一部分。接着,我们用深度优先搜索(DFS)来标记与之前相连的所有。找到第一个岛屿:初始时,我们遍历到,它是,所以我们发现了一个岛屿的一部分。此时,我们将岛屿计数器加1,变为1。然后,启动DFS,从开始,标记所有相连的,把他们变成,表示已经访问过。DFS会从四个方向(上、下、左、右)扩展。从开始,我们将其改为,然后继续检查:
2024-12-07 11:25:16
1035
原创 37 二叉树的最近公共祖先
使用来解决问题。:在递归中,根节点为NULL或匹配到p或q时返回当前节点。:通过反别递归左右子树,合并结果来找到最低公共祖先。
2024-12-06 09:55:55
333
原创 34 路径总和3
这个函数从当前节点开始,递归地检查所有从该节点开始的路径,看看路径和是否等于 remainingSum(即剩余的目标和)。:这个函数从每个节点开始,递归地调用dfs检查从该节点出发的所有路径和是否为目标值。并且递归地调用左右子树的。我们需要找出所有路径和为8的路径。路径可以从任何一个节点开始,且必须是连续的(不能跳跃)。假设目标和targetSum = 8,从根节点开始。
2024-12-03 09:26:18
828
原创 33 搜索插入位置
33 搜索插入位置33.1 搜索插入位置解决方案class Solution {public: int searchInsert(vector<int>& nums, int target) { int left = 0,right = nums.size() -1; // 执行二分查找 while(left <= right){ int mid = left+ (right - left)
2024-12-02 09:20:37
249
原创 32 从前序与中序遍历序列构造二叉树
首先访问根节点,然后访问左子树,再访问右子树。:首先访问左子树,然后访问根节点,最后访问右子树。OnOn2O1On。
2024-12-01 10:31:26
853
原创 29 二叉搜索树中第K小的元素
代码核心思想:二叉搜索树 (BST) 的中序遍历是递增顺序的节点值序列,因此第 k 小的元素可以通过中序遍历找到。当我们遍历到第 k 个节点时,它即是答案。二叉搜索树 (BST) 的特性代码解释:示例输入:对应的树结构为:步骤解析:输出结果:3总结:
2024-11-26 10:31:58
844
原创 23 环形链表2
23.2 举例说明假设链表如下:链表节点值为 [3, 2, 0, -4]。环的起点是值为 2 的节点(第 2 个节点,pos = 1)。运行过程:快慢指针移动:让快指针移动两步,慢指针移动一步。第一步:第二步:第三步:第四步:快慢指针在值为 2 的节点相遇,说明链表中有环。确定环的起点:相遇后,重新调整慢指针 slow 的位置,将其移回链表头(值为 3),而快指针 fast 留在相遇点(值为 2)。同时移动快慢指针第二步:此时,快慢指针再次相遇
2024-11-19 10:30:47
398
原创 22 缺失的第一个正数
解题思路:实现步骤:具体过程:条件 确保只考虑 1 到 n 范围内的正整数,忽略负数和超出范围的数。将 放到正确的位置。第二步:找到第一个不匹配的位置如果某个位置 i 满足 nums[i] != i + 1,说明 i + 1 是缺失的最小正整数。第三步:返回结果如果所有位置都满足 ,则说明数组中包含所有 的正整数,因此返回 。22.2 举例说明将每个正整数放到“正确的位置”初始状态将值为 k 的元素放到下标 k-1 的位置上。交换的条件是:nums[i]
2024-11-18 09:44:47
813
原创 19 接雨水
这个算法使用了两个指针和动态更新左右两侧的最大高度,用来高效地计算可以接住的水量。这种双指针方法的优点是时间复杂度为 (O(n)),并且只需要常量级的额外空间,非常适合这种问题。
2024-11-15 09:40:38
659
原创 18 三数之和
代码解释:复杂度分析:使用示例首先,我们对数组进行排序,得到。排序的目的是为了方便后续的双指针操作,并且可以帮助我们避免重复的三元组。遍历数组并固定第一个元素我们使用循环来遍历数组,每次固定一个元素作为三元组中的第一个元素,然后在其右侧寻找另外两个元素,使得这三个数的和为0。第一步:第二步:第三步:第四步:第二次循环()第一步:第二步:第三次循环()第四次循环()第一步:最终,我们找到的所有满足条件的三元组为。代码执行过程小结这个方法高效地解决了“三数之和”问题,通过排序和双指针优化避免了重复计算和重复三
2024-11-14 09:54:07
1014
原创 17 盛最多水的容器
因为这样做有可能找到一个更大的面积。而移动较长的一边不会增加面积,因为新的宽度会减少,而高度不会增加。最终,我们得到了最大面积 49,这也是在给定数组中容积最大的容器。通过这个例子我们看到,双指针法的核心是。
2024-11-13 09:55:12
413
原创 15 哈希表的基本原理及使用
哈希表(Hash Table)是一种通过“”来存储数据的数据结构。它背后的核心思想是利用“”将键映射到一个特定的位置,从而实现快速存储和查找。
2024-11-11 09:59:25
449
原创 13 字母异位词分组
将字母异位词按照字母排序后得到一个唯一的“标准形式”,并将所有拥有相同“标准形式”的单词分到同一个组中。:该算法的时间复杂度为ON×KlogK,其中 N 是单词数量,K 是单词的平均长度。:额外的空间复杂度取决于输入数据,因为 anagramMap 和 result 都需要额外的存储空间。
2024-11-10 11:53:41
746
原创 12 最大子数组和
假设输入数组是 nums = [-2,1,-3,4,-1,2,1,-5,4]。遍历完数组后,max_sum 为 6,即最大子数组和为 6。
2024-11-09 11:04:01
845
原创 11 将有序数组转换为二叉搜索树
代码解释:helper 函数:复杂度分析:数组 nums = [-10, -3, 0, 5, 9] 来详细解释这个算法的运行过程。运行过程:nums = [-10, -3, 0, 5, 9]数组长度为 5,所以 mid = 2(即索引 2 的位置)。中间元素为 0,我们创建根节点 TreeNode(0)。现在 0 是整棵树的根节点,接下来我们要分别处理 0 左边和右边的元素来构建左子树和右子树。子数组 [-10, -3](即索引 0 到 1)。数组长度为 2,mid = 0 + (
2024-11-08 09:26:33
856
原创 10 二叉树的直径
代码解释:假设我们有以下二叉树:解题思路:过程解析:最终结果:最大直径为 3,对应的路径是从节点 4 -> 2 -> 1 -> 3 或 5 -> 2 -> 1 -> 3,都有 3 条边。总结:
2024-11-07 10:03:10
943
原创 07 二叉树的最大深度
代码说明:假设我们有下面这棵二叉树:创建二叉树:首先,我们创建这棵树的节点,并按照结构相互连接:计算最大深度:开始于根节点(值为3):计算左子树(值为9)的深度:计算右子树(值为20)的深度:合并结果并计算根节点的深度:
2024-11-05 19:53:35
379
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人