随笔分类 - 基础算法
摘要:判断两个树是否相等1.如果传进来的两个指针都是NULL,那么return true,代表相同。2.如果传进来的两个指针一个是NULL一个不是NULL;或者两个都不是NULL,但是它们的value值不相等,return false。3.通过上面的判断可以确定:两个节点都不是NULL,并且两个节点的值相...
阅读全文
摘要:约瑟夫环是这样的描述:有n个孩子围坐成一圈,编号为0~n-1。现在让这些孩子报数,从0~m-1依次报数。报到m-1的孩子退出圈。求最后留在圈里的孩子。下面直接看这个问题的数学解法:上面的数学推到已经完成了,所以代码实现://n代表有多少人在玩这个游戏//m代表报数的范围是0~m-1int LastR...
阅读全文
摘要:打印字符串的全排列算法的思路:把一个字符串分成两部分,第一个字符+后面部分所有的字符。这样就能够递归的求解整个过程了:1.每个字符都做一次首字符2.当某个字符作为首字符的时候,求后面所有字符的全排列而这里的求后面所有字符的全排列可以看成递归的子问题全排列的递归树:但是这里还有一个问题,那就是字符串中...
阅读全文
摘要:对于数组,{5,7,6,9,11,10,8}它是某一个二查搜索树的后序遍历序列,这棵树的样子:通过上面的例子可以看出二查搜索树的后序遍历序列的特征是:1.序列的最后一个节点是二查搜索树的根节点2.序列的前半部分是二查搜索树的左子树,并且都比根节点要小3.序列的后半部分是二查搜索树的右子树,并且都比根...
阅读全文
摘要:二叉树的深度对于二叉树的深度的求解,利用递归的方式求解很简单:下面就来设计这个递归算法:要求一个节点的高度,先求左子树的高度,然后再求解右子树的高度。最后树的高度就是1+max(left_depth, right_depth)。int leftLen = depth_tree(root->left)...
阅读全文
摘要:字符串的匹配先定义两个名词:模式串和文本串。我们的任务就是在文本串中找到模式串第一次出现的位置,如果找到就返回位置的下标,如果没有找到返回-1.其实这就是C++语言里面的一个函数:extern char *strstr(char *str1, const char *str2);对于这个函数的解释:...
阅读全文
摘要:链表的回文检测有关链表的回文检测,用到的就是链表操作中常常用到的双指针的方法,找到链表的中点位置,然后依次对比两边的结点。但是在找链表的中点的时候要注意链表的总个数是偶数或者奇数的两种情况。1.找链表的中点位置,并把中点以前的各个结点的值存入到栈中。2.针对偶数或者奇数个链表结点,对中点结点做一个小...
阅读全文
摘要:链表逆序给定一个链表,一般的逆序的方法要设置三个指针,这种操作很繁琐,下面总结一种简单的方法:为链表设置一个头结点,然后head后面的节点依次的插入到head结点之前。最后完成链表的逆序。代码实现:ListNode* reverseList(ListNode* head) { ...
阅读全文
摘要:问题描述:给定一个数组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]。不能使用除法这里如果直接每次的计算乘积的话,时间复杂度为O(n2),所以可以使用动态规划的思想,保存中...
阅读全文
摘要:固定字符串的第一个不重复的字符有关这个题目可以有很多的考察方式,但是本质的一个方法就是利用Hash表,来降低时间复杂度。先看第一个题目,给定一个字符串,找到这个字符串的第一个不重复的字符:在一个字符串(1= 0) { hash_table[ch] = -2; ...
阅读全文
摘要:根据抽到的5张扑克牌,判断是不是顺子。注意:大小王可以随便的代替任何的牌。bool IsContinuous( vector numbers ) { int i = 0; int length = numbers.size(); if(length numberOfZero ? false...
阅读全文
摘要:翻转小段单词其实翻转字符串能够通过多次的字符串的逆序实现,这里主要学习一下,怎么提取每一个英语单词,然后分别对其逆序。string ReverseSentence(string str) { int size = str.size(); char *pFirst = &str[0...
阅读全文
摘要:问题描述:求一个字符串的最长回文子串,返回这个子串。这个题目适合用动态规划的方式求解:代码实现:string longestPalindrome(string s) { int size = s.size(); int dp[1000][1000] = {0}; int left = 0; int ...
阅读全文
摘要:数组元素分割,就是说把整个的数组分成两部分,前半部分具有哪些性质,后半部分具有哪些性质。题目描述:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n)。这里对数组的分块,很容易的就联想到了快速排序中对数组的划分,从开头找一个具有...
阅读全文
摘要:题目描述:统计一个数字在排序数组中出现的次数。这个问题的初始解法就是,在排序的数组中利用折半查找,这个k之后,然后以这个为中心,分别向左右遍历,统计k出现的次数。这种方法虽然利用了折半查抄,使得定位这个元素的时间复杂度为O(logn),但是在以这个元素为中心左右查找的时候,时间复杂度又降低为了O(n...
阅读全文
摘要:给定一个序列,判断这个序列是不是一个合法的栈序列输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列...
阅读全文
摘要:快速排序每一趟比较用时O(n),要进行lgn次比较,才最终完成整个排序。所以快排的复杂度才为O(n*lgn)。而本节,我们要讲的是堆排序算法。据我所知,要真正彻底认识一个算法,最好是去查找此算法的原发明者的论文或相关文献。一、堆排序算法的基本特性时间复杂度:O(nlgn) //等同于归并排序最坏:O...
阅读全文
摘要:重写幂次函数pow(double base, int exp);首先要写一些测试用例:1.base=0时,exp0时,直接计算base的|exp|次幂。代码实现:double myPow(double x, int n) { if(equalZero(x, 0.0) && n -delt)) { ...
阅读全文
摘要:两个有序链表的合并对于两个有序链表合并成一个新的有序链表的代码很简单,但是要注意一些测试用例:比如说一个为空链表;两个链表不一样长,肯定最后有一个链表要单独的挂到结果链表中去的。 ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if(l...
阅读全文
摘要:部分有序的旋转数组旋转数组起始就是数组元素的循环左移或者循环右移。例如:{3,4,5,1,2}为{1,2,3,4,5}的一个旋转数组。旋转数组是在非降序数组的基础上得到的,所以数组原本应该是有序的。有序数组到旋转数组如果真的利用循环左移或者循环右移来实现旋转数组,那么将有大量的元素要移动,所以一个好...
阅读全文