数据结构与算法
文章平均质量分 85
数据结构与常用算法知识
第2梦
阳光下灿烂,风雨中奔跑!
展开
-
随机数问题
一、用随机函数构造另一个随机函数比如,有这样一个需求,现在有一个rand5()函数,这个函数可以生成1-5的随机数,让你通过这个函数生成1-7范围的随机数。怎么做了? 一般思路是这样的:用两次rang5函数,通过这两次rand5结果,构造出一个随机数范围包括0-7,但比0-7大的范围就好了。比如(rand5 -1)*5 +rand5,它的范围为1-25(包括0-7),因为rand5产生每个数随机概原创 2017-02-28 12:55:00 · 1116 阅读 · 0 评论 -
二叉树-常见简单算法题
二叉树,对一些常见的简单算法题,比如翻转二叉树,求高度,判断是否是相等的二叉树等,我们是必须掌握的!!!原创 2017-02-19 01:02:10 · 2581 阅读 · 0 评论 -
二叉树-详解二叉排序树
一、二叉搜索树首先二叉排序树也是一棵二叉树,所谓二叉树,就是“任何节点最多只允许两个子节点”,这两个子节点称为左右子节点。如下便是一个二叉树。 1.1、二叉排序树性质:1、就是若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 2、若它的右子树不空,则右子树上所有节点的值均大于其根节点的值。 3、换句话说就是:任何节点的键值一定大于其左子树中的每一个节点的键值,并小于其右子原创 2016-10-14 01:06:42 · 93180 阅读 · 15 评论 -
位运算技巧与应用
位运算是把数字用二进制表示之后,对每一位上的0或者1的运算。运算包括与、或、异或,非。熟练掌握位运算技巧,能给我们解决问题提供一些巧妙的方法。原创 2017-02-16 17:47:28 · 3762 阅读 · 0 评论 -
常用算法-回朔法
1、概念回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。许多复杂的,规模较大的问题都可以使用回溯法,有“通用原创 2017-02-18 23:46:23 · 3230 阅读 · 0 评论 -
二分查找实现及其应用
二分查找,应用广泛,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如果x<a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x>a[n/2],则我们只要在数组a的右半部继续搜索x。原创 2017-02-16 15:16:40 · 3082 阅读 · 0 评论 -
二叉树-创建、重建、转化
对于二叉树的创建女,一般我们只熟悉最简单的二叉树创建方式,即逐个输入节点,然后按照先序遍历或者中序、后序遍历方式来递归建立二叉树。但是,光掌握这个是不够的,我们还得掌握二叉树的重建(先序中序重建二叉树,后序中序重建二叉树),数组转换为二叉树,链表转换为二叉树等等。1、最简单的创建方式我们可以根据先序遍历递归创建二叉树,当然也可以中序或者后序遍历方式创建二叉树。//创建二叉树BTress Creat原创 2017-02-15 23:25:13 · 2946 阅读 · 0 评论 -
二叉树-遍历终极版
对于二叉树的遍历,最熟悉的就是递归遍历了,对二叉树的非递归遍历大致知道一些,但是不太熟悉,尤其是后续非递归遍历的实现,一直比较懵逼,于是上网查询了一下,果然大神无处不在,那个后序遍历的双栈法,简直让人拍案叫绝,下面总结下。原创 2017-02-16 00:25:13 · 2723 阅读 · 0 评论 -
LeetCode-String To Integer
拿到这道题不要一分钟就写出了如下代码,int myAtoi(string str) { int num=0; int i=0; for(int i=0;i<str.size();i++) { num=num*10+str[i]-'o'; } return num;}好简单啊,真有这么简单吗,当然不是啦!得考虑如下几点:原创 2015-12-02 10:03:37 · 816 阅读 · 0 评论 -
LeetCode-Palindrome Number
什么是回文数字:就是正着看和反着看是一样的数字,就是回文数字,比如:1234321,45654是回文数字,而1234这样的就不是回文数字。代码(72ms):bool isPalindrome(int x) { if(x==0) //0也是回文数字 { return true; } else原创 2015-12-02 10:49:26 · 763 阅读 · 0 评论 -
LeetCode-Longest Substring Without Repeating Characters
题目:给一个字符串,找出没有重复的最长字串方法一:int lengthOfLongestSubstring(string s) { if(s=="") { return 0; } map mymap; int p1=0,p2=1; //两个指针 int longthest=1; //最长的 mymap.insert(pair(s[p1],p1)); while(p2原创 2015-12-03 15:57:13 · 789 阅读 · 0 评论 -
LeetCode-TwoSum
题目:给一串数字和一个目标数字,在数字串中寻找两个数加起来等于目标数字的数,返回其下标。方法(12ms):vector twoSum(vector& nums, int target) { vector oldvector=nums; //保存一份原始vector int low,high,mid; int num1=0,num2=0; int index1=0,index原创 2015-12-05 10:08:49 · 808 阅读 · 0 评论 -
LeetCode-Add Two Numbers
题目:给出两个数字,他们是反向保存在链表中的,计算两个数的和,也反向保存在链表中返回。方法:我开始想到的就是先将链表中的数字还原,然后相加,再反向保存到链表中,很是麻烦。这就是常规思路,总想着数字都是从左到右相加有进位的向左边进位,其实可以摆脱常规,数字从左向右相加也可以的,有进位就向右进位。代码:ListNode* addTwoNumbers(ListNode* l1, Li原创 2015-12-06 13:19:41 · 822 阅读 · 0 评论 -
LeetCode -Longest Common Prefix
代码最简洁的:string longestCommonPrefix(vector& strs) { if(strs.size()==0) return ""; for(int i=0;i<strs[0].size();i++)//每一字符串位置下标 for(int j=1;j<strs.size();j++)//第几个字符串 if((i>=strs原创 2015-12-07 11:00:18 · 843 阅读 · 0 评论 -
LeetCode-Remove Nth Node From End of List
方法一:先计算出链表总的节点数,再找要删除的节点ListNode* removeNthFromEnd(ListNode* head, int n) { if(head==NULL) return NULL; int count=0; ListNode *tempNode1=head,*tempNode2=head; wh原创 2015-12-07 21:43:34 · 909 阅读 · 0 评论 -
常用算法-分治法
基础知识1. 分治法的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解。2. 满足分治策略的条件:1) 该问题缩小到一定规模就可以解决;2) 该问题可以分解为若干个规模较小的相同的问题,即该问题具有最优子结构;3) 利用该问题分解出的子问题可以合并为该问题的解;原创 2016-03-28 21:00:20 · 2058 阅读 · 0 评论 -
图文并茂,再次温顾七大排序算法
1、插入排序1.1、 算法原理插入排序的基本方法是:每步将一个待排序序列按数据大小插到前面已经排序的序列中的适当位置,直到全部数据插入完毕为止。 假设有一组无序序列 R0, R1, … , Rn−1: 1、 将这个序列的第一个元素R0视为一个有序序列; 2、 依次把 R1, R2, … , Rn−1 插入到这个有序序列中; 3、 将Ri插入到有序序列中时,前 i-1 个数是有序的,将原创 2016-10-14 01:30:30 · 2572 阅读 · 0 评论 -
哈希表一
一、定义哈希表(散列表)通过将关键码映射到表中的某个位置上来存储元素,然后根据关键码来访问元素。具体来说,就是在关键字 k 和元素的存储位置 p 之间建立一个对应关系 f ,使得 p=f(k) , f 称为哈希函数 。创建哈希表时,把关键字为 k 的元素 直接存入地址为 f(k) 的单元 ;以后当查找关键字为 k 的元素时,再利用哈希函数计算出该元素的存储位置 p=f(k) ,从而达到按关键 字直接原创 2016-12-16 10:04:33 · 504 阅读 · 0 评论 -
递归原理及常见应用
一、什么是递归递归算法,就是直接或间接调用自身的函数,也就是把一个大的复杂的问题层层转换为一个小的和原问题相似的问题来求解的这样一种策略。上面解释可能有点太官方了,来看看知乎上大神的通俗易懂的解释:解释一“古之欲明明德于天下者,先治其国;欲治其国者,先齐其家;欲齐其家者,先修其身;欲修其身者,先正其心;欲正其心者,先诚其意;欲诚其意者,先致其知,致知在格物。物格而后知至,知至而后意诚,意诚而后心正,原创 2016-11-09 21:37:12 · 3877 阅读 · 0 评论 -
数据结构-链表篇
链表作为数据结构主要组成部分之一,在面试中也是主要考点,花了几点时间把LeetCode上的链表的题做了一下,发现还是有规律可循的,特此总结下!原创 2016-10-30 13:01:09 · 4962 阅读 · 1 评论 -
二叉树-详解平衡二叉排序树AVL
平衡二叉搜索树AVL也许因为输入值不够随机,也许因为输入顺序的原因,还或许一些插入、删除操作,会使得二叉搜索树失去平衡,造成搜索效率低落的情况。 比如上面两个树,在平衡树上寻找15就只要2次查找,在非平衡树上却要5次查找方能找到,效率明显下降。那么什么叫“平衡”,直观上的最佳平衡条件就是 每个节点的左右子树有着相同高度,但这确实太过苛刻。平衡二叉树AVL tree退而求其次,要求任何节原创 2016-11-19 14:06:55 · 3997 阅读 · 2 评论