
C/C++
文章平均质量分 78
Vitalia
Rebuild the world with 0s and 1s.
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
⭐算法OJ⭐并查集的应用/DFS/BFS:岛屿数量问题 Number of Islands
给定一个由 '1'(陆地)和 '0'(水)组成的二维网格,计算岛屿的数量。岛屿被水包围,并且通过水平或垂直方向上相邻的陆地连接形成。原创 2025-04-19 04:54:23 · 447 阅读 · 0 评论 -
⭐算法OJ⭐数据流的中位数【最小堆】Find Median from Data Stream
最小堆是一种特殊的完全二叉树数据结构,它满足以下性质:堆性质:每个节点的值都小于或等于其子节点的值(根节点是最小值);完全二叉树性质:除了最底层外,其他层的节点都是满的,且最底层的节点都靠左排列。原创 2025-04-08 23:49:20 · 598 阅读 · 0 评论 -
⭐算法OJ⭐滑动窗口最大值【双端队列(deque)】Sliding Window Maximum
双端队列(deque,全称double-ended queue)是C++标准模板库(STL)中的一个容器适配器,它允许在队列的两端高效地进行插入和删除操作。滑动窗口最大值是一个经典的算法问题,我们需要找到数组中每个大小为k的滑动窗口中的最大值。我们可以使用双端队列(deque)来高效解决这个问题。主要思路是维护一个双端队列,队列中存储的是数组元素的索引,且队列中的元素按照从大到小的顺序排列。这样可以保证队列前端始终是当前窗口的最大值。原创 2025-04-07 23:37:42 · 468 阅读 · 0 评论 -
哈密尔顿路径(Hamiltonian Path)及相关算法题目
哈密尔顿路径(Hamiltonian Path)是指在一个图中经过每个顶点恰好一次的路径。哈密尔顿路径(Hamiltonian Path)问题是一个经典的 NP-Complete 问题,意味着目前没有已知的多项式时间解法(除非 P=NP)。但在实际应用中,我们可以采用以下几种方法进行求解:回溯法(Backtracking):尝试所有可能的路径,遇到无效路径时回溯;动态规划(DP + 状态压缩):用二进制位掩码表示已访问的顶点集合,DP存储状态。原创 2025-04-04 23:39:38 · 981 阅读 · 0 评论 -
⭐算法OJ⭐寻找最短超串【动态规划 + 状态压缩】(C++ 实现)Find the Shortest Superstring
这个问题要求找到一个最短的字符串,使得给定的所有字符串都是它的子串。我们可以将其转化为旅行商问题(TSP)的变种:将每个字符串视为一个城市,字符串间的重叠部分视为路径权重。通过动态规划,我们记录使用不同字符串组合(状态压缩)时的最优解,逐步构建包含更多字符串的超级字符串,最终回溯得到最短结果。该解法利用状态压缩DP高效处理这个NP难问题,时间复杂度为O(n²·2ⁿ),适用于较小规模的输入(n≤20)。原创 2025-04-04 23:28:09 · 951 阅读 · 0 评论 -
⭐算法OJ⭐重建行程【哈密尔顿路径】(C++ 实现)Reconstruct Itinerary
重建行程问题要求从"JFK"出发,按字典序最小顺序使用所有机票。核心解法是采用Hierholzer算法寻找欧拉路径:建图:用优先队列(最小堆)构建邻接表,确保每次取字典序最小的目的地;DFS遍历:从JFK出发深度优先搜索,递归访问邻接节点;后序处理:当节点无出边时加入结果,最后反转结果列表。关键点:优先队列保证字典序、后序处理确保路径完整、反转得到正确顺序。算法时间复杂度O(ElogE),空间复杂度O(E),能高效找到最优解。原创 2025-04-04 10:46:19 · 861 阅读 · 0 评论 -
⭐算法OJ⭐ 戳气球【动态规划】Burst Balloons
戳气球问题要求通过最优顺序戳破气球以获得最大硬币数量,关键在于逆向思维——最后戳破的气球会将问题分解为独立的子问题。采用动态规划中的区间DP方法,定义 dp[i][j] 为戳破开区间 (i,j) 内气球的最大收益,并通过首尾添加虚拟气球简化边界处理。通过三重循环递推计算不同区间的最大值,最终在 O(n³) 时间内解决问题,典型地体现了动态规划对重叠子问题和最优子结构的高效处理。原创 2025-03-31 00:27:40 · 362 阅读 · 0 评论 -
⭐算法OJ⭐俄罗斯套娃信封问题【排序 + LIS】Russian Doll Envelopes
本题通过排序 + LIS的经典组合,将二维问题转化为一维问题。按宽度升序、高度降序排序,避免同一宽度的信封被重复选择。使用贪心 + 二分优化 LIS,将时间复杂度从 O(N^2 ) 降为 O(NlogN)。原创 2025-03-30 11:52:21 · 786 阅读 · 0 评论 -
⭐算法OJ⭐并查集的应用/DFS/BFS:省份数量问题 Number of Provinces
并查集(Union-Find)是一种树型的数据结构,用于处理一些不交集合(Disjoint Sets)的合并及查询问题。在省份数量问题中:每个城市最初属于自己独立的省份(即自己是自己的父节点);当两个城市相连时,我们合并它们所在的省份;最终,剩余的独立集合数量就是省份的总数。原创 2025-03-29 05:13:25 · 920 阅读 · 0 评论 -
⭐算法OJ⭐连接所有点的最小费用【最小生成树】(C++实现)Min Cost to Connect All Points
给定一组二维平面上的点,其中 points[i] = [xi, yi]。连接两点 [xi, yi] 和 [xj, yj] 的费用是它们之间的曼哈顿距离:|xi - xj| + |yi - yj|。返回连接所有点所需的最小总费用。所有点都应该被连接,并且任意两点之间有且只有一条路径。这是一个典型的最小生成树(MST)问题,可以使用 Kruskal算法 或 Prim算法 解决。原创 2025-03-25 23:47:08 · 870 阅读 · 0 评论 -
⭐算法OJ⭐二叉树的直径【树】(C++实现)Binary Tree Paths
给定一棵二叉树的根节点 root,返回这棵树的直径长度。二叉树的直径是指树中任意两个节点间最长路径的长度。这个路径可能穿过也可能不穿过根节点。两个节点之间的路径长度由它们之间的边数表示。我们可以使用深度优先搜索(DFS)来递归地计算每个节点的左右子树的最大深度,并在过程中更新最大直径。直径的长度可以看作是左子树的深度加上右子树的深度(即穿过当前节点的最长路径)。原创 2025-03-25 11:45:44 · 782 阅读 · 0 评论 -
⭐算法OJ⭐二叉树的坡度【树的遍历】(C++实现)Binary Tree Tilt
二叉树的坡度(Tilt)问题本身是一个经典的算法练习题,主要用于帮助理解二叉树的递归遍历和节点值的计算。原创 2025-03-24 11:27:32 · 428 阅读 · 0 评论 -
⭐算法OJ⭐二叉树摄像头【树的遍历+动态规划】(C++实现)Binary Tree Cameras
给定一棵二叉树的根节点,需要在树的节点上安装摄像头。每个摄像头可以监控其父节点、自身以及其直接子节点。要求返回监控整棵树所需的最小摄像头数量。这个问题可以通过贪心算法和动态规划来解决。我们需要遍历树,并为每个节点决定是否安装摄像头。为了最小化摄像头的数量,采用自底向上的策略,从叶子节点开始向上处理。原创 2025-03-23 09:00:00 · 996 阅读 · 0 评论 -
⭐算法OJ⭐判断二叉搜索树【树的遍历】(C++实现)Validate Binary Search Tree
二叉搜索树(BST)有一个非常重要的性质:中序遍历的结果是一个严格递增的序列。如果对一棵二叉搜索树进行中序遍历(Inorder Traversal),得到的节点值的序列一定是从小到大严格递增的。要判断一棵二叉树是否是有效的二叉搜索树(BST),可以利用 BST 的这个性质。原创 2025-03-22 02:02:59 · 648 阅读 · 0 评论 -
二叉树的三种遍历【树的遍历】(C++实现)Binary Tree Traversal
前序遍历:根节点最先访问,适合复制树或生成前缀表达式;中序遍历:根节点在中间访问,适合获取有序数据(如二叉搜索树);后序遍历:根节点最后访问,适合删除树或生成后缀表达式。原创 2025-03-21 12:29:23 · 1453 阅读 · 0 评论 -
⭐算法OJ⭐二叉树的后序遍历【树的遍历】(C++实现)Binary Tree Postorder Traversal
要实现对二叉树的后序遍历(Postorder Traversal),我们可以使用递归或迭代的方法。后序遍历的顺序是:左子树 -> 右子树 -> 根节点。原创 2025-03-20 23:46:41 · 1131 阅读 · 0 评论 -
⭐算法OJ⭐二叉树的前序遍历【树的遍历】(C++实现)Binary Tree Preorder Traversal
要实现二叉树的前序遍历(Preorder Traversal),我们可以使用递归或迭代的方法。前序遍历的顺序是:根节点 -> 左子树 -> 右子树。原创 2025-03-20 11:07:05 · 553 阅读 · 0 评论 -
⭐算法OJ⭐二叉树的中序遍历【树的遍历】(C++实现)Binary Tree Inorder Traversal
树是一种非常简洁的图结构,具有许多有趣的性质和应用。本文介绍二叉树的中序遍历。中序遍历的顺序是:左子树 -> 根节点 -> 右子树。两种实现分别是递归解法,和迭代解法,即使用栈模拟递归过程。原创 2025-03-19 23:49:14 · 875 阅读 · 0 评论 -
⭐算法OJ⭐是否是二分图【BFS】(C++实现)Is Graph Bipartite?
要判断一个无向图是否是二分图(Bipartite),我们可以使用图的着色方法。具体思路是:尝试用两种颜色(例如 0 和 1)对图中的节点进行着色,确保相邻节点颜色不同。如果能够成功完成着色,则图是二分图;否则,不是二分图。原创 2025-03-17 23:54:38 · 906 阅读 · 0 评论 -
⭐算法OJ⭐克隆图【BFS】(C++实现)Clone Graph
要克隆一个无向连通图,我们可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来遍历图,并在遍历过程中创建每个节点的副本。为了确保每个节点只被复制一次,我们可以使用一个哈希表(或字典)来存储已经复制过的节点。此文给出使用C++实现的BFS方法。原创 2025-03-17 23:41:49 · 990 阅读 · 0 评论 -
⭐算法OJ⭐两数之和【哈希表】(C++ 实现)Two Sum
“两数之和”(Two Sum)是一道非常经典的算法题目,几乎是算法入门和面试准备的必做题之一。这道题目是许多初学者接触哈希表(Hash Table)或字典(Dictionary)的第一个应用场景。它帮助初学者理解如何通过空间换时间,将时间复杂度从暴力解法的 O(n²) 优化到 O(n)。原创 2025-03-16 12:10:35 · 1045 阅读 · 0 评论 -
⭐算法OJ⭐汉明距离【位操作】(C++ 实现)Total Hamming Distance
Hamming Distance(汉明距离)是用于衡量两个等长字符串在相同位置上不同字符的个数的度量。它通常用于比较两个二进制字符串或编码序列的差异。原创 2025-03-14 11:07:59 · 913 阅读 · 0 评论 -
⭐算法OJ⭐汉明距离【位操作】(C++ 实现)Hamming Distance
Hamming Distance(汉明距离)是用于衡量两个等长字符串在相同位置上不同字符的个数的度量。它通常用于比较两个二进制字符串或编码序列的差异。原创 2025-03-13 23:43:03 · 1071 阅读 · 0 评论 -
⭐算法OJ⭐因数游戏【动态规划】Divisor Game
Alice 和 Bob 在玩一个游戏,Alice 先手。初始时,黑板上有一个数字 n。每轮玩家需要执行以下操作:选择一个满足 0 < x < n 且 n % x == 0 的数字 x。将黑板上的数字 n 替换为 n - x。如果玩家无法执行操作(即没有满足条件的 x),则该玩家输掉游戏。假设 Alice 和 Bob 都采取最优策略,判断 Alice 是否能赢得游戏。如果 Alice 能赢,返回 true;否则返回 false。原创 2025-03-13 00:39:36 · 847 阅读 · 0 评论 -
⭐算法OJ⭐判断链表是否有环【快慢指针】(C++实现)Linked List Cycle II
通过快慢指针法,我们可以高效地判断链表是否有环,并找到环的起始节点。这种方法不仅代码简洁,而且性能优秀,适合处理大规模数据。掌握快慢指针的思想对于解决类似的链表问题非常有帮助。原创 2025-03-12 09:15:00 · 519 阅读 · 0 评论 -
⭐算法OJ⭐找到链表的中间节点【快慢指针】(C++实现)Middle of the Linked List
通过快慢指针法,我们可以高效地找到链表的中间节点。这种方法不仅代码简洁,而且性能优秀,适合处理大规模数据。掌握快慢指针的思想对于解决类似的链表问题非常有帮助。原创 2025-03-11 22:55:48 · 863 阅读 · 0 评论 -
⭐算法OJ⭐判断链表是否有环【快慢指针】(C++实现)Linked List Cycle
通过快慢指针法,我们可以高效地判断链表是否有环。这种方法不仅代码简洁,而且性能优秀,适合处理大规模数据。掌握快慢指针的思想对于解决类似的链表问题非常有帮助。原创 2025-03-12 09:00:00 · 886 阅读 · 0 评论 -
⭐算法OJ⭐链表排序【归并排序】(C++/JavaScript 实现)
通过归并排序,我们可以高效地对链表进行排序。这种方法不仅时间复杂度低,而且空间复杂度也较为优秀,适合处理大规模数据。掌握链表的分割和合并技巧对于解决类似的链表问题非常有帮助。原创 2025-03-11 22:57:33 · 753 阅读 · 0 评论 -
⭐算法OJ⭐荷兰国旗问题【三指针法】(C++实现)
荷兰国旗问题的核心是如何高效地将一个包含三种元素的数组进行分区排序。这个问题在排序算法设计中具有重要意义,尤其是对于需要处理大量重复元素的排序算法(如快速排序的变种)。原创 2025-03-11 08:31:56 · 430 阅读 · 0 评论 -
⭐算法OJ⭐全排列【回溯】(C++实现)Permutations II
通过回溯算法解决了全排列问题,使用递归和交换,生成所有可能的排列。原创 2025-03-07 09:15:00 · 227 阅读 · 0 评论 -
⭐算法OJ⭐全排列【回溯】(C++实现)Permutations
通过回溯算法解决了全排列问题,使用递归和交换,生成所有可能的排列。原创 2025-03-07 08:00:00 · 426 阅读 · 0 评论 -
⭐算法OJ⭐N-皇后问题 II【回溯剪枝】(C++实现)N-Queens II
通过回溯算法解决了 N-皇后问题,能够找到所有可能的解的个数。代码中使用了递归和剪枝技术,确保高效地搜索所有可能的棋盘配置。原创 2025-03-07 01:01:14 · 632 阅读 · 0 评论 -
⭐算法OJ⭐N-皇后问题【回溯剪枝】(C++实现)N-Queens
通过回溯算法解决了 N-皇后问题,能够找到所有可能的解。代码中使用了递归和剪枝技术,确保高效地搜索所有可能的棋盘配置。原创 2025-03-07 00:31:49 · 1267 阅读 · 0 评论 -
题目 3218 ⭐零食采购⭐【数理基础】蓝桥杯2024年第十五届省赛
小蓝的星际零食采购问题,利用树的性质和 LCA 快速确定路径,结合集合统计不同零食种类。适用于树结构中的路径查询问题,尤其是需要统计路径上不同属性的场景。原创 2025-03-06 11:59:49 · 864 阅读 · 0 评论 -
题目 3220 ⭐因数计数⭐【数理基础】蓝桥杯2024年第十五届省赛
考察数理统计知识,找到所有满足条件的有序四元组 (i, j, k, l)。原创 2025-03-06 00:56:24 · 1033 阅读 · 0 评论 -
⭐算法OJ⭐最佳买卖股票时机(含“冷却期”或“交易费”)【动态规划 + 滚动窗口】(C++实现)Best Time to Buy and Sell Stock 系列
这一篇给大家分享两篇股票买卖系列的扩展题目,难度不太大,如果对这类问题不是很熟悉可以参考[⭐算法OJ⭐最佳买卖股票时机【贪心算法 + 动态规划】(C++实现)Best Time to Buy and Sell Stock 系列 I,II,III,IV]。我们分别提供了两种解法,一种是常规的动态规划,另一种是利用滚动窗口实现的O(1)空间复杂度的优化。原创 2025-03-06 00:40:51 · 1262 阅读 · 0 评论 -
⭐算法OJ⭐跳跃游戏【动态规划】(C++实现)Jump Game 系列 V
跳跃游戏V是一个典型的动态规划问题。我们需要找到从任意索引开始跳跃,最多可以访问的索引数量。原创 2025-03-05 12:14:29 · 807 阅读 · 0 评论 -
⭐算法OJ⭐跳跃游戏【动态规划 + 单调队列】(C++实现)Jump Game 系列 VI
这是一个典型的动态规划问题。我们需要找到从索引 0 到索引 n - 1 的最大得分路径。对于每个索引 i,我们需要检查从 [i - k, i - 1] 范围内的所有可能的前一个位置 j,并选择使得 dp[j] + nums[i] 最大的值。可以使用单调队列(Monotonic Queue)优化,将时间复杂度降低到 O(n)。原创 2025-03-05 11:55:38 · 885 阅读 · 0 评论 -
题目 3217 ⭐成绩统计⭐【滑动窗口 + 二分搜索】蓝桥杯2024年第十五届省赛
通过排序和滑动窗口,可以高效地检查是否存在满足条件的子集。二分搜索用于快速找到最小的 x。原创 2025-03-05 08:23:57 · 813 阅读 · 0 评论 -
题目 3216 ⭐团建⭐【DFS】蓝桥杯2024年第十五届省赛
通过 DFS 遍历生成路径,结合 LCP 计算,可以高效地解决这个问题。代码实现清晰,逻辑简单,适用于树结构的问题。该方法的复杂度在合理范围内,能够处理中等规模的输入。原创 2025-03-04 23:58:52 · 1124 阅读 · 0 评论