神奇的算法
文章平均质量分 71
化复杂为简单
cheniie
从今去把她忘却,只此长醉了余生。
展开
-
数组中超过一半的元素
还有一种叫 Boyer-Moore 投票算法,时间复杂度 O(n),空间复杂度 O(1)。它的思路类似于消消乐,我们将超过一半的数叫做众数,先将数组分成众数和其他数两个阵营,然后一一相消,剩下的就是众数了。这个问题要解起来不难,暴力计数,转为 map,排序都能解决。但是他们的空间复杂度都不低,即便排序能做到 O(1) 的空间复杂度,但最低的时间复杂度也是 O(nlogn)。在 elixir 中我们可以用 reduce 来实现这个迭代过程。有一个数组,找出其中数量超过的元素是谁。原创 2024-10-18 15:32:43 · 165 阅读 · 1 评论 -
生成 Excel 表列名称
一开始以为就是一个简单的26进制转换,到底还是大意了,这里的每一位都是没有0的,而且能取到进制的最大值。正常26进制每一位都是0到25,但是这里却是1到26。只不过和正常的 n 进制转换不同,我们不能直接用 n 去取模和取余,而是应该用 n-1。Excel 大家都用过,它的列名是用字母编号的,A 表示第一列,B 表示第二列,AA 表示第27列,AB 表示第28列等等。实际上每次都多加了1,所以在计算每一位的值时要将它减出来。来构造每一位的值,连递归都不用写了,可以说是十分优雅了。的范围是1到26,我们将。原创 2024-10-16 14:11:25 · 1036 阅读 · 0 评论 -
Elixir求解螺旋矩阵问题
首先我们把矩阵分成第一行和剩余部分,第一行很好生成,就是一个长度为 n 的递增数组,如果递归能构造出剩余部分,那么问题就解决了。我们是在 elixir 中求解,没有变量,没有循环,但是我们有递归。首先我们要先确定可重复的计算是什么,已 3x3 的螺旋矩阵为例,我们沿着顺时针方向用不同颜色标注出每次递归的内容,如下图所示。,但它是反过来,按顺时针方向螺旋输出矩阵,这不是巧了嘛这不,通过反转和转置,我们只需要每次将矩阵的第一行拼接到结果数组中就行了。在 elixir 中,矩阵矩阵转置也很秒,优雅,实在是优雅。原创 2024-09-27 18:09:01 · 438 阅读 · 0 评论 -
Elixir求解找零钱问题
没有循环和全局变量,这是从命令式语言转向函数式语言的一大障碍,许多人在使用函数式编程语言时,会突然发现自己不会写代码了。elixir其实也不是没有循环,函数式语言的循环可以通过列表和递归来实现,这是函数式语言的两大利器,用好列表可以解决绝大多数问题。好了思路清晰了,现在的问题是如何在循环过程中记录中间结果,毕竟没有全局变量可以用,而且变量还不可变。找零钱是一个经典的动态规划问题,我们需要利用一堆零钱凑出想要的金额,并使得使用的零钱数量最少。不仅可以用来做累加累乘,它的结果也可以是一个列表,字典,任意都行。原创 2024-07-20 18:42:08 · 250 阅读 · 0 评论 -
连通分量(quick-union)
连通域问题的抽象表述是存在N个节点和M条边,被边直接或间接相连的所有节点共同形成一个域,称为连通域。在进行有限次的连接后,需要快速求出连通域的个数,或者判断任意两个节点的连通性。连通域的个数也称为连通分量,该算法也被称为Union-Find。原创 2022-10-11 17:38:24 · 6929 阅读 · 0 评论 -
【详解】二分查找
二分查找的思量非常简单,但是要写对也不是件容易事。二分搜索的主要矛盾在于存在重复值的情况,因为这种情况下涉及到查找方向的问题,也既是返回最左边的值的位置,还是最右边的值的位置,还是随便一个值的位置。本文将详细讲解二分查找算法的全部细节,帮你真正理解二分查找算法的精髓,从此告别死记硬背。......原创 2022-07-02 17:36:16 · 920 阅读 · 0 评论 -
辗转相除法
这是用来求最大公约数的算法。算法过程:求a,b的最大公约数,假设a>b;取m=a%b,a=b,b=m;重复上述过程知道m=0,此时的b就是最大公约数。原理:例如,求1112和695的最大公约数。假设最大公约数为n,那么1112和696分别可以看成是i和j个n。这里需要证明a、b的最大公约数和b、m的最大公约数相同。基于以上假设,a=i×na=i \times na=i×n,b=j×nb=j \times nb=j×n,m=(i%j)×nm=(i \% j) \times nm=(i%原创 2021-02-15 01:12:40 · 442 阅读 · 1 评论 -
排序算法总结
常见排序算法总结与Go语言实现。原创 2021-02-14 18:00:38 · 179 阅读 · 0 评论 -
求任意整数模3的余数
在回答这个问题之前,首先思考另一个问题:为什么是模3的余数,而不是2或5?那是因为3很特殊,求一个数模3的余数时,有一种巧妙地解法。算法算法是将这个数的各位数字加起来,重复这一过程,直到最后得到一位数,这一位数模3的结果就是最终答案。比如求17%3,1+7=8,8%3=2,于是17%3=2。参考代码:func mod3(num int) int { sum := num for...原创 2020-03-02 02:31:18 · 3919 阅读 · 0 评论 -
数组中只出现一次的数字
一个数组中除了一个数字出现一次,其他数字都出现n次,找出出现一次的那个数字。原创 2018-05-09 16:41:33 · 249 阅读 · 0 评论 -
简单的正则表达式匹配
简单的正则表达式匹配算法si原创 2018-03-19 20:32:43 · 692 阅读 · 0 评论 -
面试题—乘积数组
有数组A[0,1,…,n-1],构建数组B[0,1,…,n-1],其中B[i] = A[0] * A[1] *…* A[i-1] * A[i+1]*…* A[n-1].但是不能使用除法。原创 2018-01-14 17:33:32 · 301 阅读 · 0 评论 -
从斐波拉契到青蛙
面试中斐波拉契数列的三种求解方式和应用。原创 2017-12-27 11:31:26 · 249 阅读 · 0 评论 -
寻找有环单链表的入口节点
问题陈述:一个可能存在环的单链表,寻找环的入口节点。这一问题有许多解法,这里说明三种,各有优劣。前两种方法相对容易理解,第三种方法则相对优雅一些,建议直接看第三种方法。原创 2017-11-06 21:46:58 · 3579 阅读 · 0 评论