摘要: 题目:给出二叉树的一个结点,返回它中序遍历顺序的下一个结点。思路:如果有指向父亲的结点,则:如果当前结点有右儿子,或者当前结点是根结点,则后继结点为右子树的最左叶节点;否则,如果当前结点是父结点的左儿子,则后继结点就是父结点;(其实是第三种情况的一个特例,即自己是第0代祖先,返回第一代祖先)否则,向... 阅读全文
posted @ 2014-08-17 15:10 阿杰的专栏 阅读(3204) 评论(0) 推荐(0) 编辑
摘要: 题目:给定一棵二叉树,将所有的结点都放到左儿子的位置,即除了root结点外,每一个结点都是其他某一个结点的左儿子。不用保持某种顺序,不能递归,O(1)空间。思路:我的想法是,维持一个遍历指针p,另一个指针tail永远指向向左遍历到底的结点;初始化p和tail都为root,开始循环:如果p为叶子结点,... 阅读全文
posted @ 2014-08-17 10:50 阿杰的专栏 阅读(714) 评论(0) 推荐(0) 编辑
摘要: 反证法。素数的因式分解中,因子只有1和它本身。否则就是合数。假设素数是有限的,设为p1、p2、... 、pn,令px = p1 × p2 × ... × pn + 1,px除以任一个素数pi (1 <= i <= n) 的余数都是1,则px只能被1和其本身整除,px也是素数。与假设条件相矛盾,则素数... 阅读全文
posted @ 2014-08-17 10:13 阿杰的专栏 阅读(345) 评论(0) 推荐(0) 编辑
摘要: 题目:单链表的归并排序,返回排序后的链表。传统的归并都是数组,可以随机访问元素,链表则需要顺序遍历找中间结点。思路:设置两个指针,一个步长为1, 一个步长为2,当快指针到达尾结点时,慢指针指向中间结点,时间复杂度为O(N);平分为左链表L1和右链表L2,递归分裂,直到链表为空或者只有一个结点;将链表... 阅读全文
posted @ 2014-08-17 03:23 阿杰的专栏 阅读(9560) 评论(1) 推荐(1) 编辑
摘要: 原理和方法可以参考: 图的深度优先遍历教科书上的C代码,递归: 1 //教科书方法,邻接表 2 bool visited[MAX]; 3 void visitFunc(int v); 4 5 void dfsTraverse(Graph G) 6 { 7 for(v = 0; v vis... 阅读全文
posted @ 2014-08-17 02:57 阿杰的专栏 阅读(1398) 评论(0) 推荐(0) 编辑
摘要: 题目:给定一棵完全二叉树,返回最后一层的最右边的节点。思路:层次遍历,用一个last变量记录每次出队列的值,遍历结束之后last变量记录的就是所求节点。时间、空间复杂度都是O(N)。递归,求子树的高度:如果当前根节点为叶子节点,则返回;如果左子树高度>右子树高度,则在左子树继续递归过程;否则在右子树... 阅读全文
posted @ 2014-08-16 22:27 阿杰的专栏 阅读(3154) 评论(0) 推荐(0) 编辑
摘要: 题目:给定一个数组A,对于下标i 2 #include 3 using namespace std; 4 5 int maxDist(int num[], int n) 6 { 7 if(n left_min_pos(n, 0);11 int cur_min_pos = 0;... 阅读全文
posted @ 2014-08-16 21:48 阿杰的专栏 阅读(983) 评论(0) 推荐(0) 编辑
摘要: 快速排序的原理:首先找一个标兵值,等于某一个元素值;遍历数组,将数组分为小于标兵值和大于标兵值的两部分;然后分别对两个部分采用快速排序,递归。分开数组时,维持一个指针,指向已找到小部分的最后一个元素;一个指针用于遍历。不稳定排序算法。当数组已经有序时,时间复杂度最差,为O(N2),平均、最优情况下都... 阅读全文
posted @ 2014-08-11 23:07 阿杰的专栏 阅读(213) 评论(0) 推荐(0) 编辑
摘要: 归并排序的原理:如果数组的元素个数大于1,则: 将数组平均分为两部分; 左边的数组归并排序;递归 右边的数组归并排序;递归 将两个各自有序的数组合并,需要一个额外的辅助数组,暂时保存合并结果;返回否则,数组元素个数为1时,已经有序;直接返回。稳定排序。时间复杂度在最坏、最好、平均情况下都为O... 阅读全文
posted @ 2014-08-11 22:29 阿杰的专栏 阅读(246) 评论(0) 推荐(0) 编辑
摘要: 堆与堆排序的原理,参考该博客:白话经典算法系列之七 堆与堆排序二叉堆是个完全二叉树,可以用一个数组来保存节点,不会浪费空间,能快速定位;本人用一个vector来代替数组,省去自己对内存的分配/重分配和释放等操作。堆排序就是每次取出小顶堆的堆顶并输出,然后对堆重新调整。堆排序需要对数组先建堆【时间复杂... 阅读全文
posted @ 2014-08-07 11:27 阿杰的专栏 阅读(321) 评论(0) 推荐(0) 编辑
摘要: 题目:给定一个数组,找出其中和为0的所有4个数组合,每个组合内的4个数非递降。解法:①先排序,然后利用4个指针,前两个遍历,后两个在第二个指针之后的部分里夹逼,时间O(N3)。②或者利用一个哈希表先保存每两个数的和,然后类似于查找两个数的和等于给定值的过程。代码:① 1 class Solution... 阅读全文
posted @ 2014-06-03 23:26 阿杰的专栏 阅读(160) 评论(0) 推荐(0) 编辑
摘要: 题目:给定一个数组,和一个指定的值,找出数组中3个数,它的和最接近这个指定值,并返回这个和。解法:和上一题找3个数的和为0一样,先排序再遍历,这一次不需要记录路径。代码: 1 class Solution { 2 public: 3 int threeSumClosest(vector &n... 阅读全文
posted @ 2014-06-03 23:12 阿杰的专栏 阅读(106) 评论(0) 推荐(0) 编辑
摘要: 题目:给定一个数组,找出其中和为0的所有3个数的组合。每个组合的3个数都是非递降的。解法:先排序再遍历,设置3个指针,第一个依次遍历,第二三个在第一个指针后面的部分里,左右夹逼查找和为第一个数的相反数的组合。时间O(N2)。代码: 1 class Solution { 2 public: 3 ... 阅读全文
posted @ 2014-06-03 23:05 阿杰的专栏 阅读(283) 评论(0) 推荐(0) 编辑
摘要: 题目:给定一系列的字符串,找出这些字符串的最长公共前缀。解法:暴力法,依次比较每个字符串的每个字符,碰到第一个不同的就返回之前找到的前缀。代码: 1 class Solution { 2 public: 3 string longestCommonPrefix(vector &strs) {... 阅读全文
posted @ 2014-06-03 16:33 阿杰的专栏 阅读(101) 评论(0) 推荐(0) 编辑
摘要: 题目:将罗马数字转换为整数。解法:可以参考上一篇数字转换为罗马数字的规则。代码: 1 class Solution { 2 public: 3 int sym2int(char sym) //罗马数字字符与数字的对应关系 4 { 5 switch(sym) 6... 阅读全文
posted @ 2014-06-03 16:25 阿杰的专栏 阅读(129) 评论(0) 推荐(0) 编辑
摘要: 题目:将整数转换为罗马数字。罗马数字规则可以参考: 维基百科-罗马数字解法:类似于进制转换,从大的基数开始,求整数对基数的商和余,来进行转换。代码: 1 class Solution { 2 public: 3 string intToRoman(int num) { 4 s... 阅读全文
posted @ 2014-06-03 16:17 阿杰的专栏 阅读(108) 评论(0) 推荐(0) 编辑
摘要: 题目:x轴上有一些点,每个点上有一条与x轴垂直的线(线的下端就是这个点,不超出x轴),给出每条线的高度,求这些线与x轴组成的最大面积。解法:贪心策略,维持两个指针,分别指向第一个和最后一个元素,对于其中小的一个,它所能围成的最大面积就是到另一个元素之间,所以小的一个要往中间走一步。代码: 1 cla... 阅读全文
posted @ 2014-06-03 12:28 阿杰的专栏 阅读(122) 评论(0) 推荐(0) 编辑
摘要: 题目:正则表达式的匹配,'.'能匹配任何一个字符,'*'之前必须有一个字符,两个结合起来表示之前那个字符出现0到无穷次。解法:一定要注意'*'必须结合前面的字符一起使用。代码: 1 class Solution { 2 public: 3 bool isMatch(const char *s... 阅读全文
posted @ 2014-06-02 23:16 阿杰的专栏 阅读(308) 评论(0) 推荐(0) 编辑
摘要: 题目:判断一个数字是不是回文数字,即最高位与最低位相同,次高位与次低位相同,...解法:求出数字的位数,然后依次求商和求余判断是否相等。代码: 1 class Solution { 2 public: 3 bool isPalindrome(int x) { 4 if(x =... 阅读全文
posted @ 2014-06-02 22:23 阿杰的专栏 阅读(155) 评论(0) 推荐(0) 编辑
摘要: 题目:字符串转换为数字。解法:这道题的意思是要考虑到,如果有前置的空字符,则跳过;如果超出数字范围,则返回最大/最小整数;如果碰到第一个不能转换的字符,则返回。代码: 1 class Solution { 2 public: 3 int atoi(const char *str) { 4 ... 阅读全文
posted @ 2014-06-02 22:06 阿杰的专栏 阅读(288) 评论(0) 推荐(0) 编辑