摘要:
题目 输入一个正整数数组,将他们连接起来排成一个数,输出所有排出的数字中最小的一个。例如:输入数组[32,321],输出所能排出的最小数为:32132.请给出该问题的算法。 分析 对于元素位置排列的问题,如a,b,我们希望找到一种排列规则,来确定我们所要得到的是a,b还是b,a. 题目要求得到所能排 阅读全文
摘要:
题目 用非递归的方法完成二叉树的前序、中序、后序、分层遍历 分析 1. 二叉树的前序遍历 在遍历的过程中子树的根节点需要返回来再用到一次(查其右子树),需要将遍历的根节点暂时保存起来。可以用栈来实现根节点的暂存 1 void PrintTreeInPreOrder1(TreeNode* root) 阅读全文
摘要:
题目 已知一个二叉树的前序和中序遍历数组,构建这个二叉树。如已知前序为:abcdf,中序为:cbdaf,可以构建出这个二叉树为 a / \ b f / \ c d 分析 已知前序和中序排列或者已知后序和中序排列,思路都是通过前序或者后序确定树或子树的根节点,通过中序找到根节点所在的位置; 中序的根节 阅读全文
摘要:
二分查找思想就是取中间的数缩小查找范围,对应不同的题目变形,在取到中间数mid确定下一个查找范围时也有不同,左边界有的low=mid+1,也可能low=mid,右边界有的high=mid-1,也有可能high=mid。 对于一个排序数组来说二分查找的时间复杂度是O(logn) 1. 二分查找法 1 阅读全文
摘要:
题目 给定一个二叉树,任意两个节点之间必然是有一条路径相通的,假定父节点和它的孩子节点的距离为单位1,求二叉树中相距最远的两个节点间的路径长度 分析 这是一个简单的动态规划问题,假设某个节点node,到它的最低叶节点的长度为len(node),所求的最长路径必然经过一个最高节点high_node, 阅读全文
摘要:
题目 给定一棵树,同时给出树中的两个结点(n1和n2),求它们的最低公共祖先。 分析1 最直观的想法是判断某节点的左子树和右子树如果分别包含一个节点n1或n2,也就是一边一个,那该节点就是他们的最低公共祖先。可以用递归的方式依次判断左右子树求解 代码 1 TreeNode* FirstCommonP 阅读全文
摘要:
1 快速排序 http://blog.csdn.net/morewindows/article/details/6684558 这篇博客介绍的非常清晰易懂了。主要就是挖坑,填坑+分治法策略。笔者这里就只贴出代码来 1 void QuickSortCore(int arr[],int start,in 阅读全文
摘要:
题目 求一个数组中所有的逆序对数,如数组arr[]={5,2,4,9,8,6,13,14},逆序对有5,2; 5,4; 9,8; 9,6; 8,6; 逆序对数为5 分析 因为数组不是排序的,所以要找一个元素后面所有比它小的数,最直观的想法是依次遍历后续的元素。这样做的时间复杂度为O(n). 除此之外 阅读全文
摘要:
题目 给定一个字符串,求其中所有的对称子串 分析 对称字符串无非两种情况,一是以1个字符为中心对称,如"abcba",一是完全对称,如"abccba"。对于字符串对称的判断,从内往外查找比较方便 代码 1 int SymmtricSubStrings(char* str,vector<string> 阅读全文
摘要:
题目 给定一个大小为n的数组,要求写出一个算法,求其最长的等差数列的子序列 分析 该题需要分几种情况考虑。 1. 原数组是有序的,所要求的的子序列可以不连续。 对于数组arr[],不同的等差值d=1,2,3,4,5```(arr[max]-arr[min])可以求出不同的最长等差数列,然后在这些等差 阅读全文