
C/C++算法
文章平均质量分 86
C/C++算法讲解,精进算法
攻城狮7号
(广交天下好友)个人主要从事多年c/c++研发,同时熟悉其他开发语言,涉猎跨平台客户端和底层开发,以及前后端开发
展开
-
【11.10】数学思维-解至少有 1 位重复的数字
给定正整数n,返回在[1, n]范围内具有重复数字的正整数的个数。n = 201具有至少 1 位重复数字的正数(<= 20)只有 11。n = 10010具有至少 1 位重复数字的正数(<= 100)有 11,22,33,44,55,66,77,88,99 和 100。原创 2025-02-24 14:59:36 · 296 阅读 · 0 评论 -
【11.9】数学思维-解安装栅栏
本文通过Jarvis 算法Graham 算法和Andrew 算法三种方式解决了题目中的凸包问题,并给出了详细的解题思路、数学原理和 C++ 实现代码。每种算法都有其独特的优势和适用场景:Jarvis 算法:简单直观,适合点集规模较小的情况。Graham 算法:高效稳定,适合点集规模较大的情况。Andrew 算法:通过单调栈操作,适合需要分上下凸壳的情况。通过深入理解这些算法的数学原理,我们可以更好地解决凸包问题。原创 2025-02-22 18:12:01 · 858 阅读 · 0 评论 -
【11.8】数学思维-解灯泡开关
初始时有n个灯泡处于关闭状态。第一轮,你将会打开所有灯泡。接下来的第二轮,你将会每两个灯泡关闭第二个。第三轮,你每三个灯泡就切换第三个灯泡的开关(即,打开变关闭,关闭变打开)。第i轮,你每i个灯泡就切换第i个灯泡的开关。直到第n轮,你只需要切换最后一个灯泡的开关。找出并返回n轮后有多少个亮着的灯泡。n =31初始时, 灯泡状态第一轮后, 灯泡状态第二轮后, 灯泡状态第三轮后, 灯泡状态你应该返回 1,因为只有一个灯泡还亮着。原创 2025-02-20 17:07:21 · 250 阅读 · 0 评论 -
【11.7】数学思维-解最小好进制
以字符串的形式给出n, 以字符串的形式返回n的最小。如果n的k(k>=2)进制数的所有数位全为1,则称k(k>=2)是n的一个。n = "13""3"13 的 3 进制是 111。n = "4681""8"4681 的 8 进制是 11111。1000000000000000000 的 999999999999999999 进制是 11。n。原创 2025-02-19 11:58:15 · 448 阅读 · 1 评论 -
【11.6】数学思维-解24点游戏
给定一个长度为4的整数数组cards。你有4张卡片,每张卡片上都包含一个范围在[1,9]的数字。您应该使用运算符和括号'('和')'将这些卡片上的数字排列成数学表达式,以获得值24。'/'“-”“12 + 12”如果可以得到这样的表达式,其计算结果为24,则返回true,否则返回false。原创 2025-02-17 11:41:40 · 348 阅读 · 0 评论 -
【11.5】数学思维-解可怜的小猪
有buckets桶液体,其中含有毒药,其余装的都是水。它们从外观看起来都一样。为了弄清楚哪只水桶含有毒药,你可以喂一些猪喝,通过观察猪是否会死进行判断。不幸的是,你只有分钟时间来确定哪桶液体是有毒的。给你桶的数目buckets和,返回在规定时间内判断哪个桶有毒所需的猪数。522。原创 2025-02-15 11:26:14 · 610 阅读 · 2 评论 -
【11.4】数学思维-解排列序列
给出集合,其所有元素共有n!种排列。按大小顺序列出所有排列情况,并一一标记,当n = 3给定n和k,返回第k个排列。"213""2314""123"- 对于 `n` 个元素的排列,每个位置上的数字选择是固定的。- 第 `k` 个排列可以通过数学计算直接构造,而不需要生成所有排列。(1)**计算阶乘**:- 预先计算 `1` 到 `n-1` 的阶乘,用于确定每个位置上的数字。- 例如,`n = 4` 时,阶乘为 `[1, 2, 6, 24]`。原创 2025-02-14 09:56:34 · 293 阅读 · 0 评论 -
【11.3】数学思维-解最大回文数乘积
给定一个整数 n ,返回可表示为两个n位整数乘积的。因为答案可能非常大,所以返回它对1337。原创 2025-02-13 09:56:55 · 768 阅读 · 0 评论 -
【11.2】数学思维-解两个盒子中球的颜色数相同的概率
桌面上有2n个颜色不完全相同的球,球的颜色共有k种。给你一个大小为k的整数数组balls,其中balls[i]是颜色为i的球的数量。所有的球都已经,前n个球放入第一个盒子,后n个球放入另一个盒子(请认真阅读示例 2 的解释部分)。这两个盒子是不同的。例如,两个球颜色分别为a和b,盒子分别为[]和(),那么[a] (b)和[b] (a)这两种分配方式是不同的(请认真阅读示例的解释部分)。请返回「两个盒子中球的颜色数相同」的情况的概率。答案与真实值误差在10-5以内,则被视为正确答案1.00000。原创 2025-02-12 11:26:29 · 830 阅读 · 0 评论 -
【11.1】数学思维-解不同路径
一个机器人位于一个m x n网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?283从左上角开始,总共有 3 条路径可以到达右下角。1. 向右 -> 向下 -> 向下2. 向下 -> 向下 -> 向右3. 向下 -> 向右 -> 向下2862 * 10^9。原创 2025-02-11 14:35:12 · 348 阅读 · 0 评论 -
【10.10】队列-设计自助结算系统
get_max()add(value)valueremove()注意,为保证该系统运转高效性,以上函数的均摊时间复杂度均为 O(1)输入:输出: [null,null,null,7,4,7]输入:[[],[],[]]输出: [null,-1,-1]原创 2025-02-09 23:12:00 · 725 阅读 · 0 评论 -
【10.9】队列-解Dota2 参议院
Radiant(天辉)和Dire(夜魇)Dota2 参议院由来自两派的参议员组成。现在参议院希望对一个 Dota2 游戏里的改变作出决定。他们以一个基于轮为过程的投票进行。在每一轮中,每一位参议员都可以行使两项权利中的给你一个字符串senate代表每个参议员的阵营。字母'R'和'D'分别代表了Radiant(天辉)和Dire(夜魇)。然后,如果有n个参议员,给定字符串的大小将是n。以轮为基础的过程从给定顺序的第一个参议员开始到最后一个参议员结束。这一过程将持续到投票结束。原创 2025-02-09 23:11:36 · 814 阅读 · 0 评论 -
【10.8】队列-解望远镜中最高的海拔
科技馆内有一台虚拟观景望远镜,它可以用来观测特定纬度地区的地形情况。该纬度的海拔数据记于数组heights,其中heights[i]表示对应位置的海拔高度。请找出并返回望远镜视野范围limit内,可以观测到的最高海拔值。滑动窗口的位置 最大值。原创 2025-02-08 10:29:00 · 405 阅读 · 0 评论 -
【10.7】队列-解预算内的最多机器人数目
你有n个机器人,给你两个下标从开始的整数数组和,两者长度都为n。第i个机器人充电时间为单位时间,花费单位时间运行。再给你一个整数budget。运行k个机器人是,其中是这k个机器人中最大充电时间,是这k个机器人的运行时间之和。请你返回在budget的前提下,你可以运行的机器人数目为多少。3可以在 budget 以内运行所有单个机器人或者连续运行 2 个机器人。选择前 3 个机器人,可以得到答案最大值 3。原创 2025-02-08 10:11:12 · 686 阅读 · 0 评论 -
【10.6】队列-解从仓库到码头运输箱子
设 `dp[i]` 表示运输前 `i` 个箱子所需的最少行程次数。原创 2025-02-07 19:57:47 · 629 阅读 · 0 评论 -
【10.5】队列-化栈为队
实现一个MyQueue类,该类用两个栈来实现一个队列。// 返回 1// 返回 1// 返回 falsesizeis empty。原创 2025-01-24 10:44:26 · 258 阅读 · 0 评论 -
【10.4】队列-求出 MK 平均值
给你两个整数m和k,以及数据流形式的若干整数。你需要实现一个数据结构,计算这个数据流的。m-1mkk请你实现MKAveragemknum// 当前元素为 [3]// 当前元素为 [3,1]// 返回 -1 ,因为 m = 3 ,但数据流中只有 2 个元素// 当前元素为 [3,1,10]// 最后 3 个元素为 [3,1,10]// 删除最小以及最大的 1 个元素后,容器为 [3]// [3] 的平均值等于 3/1 = 3 ,故返回 3// 当前元素为 [3,1,10,5]原创 2025-01-23 11:25:49 · 600 阅读 · 0 评论 -
【10.3】队列-解滑动窗口最大值
给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。滑动窗口的位置 最大值[1]原创 2025-01-23 10:59:51 · 953 阅读 · 0 评论 -
【10.2】队列-设计循环队列
设计你的循环队列实现。循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。FrontReardeQueue()isEmpty()isFull()// 设置长度为 3// 返回 true// 返回 true// 返回 true。原创 2025-01-22 17:34:42 · 1965 阅读 · 0 评论 -
【10.1】队列-有序队列
通过分析问题,我们发现:当 `k = 1` 时,只能通过循环移位来构造字符串,因此需要枚举所有可能的移位结果。当 `k > 1` 时,可以通过任意次数的移动操作将字符串重新排列,因此直接排序即可得到字典序最小的字符串。这个问题的关键在于理解 `k` 的影响,并根据 `k` 的值选择不同的策略。原创 2025-01-21 11:35:35 · 312 阅读 · 0 评论 -
【9.10】树结构-删除二叉搜索树中的节点
给定一个二叉搜索树的根节点和一个值,删除二叉搜索树中的对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。另一个正确答案是 [5,2,6,null,4,null,7]。二叉树不包含值为 0 的节点[][0, 104]root。原创 2025-01-21 11:09:43 · 414 阅读 · 0 评论 -
【9.9】树结构-将有序数组转换为二叉搜索树
给你一个整数数组nums,其中元素已经按排列,请你将其转换为一棵平衡二叉搜索树。[0,-10,5,null,-3,null,9] 也将被视为正确答案:[3,1][1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。原创 2025-01-20 20:01:04 · 183 阅读 · 0 评论 -
【9.8】树结构-使用字典树解单词搜索 II
给定一个m x n二维字符网格board和一个单词(字符串)列表words返回所有二维网格上的单词。单词必须按照字母顺序,通过内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。[]words。原创 2025-01-20 11:00:31 · 748 阅读 · 0 评论 -
【9.7】树结构-实现 Trie (前缀树)
(发音类似 "try")或者说是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补全和拼写检查。Trie()wordwordtruefalsewordprefixtruefalse// 返回 True// 返回 False// 返回 True// 返回 TrueprefixinsertsearchstartsWith3 * 10^4。原创 2025-01-18 10:26:13 · 1180 阅读 · 0 评论 -
【9.6】树结构-二叉树的最近公共祖先
给定一个二叉树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树T的两个节点p、q,最近公共祖先表示为一个节点x,满足x是p、q的祖先且x的深度尽可能大(一个节点也可以是它自己的祖先)。3节点5和节点1的最近公共祖先是节点3。5节点5和节点4的最近公共祖先是节点5。因为根据定义最近公共祖先节点可以为节点本身。1[2,105]Node.val互不相同p!=qpq。原创 2025-01-17 20:10:55 · 884 阅读 · 0 评论 -
【9.5】树结构-二叉树中的最大路径和
二叉树中的被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中。该路径节点,且不一定经过根节点。是路径中各节点值的总和。给你一个二叉树的根节点root,返回其。6最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 642最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42。原创 2025-01-16 17:23:06 · 1107 阅读 · 0 评论 -
【9.4】树结构-二叉树的最大深度
给定一个二叉树root,返回其最大深度。二叉树的是指从根节点到最远叶子节点的最长路径上的节点数。32[0, 104]原创 2025-01-15 14:08:14 · 382 阅读 · 0 评论 -
【9.3】树结构-恢复二叉搜索树
给你二叉搜索树的根节点root,该树中的两个节点的值被错误地交换。请在不改变其结构的情况下,恢复这棵树。3 不能是 1 的左孩子,因为 3 > 1。交换 1 和 3 使二叉搜索树有效。2 不能在 3 的右子树中,因为 2 < 3。交换 2 和 3 使二叉搜索树有效。[2, 1000]使用O(n)空间复杂度的解法很容易实现。你能想出一个只使用O(1)空间的解决方案吗?原创 2025-01-14 14:13:15 · 412 阅读 · 0 评论 -
【9.2】树结构-二叉树最大宽度
给你一棵二叉树的根节点root,返回树的。树的是所有层中最大的。每一层的被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同,两端点间会出现一些延伸到这一层的null节点,这些null节点也计入长度。题目数据保证答案将会在带符号整数范围内。4最大宽度出现在树的第 3 层,宽度为 4 (5,3,null,9)。7最大宽度出现在树的第 4 层,宽度为 7 (6,null,null,null,null,null,7)。2。原创 2025-01-13 15:41:00 · 758 阅读 · 0 评论 -
【9.1】树结构-从先序遍历还原二叉树
我们从二叉树的根节点root开始进行深度优先搜索。在遍历中的每个节点处,我们输出D条短划线(其中D是该节点的深度),然后输出该节点的值。如果节点的深度为D,则其直接子节点的深度为D + 1。根节点的深度为0如果节点只有一个子节点,那么保证该子节点为左子节点。给出遍历输出S,还原树并返回其根节点root。原创 2025-01-13 11:50:30 · 1305 阅读 · 0 评论 -
【8.10】链表-回文链表
给你一个单链表的头节点head,请你判断该链表是否为回文链表。如果是,返回true;否则,返回false。原创 2025-01-10 14:51:19 · 390 阅读 · 0 评论 -
【8.9】链表-删除链表的倒数第 N 个结点
要删除链表中倒数第 `n` 个节点,关键在于找到倒数第 `n+1` 个节点,因为通过这个节点可以直接调整指针,从而删除目标节点。关于如何找到倒数第 `n+1` 个节点,有多种方法可以实现。需要注意的是,如果要删除的是头节点,那么链表中不存在倒数第 `n+1` 个节点,因此需要单独处理这种情况。原创 2025-01-06 10:51:18 · 1061 阅读 · 0 评论 -
【8.8】链表-链表中的下一个更大节点
给定一个长度为n的链表head对于列表中的每个节点,查找下一个的值。也就是说,对于每个节点,找到它旁边的第一个节点的值,这个节点的值它的值。返回一个整数数组answer,其中answer[i]是第i个节点()的下一个更大的节点的值。如果第i个节点没有下一个更大的节点,设置。[5,5,0]解释:2的下一个比他大的是51的下一个比他大的也是55后面没有比他大的值,所以是0。原创 2025-01-03 11:17:59 · 635 阅读 · 0 评论 -
【8.7】链表-找出两个链表的第一个公共节点
第一种解法虽然直观且容易想到,但效率较低,因为它需要将第一个链表的所有节点逐一存储,然后再逐个判断第二个链表的节点是否存在于集合中。相比之下,最后一种解法则更为巧妙,它不需要统计链表的长度,而是当一个链表遍历结束后,立即切换到另一个链表继续遍历。这种方法虽然不太容易想到,但却是一种非常经典的解决方案,既高效又节省空间。原创 2024-12-31 11:44:59 · 992 阅读 · 0 评论 -
【8.6】链表-两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。原创 2024-12-30 10:46:34 · 479 阅读 · 0 评论 -
【8.5】链表-删除排序链表中的重复元素
给定一个已排序的链表的头head删除所有重复的元素,使每个元素只出现一次。返回已排序的链表。原创 2024-12-26 11:41:28 · 547 阅读 · 0 评论 -
【8.4】链表-反转链表2
给你单链表的头指针head和两个整数left和right,其中。请你反转从位置left到位置right的链表节点,返回。[5]原创 2024-12-25 13:51:48 · 427 阅读 · 0 评论 -
【8.3】链表-反转链表
给你单链表的头节点head,请你反转链表,并返回反转后的链表。原创 2024-12-25 10:27:33 · 421 阅读 · 0 评论 -
【8.2】链表-合并两个有序链表
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。输入:1 ->2 ->4 , 1 ->3 ->4输出:1 ->1 ->2 ->3 ->4 ->4。原创 2024-12-24 10:54:21 · 301 阅读 · 0 评论 -
【8.1】链表-奇偶链表
给定单链表的头节点head,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。节点的索引被认为是节点的索引为,以此类推。请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。你必须在O(1)的额外空间复杂度和O(n)的时间复杂度下解决这个问题。n ==应当保持奇数节点和偶数节点的相对顺序。链表的第一个节点视为奇数节点,第二个节点视为偶数节点,以此类推。原创 2024-12-23 16:11:57 · 380 阅读 · 0 评论