- 博客(15)
- 收藏
- 关注
原创 欧几里得算法求最大公约数
今天写题目,因为求最大公约数超时,到底没想起来欧几里得算法,回来狠狠的理解了一下。由于等式右面是整数,所以整数左面也是整数,所以d也是c(也就是a%b)的约数。理解:求a,b的最大公约数d,我们要想办法缩小数据范围。仅仅是个人的理解,证明不完善,以后加深理解补充。假设 a=b*k+c,那么c=a-b*k。两边同时/d,c/d=a/d-b*k/d。因此令a=b,b=a%b,直到a%b为0。所以就可以等价求b,a%b的最大公约数。
2023-04-16 21:46:05 108
原创 KMP算法
首先引入了next数组,而next数组的求法其实和KMP算法的核心思想是一样的,首先看下什么是next数组。缩到多短呢,那肯定是听取前人的经验,到next[j]了,当他一直退退退都不能匹配,那就是推到-1也不能匹配,那就是没有前后缀相等的情况了,然而当我们突然发现s[j+1]等与s[5]了,我们要找的人来了,next[5]=j+1。在next[3]的基础上,箭头两个已经相等,是不是只要下一个相等,就是最长相等前后缀了,即s[next[3]+1]=s[4],当然这是最简单的情况,那我们继续来求next[5]
2022-10-11 11:08:04 130
原创 初级算法-位运算
理解:n>>1 偶数位移到奇数位,与M1与就是保留现在的奇数位,就是原来的偶数位,n&M1就是保留原来的奇数位,左移,到偶数位,这样两个结果或运算就是实现了奇偶交换。链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/xnyode/让32个数字反转,先是奇数和偶数交换,然后两个两个交换,接着四个四个交换,八个八个交换,十六个十六个交换,这就是所谓的分治。两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。
2022-09-17 17:20:37 125
原创 初级算法-求素数
后面我们又学习了埃式筛,思路就是我们知道2是素数这一个前提,筛去2的倍数,那么后面的第一个没被筛掉的一定是素数,那就筛掉这个数的倍数,以此类推,上代码。接下来我们发现这种方法会重复计算,就有了线性筛,但是一般不做要求,
2022-09-10 17:13:24 122
原创 Fisher-Yates 洗牌算法
Fisher-Yates 洗牌算法是用来把一个有序数组生成随机排列数组的算法,生成的随机排列都是等概率的。这个算法,通过转换,改变的一直都是随机数的范围,把用过的堆到最后就好了。第一次知道这个算法,虽然很好理解,但也非常巧妙。代码如下,节选某题的一部分。
2022-09-04 20:30:00 261
原创 初级算法-动态规划
其实大部分的动态规划问题都可以用递归来写,所有拥有重叠子问题的题目我们都可以考虑一下动态规划,通俗来讲,就是将复杂问题简单化,从大化小,从开始找终点,找到笑到最后的那个。,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。什么是动态规划,什么样的问题需要考虑动态规划算法?我想谈谈自己的想法。2.找目前待解决的子问题和前面的关系。(可以分类的就可以设置二维数组)是数组中的一个连续部分。
2022-09-03 21:05:22 165 1
原创 对称二叉树的判断
对称二叉树的判断,看到树的题,两个方向,一递归,二迭代(多用队列),话不多说上代码。其实这题和前面计算二叉树的最大深度非常相似,思路基本是一样的。这道题没什么特别的,仅此纪念新学期写的第一题。...
2022-08-29 21:11:16 977
原创 初级算法-二叉树的最大深度
在二叉树算法中,解决问题大多数都是借助递归和栈。方法一:递归:二叉树的最大深度是左子树和右子树深度最大值+1(根),也就是深度优先。 方法二:广度优先:借助栈一层一层的访问,每访问一层,深度加一;具体一点就是,从根开始,访问根的左子树右子树,记录下第二层结点的数量,进栈,再循环访问第二层的左子树右子树进栈,每经过一个这样的循环,深度加一。...
2022-08-07 16:47:20 252 1
原创 初级算法-判断链表是否有环
方法二:使用set集合,set是用来去重的有用道具,其中的count()函数用来判断集合中是否存在某。判断链表是否有环是一个老生长谈的问题了,方法有很多,但是我觉得比较容易理解的还是快慢指。思路如下:两个人在赛跑,两个人速度不变,如果是沿着没有环的赛道,那一定是跑的快的人先到。终点(也就是指针到达链表尾部),如果有环,那么跑的快的一定会先进入环里,并套圈跑的慢的。人,也就是俩个人一定会相遇。...
2022-08-05 17:54:17 109
原创 初级算法-合并有序链表
解法一暴力出奇迹,两个链表一个一个的比对,如果你小你向前走一步,我原地不动;否则我向前走一步,你原地不动。这道题很常规,很直观,很典型。
2022-07-26 17:59:06 154 1
原创 初级算法-数组(续)
其中box=i/3*3+j/3是在求当前的坐标在第几个九宫格内,可以简单理解i/3三行一划分,j/3三列一划分,但是如果简单相加肯定不对,再接着向下推导(哪怕简单试试也很容易试到),其中也等价于box=i/3+j/3*3;这道题目一般思路创建三个二维数组,分别记录行,列,九宫格的数字,因为数字较少,所以可以采用桶排序判断是否重复出现。怎么比较有没有重复出现呢,很多人应该猜到了,就是与运算,如果结果大于0就是存在,否则不存在。原本以为本题结束了,一看题解,我竟然看到了位运算!位运算总能给人惊喜!...
2022-07-19 11:22:41 1776 3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人