
数据结构与算法设计
用心倾听
程序狂 爱逗你玩
展开
-
算法趣题 : 检测玻璃瓶的强度
Description :对玻璃瓶做强度测试,设地面高度为0,从0 向上有n 个高度,记为1,2,…,n,其中任何两个高度之间的距离都相等。如果一个玻璃瓶从高度i 落到地上没有摔破,但从高度i+1落到地上摔破了,那么就将玻璃瓶的强度记为i。Question :1) 当玻璃瓶的数量足够多时,需要测试多少次??【Hint:二分测试,肯定O(logn)的】2) 当玻璃瓶的数量为转载 2012-10-18 07:59:15 · 2215 阅读 · 0 评论 -
蛇形矩阵
题目大意是这样:输入:2输出矩阵:1 24 3输入:3输出矩阵:1 2 38 9 47 6 5输入4:输出矩阵:1 2 3 412 13 14 5 11 16 15 610 9 8 7#include#include using namespace原创 2016-04-14 17:07:58 · 489 阅读 · 0 评论 -
关于reverse_iterator
这个reverse_iterator曾经搞得我头大,其对应的函数也是那么的可不理解...现在一切都好了.对于left_null>1->2->3->4->right_null,这样一个有4个元素(1,2,3,4)的链表.1->2->3->4->尾listiteraotr c1=intList.begin() // *c1=1;listiteraotr c2=intL转载 2016-04-15 22:17:36 · 414 阅读 · 0 评论 -
唯品会在线编程:爱情数字,动态规划
与0-1背包问题不同之处在于:同一个数字可以取多次。动态规划算法的关键是找出状态及状态转移关系,如下:原创 2016-04-16 11:36:33 · 809 阅读 · 1 评论 -
最长回文子序列:字符串反转+动态规划,最长公共子序列LCS算法
题目思想大概是这样:cabbeaf:回文子序列有:c,a,aa,bb,,aba,abba,e,f,最长的就是abba,所以输出长度为4#include #include #include int dp[1000][1000];using namespace std;int main(){//思路就是求这个原字符串和它反转字符串的最长公共子序列 string str; cin转载 2016-04-15 17:12:06 · 1920 阅读 · 1 评论 -
二分搜索算法(递归和非递归实现)
//循环迭代方法int binIteration(int a[],int low,int high,int key){ if(low>high) return -1; if(a[high] key) return -1; while(low<=high){ int mid=(low+high)/2; if(a[mid] == key) return mid; else if(原创 2016-04-16 19:59:01 · 1883 阅读 · 0 评论 -
最长递增子序列O(NlogN)算法(leetcode 300. Longest Increasing Subsequence )
最长递增子序列,Longest Increasing Subsequence 下面我们简记为 LIS。排序+LCS算法 以及 DP算法就忽略了,这两个太容易理解了。假设存在一个序列d[1..9] = 2 1 5 3 6 4 8 9 7,可以看出来它的LIS长度为5。下面一步一步试着找出它。我们定义一个序列B[1..9],然后令 i = 1 to 9 逐个考察这个序列。此外,转载 2016-04-16 21:06:45 · 4975 阅读 · 2 评论 -
算法:求比指定数大且最小的“不重复数”问题的高效实现
问题:给定任意一个正整数,求比这个数大且最小的“不重复数”,“不重复数”的含义是相邻两位不相同,例如1101是重复数,而1201是不重复数 ——引自百度2014校招笔试题目题解http://www.cnblogs.com/pmer/p/3351466.html#!comments问题的提法: 为代码简便,将问题等价地改为,求大于等于指定正整数的不重复数。由fi转载 2016-04-21 16:42:42 · 1163 阅读 · 0 评论 -
数轴上从左到右有n个点a[0],a[1]…,a[n-1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点。要求算法复杂度为o(n)。
数轴上从左到右有n个点a[0],a[1]…,a[n-1],给定一根长度为L的绳子,求绳子最多能覆盖其中的几个点。要求算法复杂度为o(n)。#include using namespace std;int maxCover(int* a, int n, int l){ int maxCover = 1; int begin = 0; int end转载 2016-04-21 16:34:51 · 3067 阅读 · 1 评论 -
B树、B-树、B+树、B*树
B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right); 2.所有结点存储一个关键字; 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树; 如: B树的搜索,从根结点开始,如果查询的关键字与结点的关转载 2016-05-17 22:28:35 · 646 阅读 · 0 评论 -
判断一个树是否为另一个树的子树
root1表示树1的根节点,root2表示树2的根节点。判断树2是否是树1的子树,是返回1,不是返回-1。子树不同于树的一部分。#include#include#include#includeusing namespace std;struct tnode{ int value; tnode*left; tnode*right;};//在树中寻找节点nodetnode原创 2016-04-22 18:02:10 · 2232 阅读 · 2 评论 -
从一道百度面试题到分析输入url到页面返回的过程(或者查询返回过程)
最近看到一个题目,是当在浏览器中输入一个url后回车,后台发生了什么?比如输入url后,你看到了百度的首页,那么这一切是如何发生的呢?这个问题之前、最近、我想以后肯定还会被问到,或者问到这样的题目,如果在百度框里输入查询的字符串开始,是怎么返回你需要的东西呢。那这什么个过程呢(这个问题我在之后的博客中在写)?网上各种的说法,不外乎这么几种第一种简单的说呢转载 2016-04-21 23:43:39 · 7629 阅读 · 0 评论 -
寻找第K大的数的方法总结
的方式,决定很好,推荐给大家。 所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题。 解法1: 我们可以对这个乱序数组按照从大到小先行排序,然后取出前k大,总的时间复杂度为O(n*logn + k)。 解法2: 利用选择排序或交互排序,K次选择后即可得到第k大的数。总的时间复杂度为O(n*k)转载 2016-03-11 14:25:36 · 3445 阅读 · 0 评论 -
从01背包问题理解动态规划
01背包问题具体例子:假设现有容量10kg的背包,另外有3个物品,分别为a1,a2,a3。物品a1重量为3kg,价值为4;物品a2重量为4kg,价值为5;物品a3重量为5kg,价值为6。将哪些物品放入背包可使得背包中的总价值最大? 这个问题有两种解法,动态规划和贪婪算法。本文仅涉及动态规划。 先不套用动态规划的具体定义,试着想,碰见这种题目,怎么解决? 首先想到的,一般是穷举法,转载 2016-04-15 19:28:18 · 957 阅读 · 0 评论 -
关于C++中字符串的拆分split函数
标准库中的string是没有此函数的,但我们可以试着实现它。借鉴网上的函数如下[cpp] view plain copylist util::split(string str, string separator) { list result; int cutAt; while( (cut转载 2016-04-19 17:59:00 · 2924 阅读 · 0 评论 -
动态规划:从新手到专家
作者:Hawstein出处:http://hawstein.com/posts/dp-novice-to-advanced.html声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处。前言本文翻译自TopCoder上的一篇文章: Dynamic Programmin转载 2016-04-15 16:12:02 · 358 阅读 · 0 评论 -
n级阶梯,每次走一步或两步,问最多有多少种走法
递归实现。。。重要的是理解这个逻辑,第n布,走一步,即n-1,再求n-1个阶梯的走法,走两步,即n-2,再求n-2个阶梯的走法,以此,n级阶梯的走法是n-1个阶梯的走法与n-2个阶梯的走法的和。int GetStepNum(int n){ if(n<1) return 0; if(n==1) return 1; if(n==2) re转载 2012-10-18 08:46:30 · 3160 阅读 · 0 评论 -
九度OJ 题目1130:日志排序
题目1130:日志排序时间限制:1 秒内存限制:32 兆特殊判题:否提交:529解决:90题目描述:有一个网络日志,记录了网络中计算任务的执行情况,每个计算任务对应一条如下形式的日志记录:“hs_10000_p”是计算任务的名称,“2007-01-17 19:22:53,315”是计算任务开始执行的时间“年-月-日 时转载 2016-03-20 14:58:51 · 557 阅读 · 0 评论 -
从两个有序数组的并集中寻找第k小元素
Given two sorted arrays A, B of size m and n respectively. Find the k-th smallest element in the union of A and B. You can assume that there are no duplicate elements.一、朴素解法:O(m+n):将两个数组转载 2016-03-30 20:04:44 · 3276 阅读 · 0 评论 -
两个有序数组元素之积、和的最小K个值
题目来自阿里面试题目题目(1)已知A B两个数组,元素有序,构造新的集合S={x*y | x属于A, y属于B} 求S中最小的k个元素,最优解法。(2)已知A B两个数组,元素有序,构造新的集合S={x+y | x属于A, y属于B} 求S中最小的k个元素,最优解法。思路:这两个题本质上属于同一个题目,可以使用同一个思路做。思路(1) 暴力解决,此时时间转载 2016-04-01 21:47:37 · 2150 阅读 · 0 评论 -
判断单链表是否有环,返回环的入口节点
如何判断一个单向链表是否有环?如果有,如何找到其入口节点的指针?算法思想:用两个指针p1,p2同时指向链表的头部,p1一次移动一步,p2一次移动两步,如果最终p1和p2重合则说明链表有环,如果p2走到空指针(链表的结尾)则说明链表无环; 如果最终p1和p2重合,使p2重新指向链表的头结点,然后p1和p2同时一次移动一步,当p1和p2再次重合时该节点指针就是环的入口节转载 2016-03-27 10:16:09 · 1557 阅读 · 0 评论 -
哈希表(等概率情况下)查找成功与查找不成功的平均查找长度
继续小结,做到一道求 哈希表查找成功与查找不成功 情况下平均查找长度的计算问题,迷惑了好一会,在这里总结下来: 首先,你要明白的是平均查找长度求的是期望,那么你就按照求期望的方法来求平均查找长度吧,千万记着期望怎么求平均查找长度就怎么求啊。 题目:在地址空间为0~16的散列区中,对以下关键字序列构造两个哈希表:{Jan, Feb, Mar, Apr, May, June, J转载 2016-04-13 13:45:12 · 25842 阅读 · 6 评论 -
判断两个链表是否相交并找出交点
问题描述:一个比较经典的问题,判断两个链表是否相交,如果相交找出他们的交点。思路:1、碰到这个问题,第一印象是采用hash来判断,将两个链表的节点进行hash,然后判断出节点,这种想法当然是可以的。2、当然采用暴力的方法也是可以的,遍历两个链表,在遍历的过程中进行比较,看节点是否相同。3、第三种思路是比较奇特的,在编程之美上看到的。先遍历第一个链表到转载 2016-03-27 10:01:27 · 30543 阅读 · 5 评论 -
KMP字符串模式匹配详解
KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。可以证明它的时间复杂度为O(m+n).。一.简单匹配算法先来看一个简单匹配算法的函数:int Index_BF ( char S [ ], char T [ ], int pos ){/* 若串 S 中从第pos(S 的下标0≤p转载 2016-03-28 10:09:58 · 339 阅读 · 0 评论 -
C++ STL sort和qsort函数
一、sort使用:1、需要头文件:include2、使用方法用法(1):sort(begin,end);//默认是从小到大排序,begin表示要排序元素的首地址,end表示要排序元素的结束地址int a[n];sort(a,a+n);用法(2):sort(begin,end,cmp);//自定义排序函数cmp,要实现从大到小排序,需要自己写排序函数int a[n];原创 2016-04-10 16:12:56 · 6217 阅读 · 1 评论 -
bitmap算法
概述所谓bitmap就是用一个bit位来标记某个元素对应的value,而key即是这个元素。由于采用bit为单位来存储数据,因此在可以大大的节省存储空间算法思想32位机器上,一个整形,比如int a;在内存中占32bit,可以用对应的32个bit位来表示十进制的0-31个数,bitmap算法利用这种思想处理大量数据的排序与查询优点: 效率高,不许进行比较和移转载 2016-04-14 20:22:29 · 419 阅读 · 0 评论 -
二叉排序树查找不成功的平均查找长度
在看二叉排序树查找分析时,对“二叉排序树查找不成功的平均查找长度”不是很理解,上网查了一下,稍微小结一下: 假如一棵二叉排序树如下: 那么查找不成功的平均查找长度是:(2*2+3*3+4*2)/7=21/7 比如说一个数如果比62 你再查找x>74的接点,他应该是在74右接点上,但是不存在,也是两次。所以由于74左右孩子不存在,查找6274的总次数是2*2转载 2016-04-11 20:32:53 · 18917 阅读 · 5 评论 -
平均查找长度详解
1.顺序查找:从表的一端开始,顺序扫描线性表,依次将扫描到的节点关键字和给定值k相比较。等概率条件下...平均查找长度:ASL = (n+....+2+1)/n= (n+1)/2。2.二分法查找:前提是线性表是有序表。假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数转载 2016-04-11 21:49:42 · 79540 阅读 · 1 评论 -
深入理解Java的接口和抽象类
对于面向对象编程来说,抽象是它的一大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。这两者有太多相似的地方,又有太多不同的地方。很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然。今天我们就一起来学习一下Java中的接口和抽象类。下面是本文的目录大纲: 一.抽象类 二.接口 三.抽象类和接口的区别 若有不正之处,请多多谅解并欢迎批评指正,转载 2016-05-09 13:45:55 · 315 阅读 · 0 评论