自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

shiqi,bao的博客

关注算法,软件

  • 博客(82)
  • 资源 (1)
  • 收藏
  • 关注

转载 最小生成树算法和单源最短路径算法

Prim和Dijkstra算法的区别 一、原文: http://www.cnblogs.com/huiliu/archive/2011/04/15/2017228.html在图论中,Prim算法是计算最小生成树的算法,而Dijkstra算法是计算最短路径的算法。二者看起来比较类似,因为假设全部顶点的集合是V,已经被挑选出来的点的集合是U,那么二者都是从集合V-U中不断的挑选权值最低的点加入U,那

2016-07-28 11:10:41 907

原创 数组数字之和

3Sum:给定一个数组,找出3个数字和为0的所有组合比如: For example, given array S = [-1, 0, 1, 2, -1, -4],A solution set is: [ [-1, 0, 1], [-1, -1, 2] ] 算法:排序数组,固定num1,首尾指针找num2,num3.如果和小于0,首指针向前,如果和大于0,尾指针向后。 ps:se

2016-07-28 09:27:41 984

原创 线索二叉树

除了完全二叉树,树存储结构会存在大量的空指针结点,这样造成了存储空间的浪费。 线索二叉树就是在空的左右结点分别存放其前驱和后继,并且使用的是中序遍历。使用中序遍历是因为序列由一些叶节点隔开,空指针分布很均匀。 使用线索二叉树可以快速定位结点。

2016-07-27 21:42:40 226

原创 kmp算法

1、kmp最重要的部分 next数组。得到next数组后,匹配过程中源字符串不需要回溯,只在上次匹配时第一个不相等的位置上继续。模式串按照next数组回溯。 2、源字符串和模式字符串第一位保存的都是数组长度,字符下标都是从1开始。 3、next数组获取方法:在某一位置时,之前字符串的前缀和后缀相等的最大长度+1就是next数组保存的值 a b c a c 0 1 1

2016-07-23 16:38:56 211

原创 文章标题

根据前序和中序遍历重建二叉树class Solution {public: TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { if(preorder.size() == 0 || inorder.size() == 0) return NULL; in

2016-07-22 10:30:33 233

原创 红黑树

红黑树满足如下性质:1、每个结点要么是红的要么是黑的。 2、根结点是黑的。 3、每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。 4、如果一个结点是红的,那么它的两个儿子都是黑的。 5、 对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。 引理:一颗有 n 个内结点的红黑树的高度至多为 2lg(n+1)。旋转:旋转的目的是让树保持红黑树的特性。

2016-07-21 23:52:28 326

原创 指针

int(*(*F)(int,int))(int)F是一个函数指针,指向的函数的类型是有2个int参数并且返回一个函数指针的函数。返回的函数指针指向有一个int参数并且返回int 的函数。数组指针int (*ptr)[] 指针数组 int ptr[] ,int (ptr[])

2016-07-20 21:12:23 216

原创 C++设计语言三大难点

预处理问题、const问题、sizeof问题 1、宏定义 #define (1) 简单的宏定义:define <宏名> <字符串>例: #define PI 3.1415926 (2) 带参数的宏定义define <宏名> ( <参数表>) <宏体>在使用简单宏定义时,当字符串中不只一个符号时,加上括号表现出优先级;如果是 带参数的宏定义,则要给宏体中的每个参数加上括号,并在整个宏体上再加一个

2016-07-20 15:36:05 392

原创 C和C++的关系

1、在C++程序中调用被C编译器编译后的函数,为什么要加extern C? 算法:C++支持函数重载而C不支持。编译后函数名是不同的。比如某函数原型void foo(int x, int y)。被C编译器编译后库中的名字是foo,但是C++会带有参数类型等,foo_int_int。 C++提供了C的连接交换指定符号extern解决名字匹配问题2、头文件中的ifndef/define/endif干

2016-07-19 20:19:43 229

原创 图和树

给定二叉树前中序遍历构造二叉 二叉树高度(最小深度、二叉搜索树判断、对称判断、平衡判断) 二叉树与链表转换 无向图复制 直角路线遍历棋盘1、根据遍历序列,重建二叉树 算法: 1、通过前序或者后序序列,找到根。 2、在中序序列中分开成左子树和右子树。 3、继续递归左子树,右子树

2016-07-19 20:11:50 2490

原创 链表

重点:链表的插入与(懒)删除 链表翻转 单链表找环及起点和环长度 两个链表找交点 复制带有随机指针的链表 链表partition过程1、单链表翻转,链表反转 算法:把当前节点作为反转链表的头结点,然后当前节点继续向前移动。 //反转后的结果链表头结点 ListNode* resHead; //直到节点处理完,为空后,循环结束 while(head){

2016-07-17 23:31:28 202

原创 栈和队列

在树形数据结构中,可以用栈代替DFS,队列代替BFS1、元素出入顺序合法性判断 模拟一个堆栈,验证出栈顺序是否能由入栈顺序得出。2、用两个队列实现一个栈 队列只可能是先进先出,所以每次出栈的操作都需要把有数得队列n-1存在另一个队列中,然后再将剩余的1个弹出队列。入队的时候将数插入到有数的队列中。 总结一下,就是始终保持一个队列为空,另一个队列存放数据。有需要操作出栈的时候,交换队列使用。3、

2016-07-17 18:05:09 213

原创 数组

1、一个各不相同元素的数组,求它的一个局部最小值。 局部极小值的定义为:一个值比左右相邻的值都小。算法:如果o(n)遍历的话很容易求得一个全局最小值。当然是局部最小值。也可以用二分查找算法,局部最小值一定在两个波峰之间。规定数组两端都是正无穷,那么局部最小值一定在两个波峰之间。可以比较mid与mid+1,如果小于mid+1那么mid+1就是一个波峰,局部最小值在mid前半部分;如果大于mid+1,

2016-07-16 23:35:57 222

原创 字符串

例1、把一个0,1字符串进行排序,可以交换任意两个位置,问交换的次数最少多少? 算法:是一个类似于partition的过程,使用两个数组指针,找到尾部指针是0且首部指针是1的情况才能交换一次。class Solution {public: int get01swaptimes(vector<int>nums) { if(nums.size() == NULL)

2016-07-16 21:25:49 375

原创 水库采样

题目:流入若干个对象(整数,按个数流入),事先不知道个数。如何保证随机抽取k个数?算法: 1、新建一个k位数组。 2、如果i<=k ,num[i] = x 如果i>k,num[rand()%i] = x可以证明此算法是等概率的,每个数会进入数组的概率都是k/n

2016-07-16 15:21:33 1989

原创 随机数发生器

题目: 给定一个可以均匀构造1-7的随机数发生器rand7(),要求构造一个rand10()随机产生1-10算法分析: 随机数发生器问题本质上就是等概率问题,要求函数产生一定范围内的数且都是等概率产生的。本质上就是用原来的随机发生器产生数字,扔掉部分没有用的数字。方法1:基本思路,将任何的随机数发生器改造成0,1随机数发生器,有了二进制位,就可以产生一切数字。1、使用rand7(),产生1-7,

2016-07-16 11:44:51 855

原创 生成模型、判别模型

1、生成模型: 由数据学习联合概率分布,然后根据联合分布求得条件概率分布作为预测的模型 关心的是X和Y的生成关系 eg 朴素贝叶斯,HMM 2、判别方法: 由数据直接学习决策函数或者条件概率分布作为预测模型 关心的是给定X输出什么样的Yeg 决策树,lr,svm区别:存在隐变量的同时,仍然可以使用生成模型。 但是判别模型准确率更高因为直接学习的就是f

2016-07-13 18:43:45 320

原创 损失函数、正则化、交叉验证

期望风险或期望损失:是真实的,需要x,y的联合概率分布相乘 经验风险或经验损失:机器学习问题不可能已知x,y的联合概率分布,如果已知的话,那么x得出y就很容易了。那么根据大数定理可以使用1/n*损失函数来代替期望风险,得出经验风险。结构风险最小化:是带正则项的经验风险最小化。 经验风险最小化容易带来模型复杂度过高,过拟合问题正则化: 是结构风险最小化策略的实现。正则化项一般是模型复杂度的单调递

2016-07-13 15:43:40 1986

原创 pagerank

PageRank算法[编辑] 简易版本[编辑] 假设一个由4个网页组成的群体:A,B,C和D。如果所有页面都只链接至A,那么A的PR(PageRank)值将是B,C及D的Pagerank总和。PR(A)=PR(B)+PR(C)+PR(D){\displaystyle PR(A)=PR(B)+PR(C)+PR(D)} PR(A)=PR(B)+PR(C)+PR(D) 继续假设B也有链接到C,并且

2016-07-13 13:04:22 328

原创 tf-idf

希望关键词是在一类文章中出现的次数尽可能多,在其他类文章中出现尽可能少。tf = 一个词在一类文章中出现的次数/这类文章总次数(在一类文章中出现的次数尽可能多) idf = 文章总数/包含这个词的文章数(在其他类文章中出现尽可能少。)得出的tf*idf越大,则说明越有可能是关键词

2016-07-13 12:04:32 225

原创 二叉树非递归遍历

二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一

2016-07-13 11:40:01 364

原创 类型转换问题

1、混合类型算数表达式 目标转换类型最宽,将其余数据提升类型int ival = 3;double dval = 3.14;ival + dval;ival被提升至3.02、用一种类型表达式赋值给另一类型对象,包括表达式传递给函数,函数返回值等。 决定于目标变量的类型,对赋值变量就行截取总结如下 1、防止精度损失,如果有必要,类型总是被提升为较宽的类型。 2、如果没有long doubl

2016-07-13 11:05:58 278

原创 文章标题

有一个已经排序的数组(升序),数组中可能有正数、负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现 例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4。算法: 1、二分法找一个数,比较前后两个数字是否异号,如果是就找到了分界点 2、如果不异号,数字大于0向前查找,小于0向后查找,等于0 return 0

2016-07-13 10:15:51 166

原创 二叉树的最小深度

题目:最小深度指的是根节点到叶节点的最短距离算法: 1、根为空 return 0 2、左右都不为空,那么递归并取左右子树的最小深度值+1 3、右子树为空,左子树不空,递归取左子树的最小深度值 左子树为空,右子树不空,递归取右子树的最小深度值+1 4、如果左右都为空,return 1class Solution {public: int minDepth(TreeNode* roo

2016-07-13 09:29:38 241

原创 正则表达式匹配

题目描述请实现一个函数用来匹配包括’.’和’‘的正则表达式。模式中的字符’.’表示任意一个字符,而’‘表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但是与”aa.a”和”ab*a”均不匹配算法: 从模式字符串开始,并始终保存上一个字符。 1、如果两个字符相等,那么i++,j++ 2、

2016-07-12 23:17:39 207

原创 构建乘积数组

题目描述给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…A[i-1]*A[i+1]…*A[n-1]。不能使用除法。算法: 新的数组内是原数组所有数的乘积,但是除了第i位。设数组内有五个数,新建两个变量或者数组。 第一个不断向前迭代累乘n-1次: 1,a[0],a[0]a[1],a[0]a[1]a[2],a[0]a[1]a[

2016-07-12 21:59:30 177

原创 数组中重复的数字

题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。class Solution {public: // Parameters: // number

2016-07-12 20:45:00 233

原创 atoi字符串转整数实现

算法: 从首开始,将每一位字符转成数字(使用-‘0’),然后乘10累加。边界条件很复杂: 1、正负数判断,正负符号判断 2、是否在0~9之间的字符 3、是否超过了int的上下限class Solution {public: int StrToInt(string str) { if(str.size() == 0) return 0;

2016-07-12 20:01:09 588

原创 不用加减乘除做加法

题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。算法: 5的二进制位 : 101 7的二进制位:100011、将数异或(半加) 10101 2、将数按位与 1 3、只有在某个位上按位与后结果是1,才说明数之间是1和1相加,应该进位,那么将与的结果左移1位得出进位后的结果。 4、将异或结果和与结果相加。class Solution {public:

2016-07-12 17:52:37 174

原创 不用循环实现累加

题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。算法: 使用递归算法,那么一定需要终止条件和重复函数。其实是需要if else来判断终止的。但是可以使用Bool变量来代替if else。 使用函数指针来求解,一个指向终止条件,一个指向循环函数。最终如果n=0了,那么调用终止函数。//声明函数指针方法

2016-07-12 17:40:41 2197

原创 约瑟夫问题

题目: 0-n个人围成一圈走,数m个数,数到m-1的人出列,问最后一个人是几号算法: 使用环形链表解决问题struct ListNode{ int val; ListNode* next; ListNode(int x){val = x;next = NULL;}};class Solution {public: int LastRemaining_Sol

2016-07-12 16:05:10 207

原创 扑克牌顺子

题目描述: 从扑克牌中随机抽取五张牌,判断是不是一个顺子。大小王看成0算法: 1、排序数组 2、判断0的个数,因为大小王可以任意配 3、判断后续数字是否有间隔,计算出间隔数 4、判断0的个数和间隔数的大小比较 o(nlogn)class Solution {public: bool IsContinuous( vector<int> numbers ) { if

2016-07-12 14:23:44 304

原创 题复习

一、判断一个自然数N是否是某个数的平方,如果是,找到。算法: 1、O(n) 遍历从1到N的数字,求取平方和并和N比较。如果小于则继续向前遍历;如果等于,则成功返回;如果大于,则失败退出。class Solution {public: int GetPowNumber(int N){ if(N < 1) return 0; for (

2016-07-12 13:58:24 227

原创 n个骰子的点数和

题目: 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出S可能出现的所有的值的概率。算法: 递归:使用排列组合思想,将n个骰子所有可能的值相加起来。然后把每种S保存在哈希表中记录次数。

2016-07-12 11:30:10 298

原创 翻转字符串问题

1、翻转句子问题 输入一个英文句子,翻转句子中单词的顺序,但单词内顺序不变。例如 I am a Student,翻转后Student a am I算法: 先把每一个单词全翻转 I ma a tendutS 然后再全翻转 Student a ma I2、部分翻转,字符串左旋即把字符串的若干字符(k)转移到字符串尾部。 算法与上一致,将前k个字符后后边字符分别全翻转,然后再全翻转。 ab

2016-07-12 00:20:55 264

原创 和为S的连续正数序列

题目 输入一个正整数S,打印出所有和为S的连续序列,至少包含两个数。 例如输入15,则1,2,3,4,5和4,5,6和7,8都是结果序列。算法: 因为所求序列是连续的递增序列,所以需要前后指针包含的是连续的数据。 Big指针在前,当和小于target时继续向前增加数字;small在后,当和大于target时向前减少数字。边界条件:因为结果数组必须包含两个数字以上,所以small<(s+1)/

2016-07-11 22:18:00 366

原创 有序数组问题的思考

1、可以使用二分法来实现各种需求 2、可以使用首尾指针来实现各种需求。想到再补充

2016-07-11 21:22:00 296

原创 数组中只出现一次的数字

题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。算法: 如果一个数组里只有一个数字出现了一次,其余数字都出现两次的话,可以直接使用异或方法。因为异或就是相同为0,不同为1。对于此题使用异或最合适,出现两次的数最后对结果都是0没有贡献,留下的数字就是出现一次的数字。题目中是有两个数字出现一次,可以通过一次异或的结果将数组拆成两个子数组。方法是找到异

2016-07-11 21:04:02 234

原创 二叉树的深度,平衡二叉树深度

题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。算法: 1、如果树为空,则深度为0 2、如果树不是空,那么深度是左子树的深度+1或右子树的深度+1.class Solution {public: int TreeDepth(TreeNode* pRoot){ if(pRoot==NULL)

2016-07-11 19:26:20 3360

原创 数字在排序数组中出现的次数

二分查找算法可以用来在排序数组中快速查找一个数字。题目描述统计一个数字在排序数组中出现的次数。算法: 最简单的算法o(n) 因为题目是排序数组,所以自然想到二分查找算法。 第一轮,找到指定数字第一次出现的位置。找到指定数字后,要判断前边的数字是不是k,如果不是则说明这个位置的k是第一次出现的,如果仍然是k则继续向前寻找。 第二轮,找到指定数字最后一次出现的位置。找到k后,要判断后边的数字是不

2016-07-11 17:58:24 207

minst手写识别数据集

可与我的博客CNN 学习笔记1 对照看

2016-07-10

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除