算法
qianji_little_boy
这个作者很懒,什么都没留下…
展开
-
BFPRT详解
用途:用于寻找一堆无序数中第k大的数思路:用快排中partition函数的思想,一直partition到等于轴心数的区域包含arr[arrSize - k],轴心数的选取为比较特殊。由于保证了轴心数的品质,所以BFPRT算法的时间复杂度是严格的O(n)。轴心数的选取:分组:把partition的区域,每5个分成一组,最后不满5个的单独成一组 组内排序:每组数进行排序。 组成中位数数...原创 2018-10-31 10:13:13 · 314 阅读 · 0 评论 -
几种常见排序算法总结
ps:以从小到大排序为例名称 一句话总结 时间复杂度 稳定性 冒泡排序 依次把大的数冒上去 O(n2) 稳定 插入排序 像打牌一样,依次增加有序部分 O(n2) 稳定 选择排序 依次选择剩下的数中最小的数,增加有序部分 O(n2) 稳定...原创 2019-01-05 10:39:47 · 91 阅读 · 0 评论 -
选择排序
思想:把未排序部分的最小值找出来,最小值与已排好序部分后面一个值交换位置代码实现:void selectSort(int num[], int len) { for (int i = 0; i < len; ++i) { int minIndex = i; for (int j = i + 1; j < len; ++j) minIndex = num[j...原创 2019-01-04 21:06:07 · 92 阅读 · 0 评论 -
归并排序
思想:把左边排序好,把右边排序好,再合并代码实现:void mergeSort(int num[], int len);void process(int num[], int L, int R);void merge(int num[], int L, int mid, int R);void mergeSort(int num[], int len) { process...原创 2019-01-04 20:52:21 · 104 阅读 · 0 评论 -
Morris遍历
Morris遍历简介: 一种利用二叉树中的空指针,实现的额外空间复杂度为O(1)的二叉树遍历方式Morris遍历流程:当前结点记做cur如果cur没有左孩子,cur右移,cur = cur->right; 如果cur有左孩子,找到cur结点左子树的最右结点,记为mostRight 如果mostRight的右指针指向NULL,将其指向cur, 且cur左移 如果mostRigh...原创 2018-11-06 11:59:06 · 98 阅读 · 0 评论 -
单调栈结构
用途:用于求一个数组中每个数,左右两边 大于或小于且离它最近的数,时间复杂度o(n)实现如:求一个数组中的数,左右两边离它最近且大于它的数实现方式:以求两边最近的大于它的数为例保持一个单调栈结构,栈底到栈顶数依次递减 新加入的数如果大于栈顶,栈顶弹出,弹出元素左边为现在的栈顶,右边为使他弹出的元素 新加入的数等于栈顶,栈顶元素的个数加一例题:leetcode84分...原创 2018-11-03 21:37:49 · 154 阅读 · 0 评论 -
KMP算法详解及时间复杂度分析
KMP算法用于判断一个字符串是否是另一个字符串的子串概念:字符串中一个字符前面的字符串分为前缀和后缀, 它的前缀与后缀的最长匹配长度注意:前缀与后缀不可以是整个子字符串例如:a b c a b c d , d位置的最长匹配长度为3,(前面的字符串为abcabc)abc与 abc匹配Next数组:长度与字符串长度一致,每个位置存储对应字符的最长匹配长度Next数组求解:...原创 2018-10-27 20:35:42 · 12042 阅读 · 1 评论 -
manacher算法详解
manacher算法用于 字符串预处理:aba 处理成 #a#b#a#,方便处理偶回文和奇回文,代码如下string manacherString(string original_str){ string res(original_str.size() * 2 + 1, ' '); int index = 0; for (int i = 0; i < res.size(); ...原创 2018-09-20 20:59:27 · 200 阅读 · 0 评论 -
窗口内最大值(或最小值)的更新结构
窗口:数组中的一段数L与R之间的数就是窗口内的数 L和R的初始位置为数组的左边,可表示为-1 L和R都只能右移,不可后退;且L不可超过R双向队列:既可以从头部弹出,也可以从尾部弹出的队列结构c++表示:deque<int> : double ended queue相关操作:push_back(), push_front() :从尾部和头部加数据, pop_bac...原创 2018-10-31 23:01:28 · 777 阅读 · 0 评论 -
堆排序算法详解
最大堆:每一个结点都比其子结点大的二叉树。堆排序思想:把所有数据建成一个最大堆,不停的把堆顶的元素取出来依次排列,取一个数之后,剩下的数要维持最大堆结构 那么堆排序主要分为建成最大堆 维持堆结构建最大堆 :时间复杂度为O(n)注意:在使用数组表示的堆结构中,结点arr[index]的父结点为arr[(index - 1) / 2].建堆思想: 把数组中的每一个数遍历一次,如...原创 2018-10-29 22:57:23 · 129 阅读 · 0 评论 -
快速排序详解
经典快排思想:取数组最后一个数x, 把小于等于x的数放左边,大于x的数放右边;对每个子区间重复这个过程。优化快排思想:取数组最后一个数x,把小于x的数放左边,等于x的数放中间,大于x的数放右边,子区间重复这个过程。时间复杂度:概率长期期望为nlog(n)随机快排:取划分的数x之前,随机把数组中的一个数与数组最后一个数交换。快排中的partition过程,有点像小于x的区间 ...原创 2018-10-29 21:56:15 · 124 阅读 · 0 评论 -
尼姆博弈
问题描述:有多堆物品,每堆多个物品;两人轮流从中取东西,规定每次只能从一堆中取出多于1个的物品,谁最后把物品取完,谁获得游戏胜利。问题答案:所有堆的物品数异或起来,结果为0,后手获得胜利;结果非0,先手获得胜利。例如,三堆物品分别有X、Y、Z件物品, 如果X xor Y xor Z == 0, 则后手获得胜利,否则先手获得胜利。问题证明:称所有堆的异或和为Nim和; Nim和为0为平衡...原创 2019-01-17 21:18:22 · 249 阅读 · 0 评论