随笔分类 -  算法&&数据结构

摘要:镜像——照镜子得出的像。特征就是左右反着,如下图思路仿着递归遍历,递归得到镜像输入结点指针p不为空且部位叶子,反转p的左右孩子找p的左孩子的镜像找p的右孩子的镜像参考代码void getImage(BinaryTreeNode *root){ if(root != NULL && root->m_pLeft != NULL && root->m_pRight != NULL) { BinaryTreeNode *temp = root->m_pLeft; root->m_pLeft = root->m_pRight; root-&g 阅读全文
posted @ 2014-03-22 17:42 jihite 阅读(1132) 评论(0) 推荐(0) 编辑
摘要:题目输入两颗二叉树A和B,判断B是否是A的子结构,例如下图中B是A的子结构 A B参考代码1bool IsPartTree(TreeNode *root1, TreeNode *root2){ if(root1 == NULL... 阅读全文
posted @ 2014-03-22 17:12 jihite 阅读(1176) 评论(2) 推荐(0) 编辑
摘要:1. n!int f(unsigned int n){ if(n == 0 || n == 1) return 1; else return n*f(n-1);}分析:计算N的阶乘需要进行N次乘法运算,因此时间复杂度为O(N) 阅读全文
posted @ 2014-03-21 23:59 jihite 阅读(474) 评论(0) 推荐(0) 编辑
摘要:示例思路一:两个链表同时逐个遍历参考代码ListNode* combinList(ListNode *head_1, ListNode *head_2){ ListNode *head_3 = NULL; if(head_1 == NULL) { head_3 = head_2; } else if(head_2 == NULL) { head_3 = head_2; } else { ListNode *p1 = head_1; ListNode *p2 = head_2; ... 阅读全文
posted @ 2014-03-18 23:21 jihite 阅读(697) 评论(2) 推荐(1) 编辑
摘要:案例数组内容:3 4 4 6 8 2 1 1 1调换奇偶:3 1 1 1 8 2 4 4 6思路源于快速排序方式1参考代码#include #include using namespace std;bool IsOdd(int num){ return num % 2 == 1 ? true ... 阅读全文
posted @ 2014-03-18 10:51 jihite 阅读(4463) 评论(2) 推荐(0) 编辑
摘要:比如n = 2那么从1一直输出到99分析直接输出,遇到大数时肯定有问题,比如n=100,存储100位的数据类型不存在。可以利用数组来存储大数,比如n=100,可以开辟个数组 char a[101]思路一模拟现实中的技术方式,逢九进一参考代码#include #include using namespace std;bool minuxOne(char *a, int *end_index, int size){ if((*end_index == size - 1 && a[size - 1] == '0') || *end_index = size) retu 阅读全文
posted @ 2014-03-18 10:08 jihite 阅读(2859) 评论(0) 推荐(0) 编辑
摘要:传值操作#include using namespace std;struct ListNode{ int m_nValue; ListNode* m_pNext;};void createList(ListNode *head){ head = new(ListNode); head->m_nValue = 1; head->m_pNext = NULL;}void deleteList(ListNode *p){ ListNode *next = NULL; while(p != NULL) { cout m_nValue m_... 阅读全文
posted @ 2014-03-16 17:46 jihite 阅读(564) 评论(0) 推荐(0) 编辑
摘要:题目给定单链表头指针和一个结点指针,定义一个函数在O(1)时间内删除该结点。分析对于上图实例链表(a)删除指针p有两种方式思路1:(b)找到前一个指针pre,赋值pre->next = p->next,删掉p思路2:(c)目的是删除p,但是不删p,直接用p->next的值赋值给p,把p->next删除掉(好处:不用遍历找到p的前一个指针pre,O(1)时间内搞定)于是,定位到思路2,但是思路2有两个特例:删除的是尾指针,需要遍历找到前一个指针整个链表就一个结点(属于删尾指针,但没法找到前面的指针,需要开小灶单独处理)大体算法思路待删指针不是尾指针: 待删指针的值用待删指 阅读全文
posted @ 2014-03-16 17:06 jihite 阅读(5728) 评论(3) 推荐(1) 编辑
摘要:原理先看个例子,存储字符串abc、ab、abm、abcde、pm可以利用以下方式存储 上边就是Trie树的基本原理:利用字串的公共前缀来节省存储空间,最大限度的减少无谓的字串比较。应用 Trie树又称单词查找树,典型的应用是用于统计,排序和保存大量的字符串(不仅用于字符串),所以经常被搜索引擎系统用于文本词频的统计。设计 trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点... 阅读全文
posted @ 2014-03-15 15:58 jihite 阅读(12834) 评论(0) 推荐(2) 编辑
摘要:实现函数 double Power(double base, int exponent),即乘方运算。考虑问题exponet using namespace std;bool InvalidInput = false;bool equal(double val1, double val2){ if((val1 - val2 -0.0000001)) return true; else return false;}double Power(double val, int exponent){ InvalidInput = false; if(... 阅读全文
posted @ 2014-03-13 08:10 jihite 阅读(1713) 评论(0) 推荐(0) 编辑
摘要:需求今天写了三千二百行代码。今天写了3200行代码。两行意思相同,只是表达方式不太能够,统一掉。原理数字的特征是 数字 + 单位,例如三百,四十二,九千零二可以从后往前遍历,遇到的是0到9的数字,就乘以前一位的单位,遇到新的单位(十百千万)就替换成数字供下一个数字用。举例五百四十三1. 三-->3 3 10, 10 ≥10,且不为0 : r = 103. 四-->4, 4100, 10 0≥10,且不为0 : r = 1005. 五-->5, 5= 10 and i == 0: #应对 十三 十四 十*之类 if val > r: ... 阅读全文
posted @ 2014-03-07 19:54 jihite 阅读(19420) 评论(5) 推荐(1) 编辑
摘要:例如8314925去掉4个数,留下125最小,注意有前后顺序要求,要是没有顺序当然是123。解决方案贪心算法,在每次被访问的位置保证有最优解。思路一分析:求一共n位,求其中的m位组成的数最小。那么这个m位的数,最高位应该在原数的最高位到第m位区间找,要不然就不能当第m位了,如下图(得到3位数最小,要是百位数在25中找,就当不了百位数了): 同样找十位数时只能在百味数到目前位置中间搜,整个过程图示如下: 注意在区间有多个最小值,取距离最大的,保证下一位数有足够大的查找空间。参考代码#include #include #include using namespace std;int *q;... 阅读全文
posted @ 2014-03-05 18:07 jihite 阅读(5057) 评论(10) 推荐(4) 编辑
摘要:假设数组是从小到大排序,数值可能为负数、0、正数。思路一可以一次性遍历一遍,找出绝对值最小值,此时时间复杂度为O(N),缺点是没有利用数组是有序的这一特点。思路二数组有序,可以利用二分查找的特性。中间的数是正数,往后找;中间的数是负数,往前找。问题的本质是找到正数的最小值,或负数的最大值,分析以下集中情况数组为a[], 数组大小为n.n=1,没有商量的余地,直接返回a[0] * a[n-1] >= 0,说明这些元素同为非正或同为非负。要是a[0]>=0,返回a[0];否则返回a[n-1]a[0] * a[n-1] =0说明a[mid]也为非正,缩小范围low=mid;如果a[mid 阅读全文
posted @ 2014-03-02 10:23 jihite 阅读(5887) 评论(5) 推荐(0) 编辑
摘要:冒泡排序需要重复的遍历未最终未排好序的元素序列,依次比较两个相邻的元素,如果顺序不对就把这两个元素换过来;否则接着往后遍历,最终把最大的元素放到最后,就象一个起泡一样,最终浮到上游。图示说明最后一个元素就不用了,一个元素一定有序。最终需要定型的位置j从后到前的顺序是[size-1, 1],每次从前往后的顺序访问的位置i范围是[0, j-1]。代码#includeusing namespace std;int BubbleSort(int a[], int size){ for(int j = size - 1; j >= 1; --j) { for(int i =... 阅读全文
posted @ 2014-02-24 23:38 jihite 阅读(415) 评论(0) 推荐(0) 编辑
摘要:案例数列3, 2, 3, 1, 3, 3, 2, 3中,3就是个数大于总数大于一半的元素。思路一对数列排序,再扫描一边,找出元素个数超过一半的元素。此时需要排序,同时需要记录每个元素出现个数,费时、费空间。思路二 对于排好序的数列,假设总数为N,那么N/2位置的那个数必定为所求之数,这就不需要记录每个元素的个数。思路三 对于数列,不用排序。对于其中的任意两个不同的元素,去除之后,原来那个个数大于总数一半的元素个数仍然是大于剩下元素的一半的。利用该特性遍历一遍数列就可以找出这个总数大于一半的那个元素。 具体的实施,不用每次去这些数中去找不同的两个数,只需记录当前候选目标值can,与此对应的... 阅读全文
posted @ 2014-02-23 23:41 jihite 阅读(2265) 评论(2) 推荐(1) 编辑
摘要:行文脉络解法一——除法解法二——移位解法三——高效移位解法四——查表扩展问题——异或后转化为该问题对于一个字节(8bit)的变量,求其二进制“1”的个数。例如6(二进制0000 0110)“1”的个数为2,要求算法效率尽量高。解法一对于二进制数来说,除一个2,就少一位,可以判断这个少的位来确定“1”... 阅读全文
posted @ 2014-02-23 16:32 jihite 阅读(4416) 评论(5) 推荐(0) 编辑
摘要:问题(假定根节点位于第0层)1. 层次遍历二叉树(每层换行分开)2. 层次遍历二叉树指定的某层例如上图中1.12 34 5 67 82.第三层7 8可以看出得出第二问的解,第一问迎刃而解了,所以从问题二下手分析与解1. 层次遍历二叉树指定的某层可以得出这样的一个结论:遍历二叉树的第k层,相当于遍历二... 阅读全文
posted @ 2014-02-20 23:58 jihite 阅读(13826) 评论(1) 推荐(4) 编辑
摘要:问题定义把二叉树看成一个图,父子节点之间的连线看成是双向的,定义“距离”为两个节点之间的边数。例如下图中最大距离为红线的条数为6.分析定义:过以节点x作为根节点的子树中,节点间的最大距离为Dis(x)。上图,左图中Dis(根节点)最大,右图中Dis(根节点->left)最大。从上边可以看出每个节点都可能成为最大距离根节点的潜质。因此可以求出每个Dis(节点),从中得出最大值即为整个二叉树的根节点最大值。在求过点x的最大距离时,最大距离的两个点有可能出现在三种情况下左子树右子树过节点x经分析得出以下特点以上三种情况最终必定一叶子结束在第三种情况下必然是左子树高度 与 右子树高度 之和(只有 阅读全文
posted @ 2014-02-19 00:45 jihite 阅读(6062) 评论(1) 推荐(0) 编辑
摘要:基本思想 把n个元素的数列分成有序(前)和无序(后)的两部分 每次处理就是将无序的数列中第一个元素与有序数列的元素从后到前比较,找到插入位置,将该元素插入到有序数列的适当的最终的位置上(稳定排序)。 参考代码一 连续交换的时候相当于整体后移,把做比较元素放到最终位置上,修改如下。 参考代码二 运行结 阅读全文
posted @ 2014-02-17 22:28 jihite 阅读(15529) 评论(4) 推荐(0) 编辑
摘要:归纳优点:比较次数少、查找速度快、平均性能好缺点:待查找表为有序表、插入删除困难时间复杂度:O(logN)实用场景:有序数组思路假设表为升序排列,中间元素和待查元素比较,如果中间元素和待查元素相等找到了;如果小于则在前半段找;否则在后半段找。递归int BiSearch(int *a, int be... 阅读全文
posted @ 2014-02-14 23:29 jihite 阅读(1072) 评论(0) 推荐(0) 编辑