算法
CataLpa81
这个作者很懒,什么都没留下…
展开
-
【数据结构】C++实现小顶堆
C++实现小顶堆//Myheap.h#pragma once#include<iostream>#include<vector>using namespace std;//小顶堆class MyHeap{public: MyHeap();//构造函数 MyHeap(vector<int>); void insert(int); void pop(); int top(); void assgin(vector<int>);原创 2021-08-25 00:03:10 · 590 阅读 · 0 评论 -
【数据结构】并查集
并查集昨天,2021年1月11号的leetcode每日一题中,用到了并查集这个数据结构。1202. 交换字符串中的元素在看到这道题的时候,想到了要用一个数据结构去表示字符串s中的各个下标的连通性,然后将下标连通性一致的元素排序即可。看了题解之后知道了有一个可以表示各个元素连通性的数据结构叫并查集,所以查了些资料,自己记录一下这个数据结构。并查集可以给一个数据结构中的元素分组,然后通过查询可以知道想要寻找的元素属于哪一个分组,并查集一般支持两种操作:1.查询:查询就是查询你想要查询的那个元素目前属原创 2021-01-12 16:22:55 · 1169 阅读 · 0 评论 -
【算法】全排列算法
全排列算法全排列算法是面试中常常会考到的一种算法。全排列算法就是求出一组数字的所有排列的可能性。例如**{1,2,3}**这三个数字的全排列就是1,2,31,3,22,1,32,3,13,1,23,2,1这里的六种排列。代码实现...原创 2021-01-09 16:36:19 · 1414 阅读 · 1 评论 -
【算法】洗牌算法
洗牌算法一个简单的洗牌算法思路如下:遍历待洗牌的数组,在遍历数组中的每一个数时,从数组中随机选取一个数,和当前下标的这个数做交换,当数组遍历完成时这个数组就被打乱了。这个洗牌算法的思路相当于在数组中随机填入待洗牌数组中的数,且不用考虑重复的问题,没有额外的内存空间的开销,每一个数在每一个位置存在的概率都是1/n。下面是代码void Shuffe(vector<int>& a, int n){ for (int i = n - 1; i > 0; --i)原创 2020-12-08 23:37:59 · 127 阅读 · 0 评论 -
【算法】极小极大值搜索算法MinimaxSearch————井字棋的应用
极小极大值搜索算法MinimaxSearch算法描述极小极大值搜索算法,MinimaxSearch算法,是一种零和算法,是用来最小化对手的利益,最大化自己的利益的算法。极小极大之搜索算法常用于棋类游戏等双方较量的游戏和程序,算是一种电脑AI算法。该算法是一种总零和算法,即双方的利益对立,利益的总和为0。比如在井字棋中,总利益为0,以玩家A的视角看,A取得胜利获得的利益是1,则B在A获得胜利的情况下获得的利益则为-1,反之亦然,双方的利益总和为0。棋类游戏是双方交替下棋的游戏,每一次落子都代表落子的原创 2020-11-26 11:36:53 · 6507 阅读 · 7 评论 -
【算法】简单的桶计数的应用——leetcode 1370.上升下降字符串
桶计数缘由今天写leetcode上的每日一题1370.上身下降字符串这是一道很简单的题目,但是自己一开始没有想到用桶计数的方法来做,说明自己对桶计数这个方法还不是特别的熟悉,所以在这里做个记录,让自己以后遇到类似的问题可以更快地找到合适的方法。题目题目是这样描述的 给你一个字符串 s ,请你根据下面的算法重新构造字符串:从 s 中选出 最小 的字符,将它 接在 结果字符串的后面。 从 s 剩余字符中选出 最小 的字符,且该字符比上一个添加的字符大,将它 接在结果字符串后面。 重复步骤 2原创 2020-11-25 11:06:14 · 1147 阅读 · 0 评论 -
【算法】全排列算法Permutaiton——有重复和无重复的全排列算法
全排列什么是全排列在有n个数的数组中取m个数按任意的顺序组合,叫做排列而在有n个数的数组中n个数按任意的顺序组合,叫做全排列例如数组[1,2,3,4]他的全排列有[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2][1,4,2,3][1,4,3,2]...[4,2,3,1][4,3,1,2][4,3,2,1](举例太多了中间就省略了)4个不重复的数的全排列有432*1总共24种组合。可以推倒出n个不重复的数字的全排列有n!种可能不重复数组的全排列原创 2020-11-17 15:46:42 · 505 阅读 · 1 评论 -
【算法】排序算法整理——计数排序
计数排序算法描述:在冒泡排序,选择排序,快速排序等比较型排序算法中,我们最快只能做到O(nlogn)的时间复杂度。而计数排序是原创 2020-09-14 23:03:18 · 180 阅读 · 0 评论 -
【算法】排序算法整理——快速排序
快速排序算法概述快速排序是在冒泡排序的基础上改进而来的,冒泡排序每次只能交换相邻的两个元素,而快速排序是跳跃式的交换,交换的距离很大,因此总的比较和交换次数少了很多,速度也快了不少。快速排序的算法思想稍微有点复杂,但是还是比较容易理解的。快速排序的思想就是挖坑填坑+分治法比如下面这个数组,我们首先选择一个基准数,我们就选择第一个数作为基准数,然后我们要在这个数组里面找到一个坑,把72这个数填进去,使得72的左边全部都是比72小的数,72的右边全部都是比72大的数。那现在我们开始来找这个坑。首原创 2020-09-12 12:53:50 · 219 阅读 · 0 评论 -
【算法】排序算法整理——归并排序
归并排序算法描述归并排序是一种较为复杂的排序方法。归并排序运用了分治的思想,具体过程如图:图片来源于visualgo:排序由图中可以看出,归并排序首先将一个待排序序列二分为两个待排序子序列,然后对于每一个子序列再进行二分。等子序列分到不能再分的时候,将两个最小的子序列中的数分别排序,然后再将两个子序列合在一起排序,再找到同级的子序列合在一起排序,合成父序列之后再合成父序列,直到排序完成。(好像表达的不是很清楚。。。但是看图应该就能了解其中的过程了)。这个的算法的重点就在于分治之后的合并。对于原创 2020-09-04 20:48:23 · 123 阅读 · 0 评论 -
【算法】排序算法整理——插入排序
插入排序算法描述:插入排序是一种很简单的排序算法。插入排序的基本思想是:每一步将一个待排序的数据插入到前面已经排好序的有序序列中,直到插完所有元素为止。图片来源于visualgo:排序算法实现以下是插入算法的代码实现void INSsort(vector<int>& v){ for (int i = 1;i < v.size();i++) { if (v[i] < v[i - 1]) {原创 2020-09-04 19:57:19 · 107 阅读 · 0 评论 -
【算法】排序算法整理——选择排序
选择排序算法描述:选择排序也是一种相对简单的算法选择排序的思想是:n次遍历数组,每一次遍历找出待排序数组中最大(最小)的元素,把他放在待排列数组的最前面(最后面)排序个过程如下图:图片来源于visualgo:排序算法实现:void SELsort(vector<int>& v){ for (int i = 0;i < v.size();i++) { int index = i; for (int j = i+1;j原创 2020-08-29 23:44:26 · 98 阅读 · 0 评论 -
【算法】排序算法整理——冒泡排序
1.冒泡排序算法描述:冒泡排序是排序算法中比较简单的一种。冒泡排序的主要思想是:通过n次排序,每一次排序将待排序数组中的最大(或最小)的数排到待排序数组的最前面(或最后面),数组中的元素就像冒泡一样,一个一个冒上来。排序过程如下图:图片来源于visualgo:冒泡排序算法实现:假设我们现在要让数组按从小到大的排序,首先选定待排序数组,一开始整个数组都是待排序数组,数组中有n个数,那我们第一次冒泡应该将数组中最大的数冒到数组a[n-1]的位置。所以我们开始遍历数组,我们通过一个指针遍历整个数组原创 2020-08-28 19:29:23 · 152 阅读 · 1 评论