算法
文章平均质量分 78
瘦弱的皮卡丘
2018
展开
-
什么是拓扑排序
在图论中,拓扑排序是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件:每个顶点出现且只出现一次。 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。并不是所有图都存在拓扑排序,拓扑排序在图中也不是唯一的(通常,一个有向无环图可以有一个或多个拓扑排序序列)。不含环路的有向图必包含入度为零的顶点—因此一定存在拓扑排序拓扑排序的算法实现入度为 0 的顶点 m(及其...原创 2022-03-15 10:12:45 · 806 阅读 · 0 评论 -
一文解决投骰子类的算法题
目录首先来看一道经典的问题:n个骰子的点数我们再来看另一个问题:掷骰子的N种方法牢记投骰子类问题的解决方法:动态规划首先来看一道经典的问题:n个骰子的点数题目是这样的:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。示例 1:输入: 1输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]示例 2:输入: 2输出: [0.02778,0.05556,0.08333,原创 2022-01-18 23:12:10 · 1739 阅读 · 0 评论 -
洗牌算法
目录一、什么是洗牌算法二、如何去打乱三、例题一、什么是洗牌算法现在有一副扑克牌,让你去洗牌,怎么洗牌才能让每一种牌之间的组合出现的概率相等?简单的问题往往隐藏了重要信息,比如这里我们可以将洗牌理解为将这副牌打乱,那么什么才叫乱呢?其中有两个要素:随机的结果要能够覆盖所有的情况,(譬如 n张牌,最后的结果有 n! 情况,结果所有顺序必须都能够出现)。 所有出现的结果 概率 相等。二、如何去打乱首先,设定我们已经拥有了系统提供的rand函数,能够提供一个给定范围内的随机数原创 2022-01-16 16:28:07 · 3029 阅读 · 1 评论 -
蓄水池抽样算法
目录一、什么是蓄水池抽样算法二、蓄水池抽样算法的证明三、例题一、什么是蓄水池抽样算法我们现在来考虑一种出现在大数据流中的随机抽样问题,即:当内存无法加载全部数据时,如何从包含未知大小的数据流中随机选取k个数据,并且要保证每个数据被抽取到的概率相等。蓄水池抽样算法就是用来解决该类问题的算法。二、蓄水池抽样算法的证明当时也就是说,我们每次只能读一个数据。假设数据流含有N个数,我们知道如果要保证所有的数被抽到的概率相等,那么每个数抽到的概率应...原创 2022-01-16 15:14:09 · 3126 阅读 · 0 评论 -
灯泡开关问题
初始时有n 个灯泡处于关闭状态。第一轮,你将会打开所有灯泡。 接下来的第二轮,你将会每两个灯泡关闭一个。 第三轮,你每三个灯泡就切换一个灯泡的开关(即,打开变关闭,关闭变打开)。 ... ... 第 i 轮,你每 i 个灯泡就切换一个灯泡的开关。 直到第 n 轮,你只需要切换最后一个灯泡的开关。找出并返回 n轮后有多少个亮着的灯泡。预备知识1.何为约数?约数,又称因数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b...原创 2021-11-15 11:10:57 · 592 阅读 · 0 评论 -
猴子吃香蕉问题
有n根香蕉,分别编号1~n, 无序地放在一起。夜晚,一只猴子偷吃了其中的1根香蕉。第二天早晨,管理员生气了,他该怎样找出被偷吃的香蕉的编号呢?我们先来看看偷吃前后的变化我们考虑对虚线框中的数进行异或,很显然,x与x的异或值是0,又由于异或可交换可结合,所以,可以把上述所有的数字进行异或,最后的值就是4,且看:x = 2^4^1^3^2^1^3利用异或的交换律和结合律:x = (2^2)^4^(1^1)^(3^3)也即:x= (0)^4^(0)^(0)=4...原创 2021-11-14 13:11:41 · 319 阅读 · 0 评论 -
力扣刷题续
79.实现strStr(KMP)方法一 .常规方法class Solution {public: int strStr(string haystack, string needle) { if(haystack.empty() && needle.empty()) return 0; int m = haystack.length(); int n = needle.length(); for(int原创 2021-10-24 19:13:33 · 450 阅读 · 0 评论 -
判断单链表中是否有环 | 判断两个单链表是否相交
目录一.判断单链表是否存在环1.判断一个单链表中是否存在环2.寻找环的连接点3.如何获取环的长度4.如何将带环的单链表变为普通的单链表二.判断两个无环单链表是否相交1.方法一 利用两个相交链表尾节点相等的属性2.方法二 利用栈3.方法三 利用环一.判断单链表是否存在环首先我们来看一下,什么叫做单链表中存在环,即下图中所示的这种情况。其中,我们将节点5称为连接点,即这个单链表中环开始的那个节点。1.判断一个单链表中是否存在环定义两个指针,即快指...原创 2021-01-26 22:38:05 · 488 阅读 · 1 评论 -
算法 | C语言实现memmove函数
编程实现: void * memmove( void* dest, const void *src, size_t count );参数: dest 指向复制目的对象的指针 。src 指向复制来源对象的指针 。count 要复制的字节数 。返回值: 返回 dest 的副本。(真正有意义的地址是dest本身)void* MyMemMove(void* dst, const void* src, int count){ as...原创 2020-07-08 21:25:59 · 359 阅读 · 0 评论 -
算法 | 八大排序算法,含动态图详解
一.冒泡排序1.冒泡排序:冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。2.算法步骤: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 ...原创 2020-04-19 15:30:35 · 1495 阅读 · 0 评论 -
算法 | 求一个数组的所有子集
目录一.例子二.代码三.分析一.例子现在有一个数组如下:ar[3] = {1,2,3};那么这个集合的全部子集为{} {1} {2} {3} {1,2} }{2,3} {1,3} {1,2,3}。二.代码#include<stdio.h>void fun(int* ar, int* br, int i, int n){ if (i &...原创 2020-04-15 20:35:50 · 2564 阅读 · 0 评论 -
算法 | 全排列问题(图文详解)
目录一.全排列的定义1.什么是全排列2.例子二.code三.分析一.全排列的定义1.什么是全排列从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。2.例子假设现在有一个数组ar如下ar[3]={1,2,3};那么这个数组的全排列就是1,2,31,3,...原创 2020-04-14 17:18:23 · 46784 阅读 · 14 评论 -
素质三连
一.大数相加(两个高精度的正整数相加)问题描述 输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。算法描述 由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。 定义一个数组A,A[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储b。 计算c = a +b的时候,首先将A...原创 2019-05-18 20:16:49 · 211 阅读 · 0 评论 -
二进制反转
题目描述: 请编写函数,这个函数的返回值是把value的二进制位模式从左到右变换一下后的值。例如,在32位机器上,25这个值包含下列各个位:000000000000000000000000000000011001函数的返回值应该是2550136832,它的二级制位模式是:100110000000000000000000000000000000编写函数时要注意不要让...原创 2019-05-27 15:58:38 · 4168 阅读 · 0 评论 -
筛选法求素数
筛选法求素数思路:我们判断一个数是否为素数,就看这个数除了1和它本身以外,还有没有其他因子。例如2,3,5,7...都是素数,但是2的倍数,3的倍数,5的倍数....都不是素数,因此我们利用筛选法,从一个数n开始,判断n后面的数,是否为n的倍数,如果这个数是n的倍数那么这个数肯定不是素数.代码如下:#include<stdio.h>#include<stdlib....原创 2019-04-14 14:21:49 · 243 阅读 · 0 评论 -
将一个数的每一位都正序输出——简单算法
代码如下:#include<stdio.h>void Fun(int n){ int i; if((i=n/10)!=0) { Fun(i);//函数自己调用自己 } printf("%d ",n%10);}int main(){ Fun(123456);//测试用例 printf("\n"); Fun(436243);//测试用例 print...转载 2019-03-30 19:19:59 · 1487 阅读 · 0 评论 -
把两个数互相交换的三种方法——C语言
一.设置一个中间变量t方法如下:#include<stdio.h>void Swap1(int *p,int *q)//传址传递{ int t;//中间变量 t=*p; *p=*q; *q=t;}二.利用a和b的加减运算关系方法如下:#include<stdio.h>void Swap2(int *p,in...原创 2019-03-30 15:13:00 · 1507 阅读 · 0 评论