
算法
文章平均质量分 64
ych9527
这个作者很懒,什么都没留下…
展开
-
错排问题分析
前言错排问题,是一种著名且常见的算法,应该熟练掌握它结合例题进行分析今年公司年会的奖品特别给力,但获奖的规矩却很奇葩:首先,所有人员都将一张写有自己名字的字条放入抽奖箱中;待所有字条加入完毕,每人从箱中取一个字条;如果抽到的字条上写的就是自己的名字,那么“恭喜你,中奖了!”现在告诉你参加晚会的人数,请你计算有多少概率会出现无人获奖?题目链接分析:概率 = 每个人拿到的不是自己名字的排列总和 / 每个人有可能拿到的名字的排列总和;分母,是要求得所有可能出现的情况,很显然是一个全排列问原创 2021-06-04 16:42:19 · 382 阅读 · 1 评论 -
栈相关题目
文章目录1.每日温度1.1解法11.2解法21.每日温度请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。题目链接1.1解法1双重for循环,从后往前进行遍历同时当遍历遇到返回数组之中的0时,代表后面没有比该元原创 2021-05-06 13:36:52 · 211 阅读 · 0 评论 -
数组题——壹
文章目录1.删除有序数组中的重复项2.只出现一次的数字23.只出现一次的数字 III1.删除有序数组中的重复项给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。题目链接给定两个指针,prev指针的位置表示当前位置的元素为不含重复元素数组的最后一个元素的位置另外一个指针则遍历数组由于数组是有序的,因此相同的元素都会靠在一起因此,当两个元素原创 2021-04-02 16:45:18 · 209 阅读 · 0 评论 -
圆圈中最后剩下的数字(约瑟夫环)
文章目录1.题目2.分析1.题目0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。题目链接2.分析...原创 2021-03-16 12:21:14 · 246 阅读 · 0 评论 -
递归算法
文章目录1.何谓递归2.使用递归的要点3.实例1——斐波那契数列3.1题目3.2分析4.实例2——求一个数的阶乘4.1题目4.2分析5.实例3——汉诺塔5.1题目5.2分析6.实例4——反转单链表6.1题目6.2分析7.实例5——对称二叉树7.1题目7.2分析8.实例6——平衡二叉树8.1题目8.2分析1.何谓递归递归算法是在函数或者子过程的内部,直接或间接的调用自己的算法;简而言之:递归算法实际上是将问题转化为缩小了的同类问题的子问题,然后再递归调用函数或者过程来解决问题2.使用递归的要点1.递原创 2021-03-11 18:33:05 · 1897 阅读 · 1 评论 -
剪绳子——为什么3的个数越多,乘积越大
文章目录1.题目2.分析3.实现代码1.题目力扣中有一题是这样描述的:给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。题目链接2.分析大家肯定都看到了大佬在题解区的分析,即将绳子分解成3的个数越多时乘积越大,不过那个证明公式还原创 2021-01-12 14:45:16 · 1376 阅读 · 2 评论 -
二分查找:编写代码在一个整形有序数组中查找具体的某个数
#define FOUND_FAILED -1//数组是一个升序数组int BinSearch(int array[],int number,int target)//查找成功返回下标,查找失败返回-1;{ int start = 0;int end = number-1;while (start <= end){ int middle = (start + end) / 2; if (target<array[middle]) { end = middle -原创 2020-10-18 00:08:26 · 582 阅读 · 0 评论 -
辗转相除法,看了不懂你来砍我!!!
设现在有两个数:x>y;x%y=c; (余数为c,最大公因数为z)那么有:x=ny+c(n为整数);此时,当c不为0时,z肯定要小于等于c。因为当c<z<y且z可以被y整除的时候,ny%z=0,c%z!=0,,此时x=ny+c中,ny可以被z整除,c不可以,那么x肯定不能被z整除;所以z<=c;又有,x>y取最大公约数z,z肯定小于等于y,此再用y来与c比较,如果y%c=0,那么ny%c=0,c%c=0,即(ny+c)%c=0,即x%c=0;如果y%c!=0,y和c将成原创 2020-11-06 17:26:20 · 305 阅读 · 0 评论 -
汉诺塔——老夫不管什么分析不分析,直接粗暴
直接上图开干: 1个盘子直接从A放到C(递归出口),大于1个不管你有多少盘子,我始终把你当成两个盘子,即第n个和第(n-1)个,那就是把(n-1)放到B,把n放到C,再把(n-1)放到C,递归思想大功告成;直接上代码:void Prinmove(int num,char a,char b){ printf("%d盘:%c->%c\n",num,a,b);}void Move(int num,char A,char B,char C) //三根柱子 A,B,C{ if (num ==.原创 2020-11-13 11:52:34 · 249 阅读 · 0 评论 -
时间复杂度之——大幂数运算
假设有这么一个题目:给出一个数非零数base,一个非零数n,求base的n次方;通常情况下的算法是直接套个循环,多个base直接相乘,示意代码如下:int t=0;while(n){t*=base;n--;}假如现在要求优化这个算法,降低时间复杂度呢?我们可以这样:假设base=10,n=5;先贴代码int t=0;while (n){ if (n) { t *= base; } n >>= 1; base *= base;}return t;注原创 2020-12-03 14:11:37 · 655 阅读 · 0 评论 -
旋转数组的四种解法
目录示例:给定一个数组,将数组中的元素向右移动 *k* 个位置,其中 *k* 是非负数。解法1:遍历法解法2:反转法解法3:开辟数组法解法4:环状替换法示例:给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。示例:输入: [1,2,3,4,5,6,7] 和 k = 3输出: [5,6,7,1,2,3,4]解释:向右旋转 1 步: [7,1,2,3,4,5,6]向右旋转 2 步: [6,7,1,2,3,4,5]向右旋转 3 步: [5,6,7,1,2,3,4]解法1:遍历原创 2020-12-06 11:09:07 · 5340 阅读 · 2 评论