算法
lda_ming
这个作者很懒,什么都没留下…
展开
-
已排序数组求和等于输入数字
题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。 例如输入数组1、2、4、7、11、15 和数字15。由于4+11=15,因此输出4 和11。 分析:已升序排序数据只需设置头尾两个指针,两者之和比数字大则尾部向前移,小则头部向后移,如果相等则记录数值,然后同时移动原创 2015-03-19 13:15:42 · 474 阅读 · 0 评论 -
约瑟夫环问题
考虑n个数,编号从0开始到n-1,第一次删除第K个数后,剩下n-1个数,从k+1开始,可标记数组为:k,k+1,k+2......n-2,0,1,2,3......k-2 可以重新标记,把第K个数标记为第0个数,有对应关系 k,k+1,k+2......n-2,0,1,2,3......k-2 0,1 ,2 .。。。。。。 n-2 即变成了n-1个人原创 2015-03-24 15:26:33 · 264 阅读 · 0 评论 -
求单链表倒数第K个节点
题目:输入一个单向链表,输出该链表中倒数第k 个结点。链表的倒数第0 个结点为链表的尾指针。 分析:只需要设计两个步长为K的指针,移动到末尾,后面的指针记录的就是第K个节点,时间复杂度是O(n),需要移动2n-K次 Node *findNode(Node * head,int k) { Node *pcur,*pK; pcur=head; pK=head;原创 2015-03-18 10:53:29 · 346 阅读 · 0 评论 -
二叉查找树镜像翻转
题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。 分析:递归方法只需要遍历二叉树对遇到的节点交换左右即可,非递归可用栈遍历 //递归程序 void reverseTree(TreeNode *root) { if(root==null) return; Tree原创 2015-03-23 13:14:49 · 411 阅读 · 0 评论 -
在二元树中找出和为某一值的所有路径
题目:输入一个整数和一棵二元树。 从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。 打印出和与输入整数相等的所有路径。 例如输入整数22 和如下二元树 10 / \ 5 12 / \ 4 7 则打印出两条路径:10, 12 和10, 5, 7。 分析:需对树进行深度遍历,记录深度遍历过程中走过的路径的值的和,走到叶子节点判断是否与输入一致,如一致则打印原创 2015-03-12 15:27:35 · 286 阅读 · 0 评论 -
快速排序算法实现
分析:快排是比较经典的排序算法,算法思路是每一趟排序根据一个数组中的参考值划分成比参考值大的和比参考值小的两部分数组,,再分别对这两个数组划分,直到有序。每次划分能确定参考值的位置。算法最小时间复杂度O(nlog(n)),当数组原来就有序的时候退化成O(n*n) 代码: #include //递归算法 int partion(int *a,int low,int high) {原创 2015-03-30 17:42:45 · 360 阅读 · 0 评论 -
求子数组的最大和
.求子数组的最大和 题目: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2, 因此输出为该子数组的和18。 分析:子串从左向右移动,求和,当和小于原创 2015-03-11 13:15:34 · 246 阅读 · 0 评论 -
二叉树转双向链表
1. 把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该转换成个排 序的双向链表。中序遍历 要求不能创建任何新的结点,只调整指针向。 10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16 思路:只需要按照中序遍历,然后对左右指针指向进行原创 2015-03-10 13:28:09 · 347 阅读 · 0 评论 -
二叉树最大距离
问题描述: 给出一棵二叉树,求二叉树上最远的两个节点的距离 分析: 最长距离即两个节点间经过的路径最长,可以把问题分解为每个节点的左子树的最大深度与右子树的最大深度之和的最大值,保留这个最大值并对比各节点的最大值即可得出 //递归算法如下: int max=0; int depth(Node *root) { if(root->left==null && root->rig原创 2015-03-17 17:24:17 · 427 阅读 · 0 评论 -
二元树按层打印每个节点
输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。 例如输入 8 / \ 6 10 / \ / \ 5 7 9 11 输出8 6 10 5 7 9 11。 分析:其实就是树的广度遍历,可使用队列,按层入栈 代码如下: void widthvisit(TreeNode * root) { deque dp=new ();原创 2015-03-20 13:12:36 · 302 阅读 · 0 评论 -
计算正整数1到N中出现的1的个数
题目:1到N中,出现的1的个数 分析:编程之美上面的题,整理一下记录下来 假设1到某个数12x01,设百位上的数字出现1的次数,假设百位上的数字x=0,百位上出现1的情况由100-199,1100-1199,2100-2199 3100-3199,......11100-11199,,总共1200个,当前位的高位为12,有12*100。假设x=1,百位上出现1的次数除了100-199....原创 2015-03-27 16:42:55 · 651 阅读 · 0 评论 -
链表是否相交,链表是否有环问题
1、一个单链表,判断是否有环,环的入口节点 分析: 两个指针,慢指针一次走一步,快指针一次走两步,如果有环肯定会相交 listNode *pNode; bool isExistloop(listNode *head) { listNode *low,*fast; low=head; fast=head; while(fast原创 2015-03-16 12:56:45 · 332 阅读 · 0 评论 -
跳台阶问题
题目:一个台阶总共有n 级,如果一次可以跳1 级,也可以跳2 级。求总共有多少总跳法,并分析算法的时间复杂度。 分析: 假设n=1时,只有一种可能,即f(1)=1,n=2,有两种跳法,f(2)=2,n>2时,可从最后结果倒推回去,f(n)的前一步可能是1级,也可能是两级,可倒推回去上一次跳1级,剩余的级数是f(n-1),上一次跳2级,剩余级数是f(n-2);则有f(n)=f(n-1)f(n原创 2015-03-26 13:23:29 · 296 阅读 · 0 评论 -
链表逆序,单向链表
问题描述:一个单向链表,把逆转链表,要求算法非递归 问题分析:也就是把指针指向翻转过来,从头部开始,需要记录前一指针、当前指针和下一个需要逆转的节点 void reverseList(listNode *head) { pPre=null; pCur=head; pnext=head->next; while(pNext) { pCur原创 2015-03-16 13:12:19 · 302 阅读 · 0 评论 -
字符串旋转&数字中1的个数
1、假设有字符串abcdefg,现要左旋转两位 变成 cdefgab,程序实现 分析:假设只有两个数xy,旋转一次变成yx,再旋转一次变回xy,可发现一个字符串如果旋转两次则变回原顺序,由此,可分别对两个子串进行旋转,然后再对整个串进行旋转,则两个子串还是原来的顺序,而达到旋转的目标。步骤如下:1,旋转ab,得到bacdefg,2、旋转后半个子串,变成bagfedc,,3、旋转整个串得到cdef原创 2015-03-25 16:30:05 · 348 阅读 · 0 评论