
算法
常见算法
Counter-Strike大牛
业界老小白
爱工作,爱生活
展开
-
【算法】二叉树的前序、中序、后序遍历
前序遍历:DBEAFCG。中序遍历:ABDECFG。后序遍历:GCFAEBD。原创 2024-04-09 16:08:47 · 288 阅读 · 0 评论 -
【算法】最长连续递增序列 - 贪心算法
从第一个元素开始遍历,当遍历到当前元素不再递增时,计算当前长度,并与之前记录的最大值比较,取到最终的最大值。给定一个数组,要求从数组中找到最长的连续递增的序列。原创 2024-04-08 20:41:31 · 501 阅读 · 0 评论 -
【算法】二叉树最小深度 - 深度优先/广度优先
从根节点遍历所有叶子结点,找到最少的节点数。创建一个队列,将根节点及其深度放入队列,取出后判断其左右节点,如果为null返回深度,否则将左右节点放入队列,深度为上一节点深度 +1,以此类推。先找到所有的叶子节点,然后从叶子节点数到根节点,找到最少的节点数。给定一个二叉树,求最小深度(根节点到叶子结点最少的节点数)。原创 2024-04-08 19:57:37 · 299 阅读 · 0 评论 -
【算法】子数组最大平均数 - 滑动窗口
先选中开头的 n 个数字,计算出和并记录,然后后移窗口(减去最前面的数再加上后面的一个数),计算出新的和,取最大的和,最后计算平均数并返回。给定一个数组和一个数字 n ,在数组中找到连续的 n 个平均数最大的数字。原创 2024-04-08 18:51:46 · 216 阅读 · 0 评论 -
【算法】合并两个有序数组 - 双指针
定义三个指针,分别指向 nums1 的最大元素(p1)、nums2 的最大元素(p2)、nums1 的最后一个元素(空位)§。依次对比 p1 和 p2 的大小,大的放到 p 的位置,前移已经移动的指针和 p 指针即可。两个有序整数数组 nums1 和 nums2 及他们的元素个数 m、n,将 nums2 合并到 nums1 中,结果依然有序。nums1 长度默认为 m + n,没有元素的位置用 0 补齐。原创 2024-04-07 13:13:24 · 452 阅读 · 0 评论 -
【算法】环形链表 - 遍历/双指针
声明一个快指针和一个慢指针,快指针每次移动两步,慢指针移动一步,如果两指针相等则说明有环。声明一个Set,遍历链表放入Set,如果放入失败,说明有环。给定一个链表,判断链表中是否有环,并返回结果。原创 2024-04-07 11:30:50 · 459 阅读 · 0 评论 -
【算法】排硬币 - 二分法/牛顿迭代
定义一个指针 low = 0,和一个指针 high = 1,每次迭代将 low + high 赋值给 high,将原来的 high 赋值给 low,从2开始遍历到n即得出结果。使用递归的方式计算出结果,但使用一个数组保存已经计算出来的值,防止重复计算,提高性能。每个数等于前面两个数相加,第n位等于第(n - 1)位加上第(n - 2)位。斐波那契数列:0 1 1 2 3 5 8 13 ……给定n,求斐波那契数列第n位的数值。原创 2024-04-06 21:24:06 · 290 阅读 · 0 评论 -
【算法】斐波那契数列第n位 - 去重递归/双指针迭代
定义一个指针 low = 0,和一个指针 high = 1,每次迭代将 low + high 赋值给 high,将原来的 high 赋值给 low,从2开始遍历到n即得出结果。使用递归的方式计算出结果,但使用一个数组保存已经计算出来的值,防止重复计算,提高性能。每个数等于前面两个数相加,第n位等于第(n - 1)位加上第(n - 2)位。斐波那契数列:0 1 1 2 3 5 8 13 ……给定n,求斐波那契数列第n位的数值。原创 2024-04-06 19:53:19 · 230 阅读 · 0 评论 -
【算法】有序数组的两数之和 - 二分法/双指针
初始化两个指针,一个指向下标0,另一个指向最后一个数,让两个数相加,如果大于给定数,则右指针左移,否则左指针右移,直到找到和等于给定数的两个值,返回下标即可。以第一个数为基准数,采用二分法寻找数组中与之相加等于给定数的数字,找到则返回下标,否则以第二个数为基准数,以此类推。在一个有序数组中找到两个数,两个数之和为给定的一个数,返回两个数在数组中的下标。原创 2024-04-06 19:00:15 · 255 阅读 · 0 评论 -
【算法】无序数组的两数之和 - map标记
遍历数组,遍历到一个数字的时候,记录下这个数及其下标,遍历时判断给定数减去这个数为key在map中是否存在,存在则返回两个下标,否则将数和下标放入map即可。在一个无序数组中找到两个数,两个数之和为给定的一个数,返回两个数在数组中的下标。原创 2024-04-06 18:40:37 · 469 阅读 · 0 评论 -
【算法】求一个数组中三个数乘积最大值 - 线性扫描
一个数组中最大值只有两种情况:两个最小的负数和一个最大的正数 & 三个最大的正数。线性扫描找出这五个数字,即可求出最大值。给定一个数组,找出数组中乘积最大的三个数。原创 2024-04-06 17:21:44 · 377 阅读 · 0 评论 -
【算法】求平方根 - 二分法/牛顿迭代
比如求12的平方根,2 * 6 = 12,那么 (2 + 6) / 2的值就会更趋近于平方根。求num的平方根,则是求 num / x 和 x 的均值,这个值会越来越趋近于真正的平方根。遍历每次取中间数,大了就往小取,小了就往大取,直到取到正确的值。求一个数的平方根,要求返回小于等于平方根的正整数。原创 2024-04-05 16:44:49 · 353 阅读 · 0 评论 -
【算法】寻找数组中心下标 - 双指针/求总和
遍历数组,当 sum * 2 + 当前元素 = arraySum时,当前元素即为中心元素,不想等则让 sum 加上当前元素。遍历数组,每次遍历先让 leftSum + 当前元素,此时两个Sum都包含当前元素,如果两个Sum相等,则当前元素为中心元素;定义两个变量,一个为从左侧累加的和 leftSum = 0,一个从右侧递减的和 rightSum,rightSum初始值为整个数组的和。给定一个非空数组,找到一个元素,该元素左侧元素和等于其右侧元素和,返回该元素下标。原创 2024-04-05 10:50:23 · 214 阅读 · 0 评论 -
【算法】删除数组中的重复元素 - 双指针
定义一个快指针 j 和一个慢指针 i,慢指针从下标0开始,快指针从下标1开始,遍历数组。如果两个下标对应的数不相等, 则后移 i,并将j的元素赋值到 i,然后后移 j。如果相等,则只后移 j。这样等 j 遍历完数组后,不重复的元素正好排到 i 的位置。由于题目要求返回长度,所以返回 i+1 即可。给定一个有序数组,要求删除数组中的重复元素,不允许创建新数组,返回删除重复元素后的数组长度。原创 2024-04-04 11:47:58 · 295 阅读 · 0 评论 -
【算法】统计素数个数 - 埃筛法
素数只能被1和它本身整除,所以小的数能够通过乘法计算出来的数都不是素数。埃筛法就是不断地用小的数做乘法标记出哪些数不是素数,从而减少遍历次数。原创 2024-04-04 11:26:58 · 218 阅读 · 0 评论 -
【算法】链表翻转的两种写法
【代码】【算法】链表翻转的两种写法。原创 2024-04-02 19:39:06 · 404 阅读 · 0 评论 -
【算法】字符串查询KMP算法代码实现
主要原理是,先在子串中找到所有重复的更小子串,并在重复的后面的子串的最后一位的下标记录子串长度。当与主串匹配出现不一致时,后移失配的前一个下标对应步长,然后继续进行匹配。不回溯主串,通过计算步长后移子串的方式快速查找字符串,将时间复杂度控制到O(n)。原创 2024-04-02 18:54:24 · 393 阅读 · 0 评论