
第一次写程序系列
lcxywfe
这个作者很懒,什么都没留下…
展开
-
小顶堆的C++实现
最小堆就一个特性,儿子比老子大,应该算是比较好实现的数据结构,一共就两个操作。插入:插入到树的最后,然后往上升删除:为了实现方便,普遍的做法是用最后一个node替换堆顶,然后把这个node往下降就行了。其他如建树,更新等操作都是这两个操作的组合。代码如下:#include #include using namespace std;class MinHeap{priv原创 2016-09-28 09:41:56 · 4677 阅读 · 2 评论 -
KMP算法 字符串匹配
用kmp算法实现字符串匹配,kmp算法的介绍int strStr(string haystack, string needle) { if (needle.size() == 0) return 0; vector<int> next(needle.size(), 0); for (int i = 2; i < next.siz原创 2017-05-26 16:50:29 · 430 阅读 · 0 评论 -
归并排序 C++
归并排序也没啥好讲的了,就是二分+merge,留下来以后copy用#include <iostream>#include <algorithm>#include <string>#include <vector>#include <random>using namespace std;void mergeSort(vector<int>& nums, int l, int r){原创 2017-05-26 10:46:09 · 570 阅读 · 0 评论 -
堆排序 C++
堆排序的的步骤(从小到大): 1. 先构建最大堆; 2. 维护一个tail,表示堆的底部,即数组中0-tail部分为堆,tail初始为nums.size()-1,tail之后的元素为已排好序的部分; 3. 将堆顶的元素与tail交换,tail减一,然后对堆顶的元素做一次down操作,重复这个步骤,直到tail为0;#include <iostream>#include <algorithm>原创 2017-05-26 14:17:27 · 322 阅读 · 0 评论 -
Add Digits (数根 digital root)
Given a non-negative integer num, repeatedly add all its digits until the result has only one digit.For example:Given num = 38, the process is like: 3 + 8 = 11, 1 + 1 = 2. Since 2 has on原创 2016-11-14 14:58:59 · 412 阅读 · 0 评论 -
Divide Two Integers题解以及类似题目的总结
Divide Two Integers题解以及类似题目的总结先说这道题29. Divide Two IntegersDivide two integers without using multiplication, division and mod operator.If it is overflow, return MAX_INT.思路很简单,原创 2016-10-13 11:18:24 · 515 阅读 · 0 评论 -
二叉查找树转双向链表
将一个二叉查找树转换成排好序的双向链表,不能创建中间节点,只能调整节点的指向struct HeadTail //head表示子树转换完成之后的链表头, tail表示链表尾{ Node* head; Node* tail; HeadTail() { head = NULL; tail = NULL; }};HeadTail convert(Node* root){ HeadTail result; if (root == NULL)原创 2017-02-14 13:11:24 · 289 阅读 · 0 评论 -
快速排序 c++
记录一下快排的不同写法,updating...#include #include using namespace std;class Solution {private: void swap(int& a, int &b) { int temp = a; a = b; b = temp; } int partition(vector& nums, int l,原创 2017-01-12 16:13:34 · 318 阅读 · 0 评论 -
链表与环的三个问题:判断是否有环,求环的长度,求环的起点
1. 判断单链表是否有环两个指针,一个快一个慢,快指针每次都每次走两步,慢指针每次走一步,如果两个指针相遇了,则说明有环,遇到NULL,则说明无环。2. 求单链表中环的长度还是原来的快慢指针,假设他们在p点相遇,相遇之后继续走,下一次相遇的的时候,快指针比慢指针多走的距离正好是环的长度。3. 求单链表中环的起点这个稍微复杂一下,我们假设链表的起点位点h,环的起点原创 2017-01-11 18:28:53 · 620 阅读 · 0 评论 -
约瑟夫环求解O(n)
1. 约瑟夫环问题:有n个人,编号从0到n-1,围成圈,从0开始报数,第m个人出列,然后继续从第m+1个人不断报数、出列,求最后剩下的人是哪个。2. 求解方案一:链表模拟,时间复杂度为O(nm),比较简单,就不赘述了。方案二:考虑n个人0, 1, 2, 3, ..., n-1,从0开始报数到m,所以编号为m-1的人出列。剩下m, m+1, m+2, ..., n-2,原创 2016-11-25 10:59:55 · 669 阅读 · 0 评论 -
SkipList 跳跃表
为什么选择跳表目前经常使用的平衡数据结构有:B树,红黑树,AVL树,Splay Tree, Treep等。 想象一下,给你一张草稿纸,一只笔,一个编辑器,你能立即实现一颗红黑树,或者AVL树出来吗? 很难吧,这需要时间,要考虑很多细节,要参考一堆算法与数据结构之类的树,还要参考网上的代码,相当麻烦。 用跳表吧,跳表是一种随机化的数据结构,目前转载 2016-11-11 17:09:18 · 287 阅读 · 0 评论 -
最长回文子串 manacher算法
求最长回文子串比较有名的一种算法,复杂度是O(n)的,(不要问我为什么是O(n))。思路:尽量利用到之前遍历得到的回文信息。 表示以i为中心,最长的回文子串的半径有多长,并保存当前的回文子串往右延伸,最长能延伸到哪,即p[i]+i的最大值,存为right,其回文子串的中心点存为index。 考虑当下标为i时,要求p[i]。有几种情况: 1. 当i > right时,超出了之前得到的信息的范围,原创 2017-05-18 21:07:35 · 313 阅读 · 0 评论