ALgorithm
文章平均质量分 78
walker沃克
http://walkerdu.com
展开
-
分段有序数组合并成有序(空间复杂度为O(1))
题目描述:数组A,长度为n,其中A[0, m-1] 和 A[m, n-1],都分别有序。将其合并成有序数组A[0,n-1],要求空间复杂度为O(1)。现在的题目条件是数组分段有序,前后两部分已经有序,如果没有空间复杂度的限制,可以通过建立一个长度为n的空间,然后在O(n)时间内归并成一个有序的数组。(1)直接插入排序常见的比较排序算法我们都知道,我们知道在已经基本排序的基础原创 2013-05-28 11:30:44 · 3056 阅读 · 0 评论 -
字符串序列的全排列
我们都知道全排列的定义:字符序列的所有组合。它的递归定义如下:序列A = {a1, a2, a3, ... an} ,Ai = A - {ai},序列A的排列定义为Perm(A),Perm(A) = a1Perm(A1) , a2Perm(A2), a3Perm(A3)....anPerm(An);由上面的递归定义可知,全排列可由递归实现,代码如下:void Permutati原创 2013-05-29 17:20:29 · 1180 阅读 · 0 评论 -
统计一个文档中出现频率最多的k个单词的实现
这个问题我们应该经常会见到,想写这个问题是因为微软面试中,面试官问了这问题,而且要写代码,尼玛,最可恨的是不准用容器,哥当时就跪了。。。这个问题就是最常见的topK问题,解决思路:首先统计文档中所有不同word出现的频率,然后对所有不同的word按照出现频率排序,取出出现频率最大的k个words。1.统计文档中所有不同word出现的频率统计文档中word的频率的方法,要根据文档的数原创 2013-06-02 20:35:33 · 4039 阅读 · 0 评论 -
二叉排序树转换成排序的双向链表
题目描述:将二叉排序树转换成一个排序的双向链表,要求:不能创建任何新的节点,只能通过调整指针的指向来实现;解题思路:我们知道二叉排序树的递归定义是:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树;二叉排序树的一个很重要的特性就是:二叉树中序遍历的结果是一个递增的原创 2013-06-29 23:14:31 · 8904 阅读 · 1 评论 -
面试算法之链表操作集锦
链表操作在面试过程中也是很重要的一部分,因为它和二叉树一样都涉及到大量指针的操作,而且链表本身很灵活,很考查编程功底,所以是很值得考的地方。下面是本文所要用到链表节点的定义:template struct ListNode{ Type data; ListNode *next;};链表的创建可以采用下面的代码,采用尾插法进行链表的创建,返回的链表没有头节点:/** *原创 2013-09-04 21:24:34 · 3941 阅读 · 3 评论 -
面试算法之二叉树操作集锦
开学了,找工作也正式拉开了序幕,每天光自己看书,也很没劲,和大家一起分享分享,交流一下笔试面试过程中的各种算法题目,希望大家一起进步。。。下面是对数据结构二叉树的一些基本操作,可能在面试中都会涉及到。我们都知道二叉树的定义本身就是一种递归定义,所以对树的大部分操作都可以通过递归的方式进行,但递归不是万能的,因为递归的本身是一件很浪费内存资源的操作,所以在选择算法的时候要权衡各种因素,选取最合理原创 2013-09-03 17:41:54 · 3934 阅读 · 8 评论 -
面试算法之排序算法集锦
排序算法在面试过程中是经常会考的,这是很基础的,面试官觉得你应该很熟悉这些东西,如果你半个小时内写不出来,那基本就给跪了,因为这真的是狠基础狠基础的东西,所以我们得对一些基本的排序算法烂熟于胸,对这些排序思想,效率了如指掌,才能让面试官觉得你还行。基本的排序算法有:直接插入排序,冒泡排序,简单选择排序,shell排序,归并排序,快速排序,堆排序。其中归并,快速,堆排序是面试时候比较喜欢考的,因为这原创 2013-09-11 03:04:03 · 6960 阅读 · 17 评论 -
堆排序中建堆过程的时间复杂度O(n)的证明
下面是建立大根堆的代码template void CreateBigRootHeap(Type *array, int len){ int i, j, k; Type temp; for (i = (len - 1) / 2; i >= 0; --i) { temp = array[i]; k = i;原创 2013-04-16 15:38:26 · 23397 阅读 · 9 评论