
数据结构与算法
文章平均质量分 74
wolenski
这个作者很懒,什么都没留下…
展开
-
Dijkstra算法
/** * DIJKSTRA(简单版) 单源最短路径算法(不允许存在负边) * 输入:(1)图g; // 有向图或者无向图 * (2)源点s。 * 输出:(1)源点s到各点的最短路径长dist; * (2)源点s到各点的最短路径prev。 * 结构: 图g用邻接矩阵表示,最短路径长dist用数组表示。 * 算法:Dijkstra算转载 2012-09-06 10:16:46 · 989 阅读 · 0 评论 -
字符串匹配---Sunday算法
BM算法的改进的算法 Sunday AlgorithmBM算法优于KMP SUNDAY 算法描述:字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore)。两个算法在最坏情况下均具有线性的查找时间。但是在实用上,KMP算法并不比最简单的c库函数strstr()快多少,而BM算法则往往比KMP算法快上3-5倍。但是BM算法转载 2012-09-13 12:26:59 · 839 阅读 · 0 评论 -
从尾到头输出链表
题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下: struct ListNode{ int m_nKey; ListNode* m_pNext;};分析:这是一道很有意思的面试题。该题以及它的变体经常出现在各大公司的面试、笔试题中。看到这道题后,第一反应是从头到尾输出比较简单。于是很自然地想到把链转载 2012-08-17 16:17:40 · 364 阅读 · 0 评论 -
求二元查找树的镜像
题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。例如输入: 8 / \ 6 10 /\ /\5 7 9 11输出: 8 / \ 10 6 /\ /\11 9 7转载 2012-08-19 16:09:46 · 459 阅读 · 0 评论 -
二元树的深度
题目:输入一棵二元树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。例如:输入二元树: 10 / \转载 2012-08-17 16:19:30 · 392 阅读 · 0 评论 -
判断二叉树是不是平衡
题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。例如下图中的二叉树就是一棵平衡二叉树:bool IsBalanced(BinaryTreeNode* pRoot) { if(pRoot == NULL) return true; int left = Tr转载 2012-08-17 14:59:55 · 435 阅读 · 0 评论 -
在O(1)时间删除链表结点
题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};函数的声明如下:void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted);分析转载 2012-08-17 16:14:52 · 954 阅读 · 0 评论 -
二元树中和为某一值的所有路径
题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如输入整数22和如下二元树 10 / \转载 2012-08-19 20:45:03 · 346 阅读 · 0 评论 -
二元查找树的后序遍历结果
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果: 8 / \ 6 10 / \ / \ 5 7 9 11因此返回true。如果输入7、4、6、5,没有哪棵转载 2012-08-19 20:38:32 · 381 阅读 · 0 评论 -
两链表的第一个公共结点
题目:两个单向链表,找出它们的第一个公共结点。链表的结点定义为: struct ListNode{ int m_nKey; ListNode* m_pNext;};分析:这是一道微软的面试题。微软非常喜欢与链表相关的题目,因此在微软的面试题中,链表出现的概率相当高。如果两个单向链表有公共的结点,也就是说两个链表从某一结点开始,转载 2012-08-17 16:12:07 · 358 阅读 · 0 评论 -
01背包问题总结
转自 http://www.cppblog.com/jake1036/archive/2011/06/27/149566.html一 问题描述: 有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。 所谓01背包,表示每一个物品只有一个,要么装入,要么不装入。二 解决方案: 考虑使用d转载 2012-08-28 20:26:55 · 710 阅读 · 0 评论 -
二叉树两结点的最低共同父结点
题目:二叉树的结点定义如下:struct TreeNode{ int m_nvalue; TreeNode* m_pLeft; TreeNode* m_pRight;};输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点。 分析:求数中两个结点的最低共同结点是面试中经常出现的一个问题。这个问题至少有两个变种。 第一变种是二叉树是一种特殊的二转载 2012-08-21 20:22:56 · 741 阅读 · 0 评论 -
寻找丑数
题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第1500个丑数。分析:这是一道在网络上广为流传的面试题,据说google曾经采用过这道题。所谓一个数m是另一个数n的因子,是指n能被m整除,也就是n % m == 0。根据丑数的定义,丑数只能被2、3和5整除转载 2012-08-20 20:27:30 · 322 阅读 · 0 评论 -
旋转数组的最小元素
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。 分析:这道题最直观的解法并不难。从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N)。但这个思路没有利用输入数组的特性,我们应转载 2012-08-20 15:13:43 · 389 阅读 · 0 评论 -
找出有环链表中环的起点
问题: 给定一个有环的链表,写一个算法,找出环的起点。例如:输入:A->B->C->D->E->C[与前面的C是同一个节点]输出:C判断一个链表是否存在环有一个简单的方法,就是使用一个快指针、和一个慢指针,快指针每次走两步,慢指针每次走一步,则如果有环,它们最后必然会相遇的。本题的难点在于要找出环的起点。其实也不难,与判断是否有环类似,用两个步长分别为1和转载 2012-09-03 22:18:40 · 715 阅读 · 0 评论 -
数值的整数次方
题目:实现函数double Power(double base, int exponent),求base的exponent次方。不需要考虑溢出。分析:这是一道看起来很简单的问题。可能有不少的人在看到题目后30秒写出如下的代码:double Power(double base, int exponent) { double result = 1.0; f转载 2012-08-19 22:22:56 · 655 阅读 · 0 评论 -
Google2012面试题
1. 区间合并。比如[1, 3], [4, 9], [2, 3.5]合并成[1, 3.5], [4,9]同学写的代码#include #include #include using namespace std;bool cmp( pair a, pair b ){ return a.first < b.first;}vector > lineMerge(vec原创 2012-08-17 15:44:41 · 791 阅读 · 0 评论 -
无向连通图的广度优先遍历算法
图的广度优先算法是图的基本算法,也是最小生成树以及单源最短路径算法的基础。最近把广度优先遍历算法实现了一下,希望能够有比以前更深的体会或者加强一下对该算法的理解。前些天看了优米网上关于于丹做客在路上的一段视频,有一点心得体会。我很赞同于丹的观点,一个人的见识是十分重要的,所谓见识,从某一方面来理解,那就是要亲历亲为。对于算法这一门数学与编程并重的学科更是如此。 任何一种算法,都需要搞清楚转载 2012-09-03 10:08:06 · 5223 阅读 · 0 评论 -
Boyer-Moore(BM)算法学习
1、概述在用于查找子字符串的算法当中,BM(Boyer-Moore)算法是目前相当有效又容易理解的一种,一般情况下,比KMP算法快3-5倍。BM算法在移动模式串的时候是从左到右,而进行比较的时候是从右到左的。常规的匹配算法移动模式串的时候是从左到右,而进行比较的时候也是是从左到右的,基本框架是: j = 0;while(j for (i = 0;i转载 2012-09-13 10:15:47 · 1196 阅读 · 0 评论 -
将一个无符号整数的bit位逆序
http://www.leetcode.com/2011/08/reverse-bits.htmlThere are several methods of reversing the bits of an unsigned integer. Here, we devise an algorithm using the XOR swap trick, and then optimize转载 2012-09-13 15:03:54 · 2130 阅读 · 0 评论 -
寻找满足二叉查找树性质的最大子树
Given a binary tree, find the largest subtree which is a Binary Search Tree (BST), where largest means subtree with largest number of nodes in it.Note:In this post, we develop a solution to转载 2012-09-14 15:13:51 · 821 阅读 · 0 评论 -
将排序链表转为平衡二叉查找树
Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.If you have not checked out my previous post: Convert Sorted Array to Balanced Bina转载 2012-09-20 10:33:44 · 1707 阅读 · 0 评论 -
将排序数组转为平衡二叉查找树
Given an array where elements are sorted in ascending order, convert it to a height balanced BST.If you are having hard time in understanding my previous post: Largest Binary Search Tree (BST)转载 2012-09-20 10:32:07 · 1004 阅读 · 0 评论 -
数据结构之并查集
作者:Dong |可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址:http://dongxicheng.org/structure/union-find-set/1、 概述并查集(Disjoint set或者Union-find set)是一种树型的数据结构,常用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。2、 基本操作并转载 2012-10-12 09:27:54 · 1907 阅读 · 0 评论 -
找出二叉树中最大的二叉查找树部分
Given a binary tree, find the largest Binary Search Tree (BST), where largest means BST with largest number of nodes in it. The largest BST may or may not include all of its descendants.Note转载 2012-09-20 14:37:59 · 1122 阅读 · 0 评论 -
向环状链表插入元素
Given a node from a cyclic linked list which has been sorted, write a function to insert a value into the list such that it remains a cyclic sorted list. The given node can be any single node in the l转载 2012-09-19 23:09:06 · 811 阅读 · 0 评论 -
网易有道算法题
题目:给16个数字,1~16,每个数字都有一个出现的概率。然后随机选中一个数字,让你猜是选中的是哪个数字。猜的方法是,你可以给定一个数字的集合,对方告诉你选中的数在不在你给的集合里。求最差情况下最好的算法,还有期望最小的算法。这道题可以用赫夫曼编码做,根据数字出现的概率,进行编码。然后猜的时候,每次选择一颗子树,依次进行。赫夫曼编码的知识见《算法导论》16.3节关于Hu转载 2012-08-24 20:14:31 · 996 阅读 · 0 评论 -
整形数组,判断元素是否仅出现一次
发信人: zhuzhu2005 (永恒的猪肉卷), 信区: CoderInterview标 题: 整形数组,判断元素是否仅出现一次发信站: 水木社区 (Fri Jul 20 14:04:24 2012), 站内给定一个整形数组,长度为N。若元素范围为0到N-1且每个元素仅出现一次,则返回valid,否则返回invalid。要求时间复杂度O(n),空间复杂度O(1)。转载 2012-08-23 21:55:09 · 684 阅读 · 0 评论 -
有关蓄水池抽样(Reservoir Sampling)和自己的一些思考
转自http://handspeaker.iteye.com/blog/1167092最近在校论坛上看到了一个叫蓄水池(Reservoir Sampling )抽样的问题,感觉很有趣,记录如下:题目:要求从N个元素中随机的抽取k个元素,其中N无法确定。解法:Init : a reservoir with the size: k f转载 2012-08-24 16:37:06 · 639 阅读 · 0 评论 -
在两个排序数组中查找第k小元素
Find the k-th Smallest Element in the Union of Two Sorted ArraysJan 27, 2011 at 2:43 am in binary search by 1337c0d3r Given two sorted arrays A, B of size m and n respectively. Find the k-th转载 2012-10-09 10:50:11 · 2126 阅读 · 0 评论 -
将表达式转换成逆波兰式
一、题目◆3.21③ 假设表达式由单字母变量和双目四则运算算符构成。试写一个算法,将一个通常书写形式且书写正确的表达式转换为逆波兰式。实现下列函数:char *RPExpression(char *e);/* 返回表达式e的逆波兰式 */Stack是一个已实现的栈。可使用的相关类型和函数:typedef char SElemType; // 栈Stack的元素转载 2012-10-09 14:44:45 · 9209 阅读 · 0 评论 -
统计论坛在线人数分布
求一个论坛的在线人数,假设有一个论坛,其注册ID有两亿个,每个ID从登陆到退出会向一个日志文件中记下登陆时间和退出时间,要求写一个算法统计一天中论坛的用户在线分布,取样粒度为秒。解答:一天总共有 60*60*24 = 86400秒。定义一个长度为86400的整数数组int delta[86400],每个整数对应这一秒的人数变化值,可能为正也可能为负。开始时将数组元素都初始化为0。然转载 2012-09-04 09:59:19 · 1919 阅读 · 0 评论 -
没有重复字符的最长子串
转自leetcodeGiven a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for “abcabcbb” is “abc”, which the转载 2012-09-13 15:27:16 · 977 阅读 · 0 评论 -
冒泡排序的优化算法
/* *减少了冒泡排序外面的循环的次数,如果在第K项后没有产生交换, *则K项之后所有的项必定有序,如果k=0则说明整个数组都有序,则退出 */int* sort(int a[],int length){ int k=length-1,j,kk,temp; //k为最后一次调换的位置,kk为临时计数器 while(k>0) { kk=0转载 2012-08-29 21:49:44 · 722 阅读 · 0 评论 -
O(n)时间的排序---计数排序
题目:某公司有几万名员工,请完成一个时间复杂度为O(n)的算法对该公司员工的年龄作排序,可使用O(1)的辅助空间。分析:排序是面试时经常被提及的一类题目,我们也熟悉其中很多种算法,诸如插入排序、归并排序、冒泡排序,快速排序等等。这些排序的算法,要么是O(n2)的,要么是O(nlogn)的。可是这道题竟然要求是O(n)的,这里面到底有什么玄机呢? 题目特别强调是转载 2012-08-21 21:40:52 · 1667 阅读 · 0 评论 -
Huffman 编码压缩算法
作者:陈皓 | 来自:酷壳 - CoolShell.cn前两天发布那个rsync算法后,想看看数据压缩的算法,知道一个经典的压缩算法Huffman算法。你应该听说过David Huffman和他的经典的压缩算法——Huffman Code,这是一种通过字符出现频率,Priority Queue,和二叉树来进行的一种压缩算法,这种二叉树又叫Huffman二叉树 —— 一种带权重的转载 2012-09-14 19:44:56 · 840 阅读 · 0 评论 -
把二元查找树转变成排序的双向链表
题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。比如将二元查找树 10 / \转载 2012-08-21 15:48:49 · 382 阅读 · 0 评论 -
反转链表[递归,非递归]
题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。链表结点定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};分析:这是一道广为流传的微软面试题。由于这道题能够很好的反应出程序员思维是否严密,在微软之后已经有很多公司在面试时采用了这道题。为了正确地反转一个链表,需要调转载 2012-08-17 18:55:59 · 430 阅读 · 0 评论 -
对称子字符串的最大长度
题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。 分析:可能很多人都写过判断一个字符串是不是对称的函数,这个题目可以看成是该函数的加强版。 引子:判断字符串是否对称 要判断一个字符串是不是对称的,不是一件很难的事情。我们可以先得到字符串首尾两个字符,判断是不是相等。转载 2012-08-21 16:39:49 · 667 阅读 · 0 评论 -
字符串替换问题
Replace all occurrence of the given pattern to ‘X’.For example, given that the pattern=”abc”, replace “abcdeffdfegabcabc” with “XdeffdfegX”. Note that multiple occurrences of abc’s that are contiguo转载 2012-09-03 16:36:43 · 826 阅读 · 0 评论