
数据结构与算法
文章平均质量分 71
ccj_zj
这个作者很懒,什么都没留下…
展开
-
动态规划之01背包、完全背包问题
转载于http://blog.youkuaiyun.com/kangroger/article/details/38864689在hihocoder上面的题目中看到的这个问题,总结一下。先看01背包问题。01背包问题:一个背包总容量为V,现在有N个物品,第i个 物品体积为weight[i],价值为value[i],现在往背包里面装东西,怎么装能使背包的内物品价值最大?看到这个问题,可能会想转载 2017-05-17 18:51:18 · 422 阅读 · 0 评论 -
带重复元素的全排列
问题描述给出一个具有重复数字的列表,找出列表所有不同的排列。样例给出列表 [1,2,2],不同的排列有:[ [1,2,2], [2,1,2], [2,2,1]]递归解法:利用回溯加递归的思想,每次将当前元素与待交换元素进行交换前,判断在当前元素到待交换元素之间是否存在元素与待交换元素相等。若存在,则跳过待交换元素;若不存在,则进原创 2017-08-09 14:55:31 · 1474 阅读 · 0 评论 -
ST(稀疏表)算法
作用:ST算法是用来求解给定区间RMQ的最值,本文以最小值为例举例:给出一数组A[0~5] = {5,4,6,10,1,12},则区间[2,5]之间的最值为1。方法:ST算法分成两部分:离线预处理 (nlogn)和 在线查询(O(1))。虽然还可以使用线段树、树状链表等求解区间最值,但是ST算法要比它们更快,而且适用于在线查询。(1)离线预处理:运用DP思想,用于求解区间最值,并保转载 2017-08-18 09:07:25 · 2047 阅读 · 2 评论 -
编程题——地下迷宫
题目描述小青蛙有一天不小心落入了一个地下迷宫,小青蛙希望用自己仅剩的体力值P跳出这个地下迷宫。为了让问题简单,假设这是一个n*m的格子迷宫,迷宫每个位置为0或者1,0代表这个位置有障碍物,小青蛙达到不了这个位置;1代表小青蛙可以达到的位置。小青蛙初始在(0,0)位置,地下迷宫的出口在(0,m-1)(保证这两个位置都是1,并且保证一定有起点到终点可达的路径),小青蛙在迷宫中水平移动一个单位距原创 2017-08-18 15:15:43 · 1544 阅读 · 0 评论 -
编程题——和为sum的方法数
题目描述给定一个有n个正整数的数组A和一个整数sum,求选择数组A中部分数字和为sum的方案数。当两种选取方案有一个数字的下标不一样,我们就认为是不同的组成方案。输入描述:输入为两行:第一行为两个正整数n(1 ≤ n ≤ 1000),sum(1 ≤ sum ≤ 1000)第二行为n个正整数A[i](32位整数),以空格隔开。输出描述:输出所求的方案数原创 2017-08-19 01:53:22 · 4178 阅读 · 0 评论 -
一致性哈希算法
一致哈希 是一种特殊的哈希算法。在使用一致哈希算法后,哈希表槽位数(大小)的改变平均只需要对K/n个关键字重新映射,其中K是关键字的数量,n是槽位数量。然而在传统的哈希表中,添加或删除一个槽位的几乎需要对所有关键字进行重新映射。分布式缓存问题一个网站随着流量增加,服务器压力越来越大,之前直接读写数据库的方式遭遇I/O和连接数的瓶颈,于是我们引入Memcached作为缓存服务器减轻DB压力。转载 2017-08-19 14:42:21 · 452 阅读 · 0 评论 -
线段树(二)
Question:给你N个数,有两种操作:1:给区间[a,b]的所有数增加X2:询问区间[a,b]的数的和。输入描述:第一行一个正整数n,接下来n行n个整数,再接下来一个正整数Q,每行表示操作的个数,如果第一数是1,后接3个正整数,表示在区间[a,b]内每个数增加X,如果是2,表示操作2询问区间[a,b]的和是多少。输入样例:55 4 3 2 12转载 2017-08-20 12:57:53 · 247 阅读 · 0 评论 -
线段树(一)
首先提出一个问题: 给你n个数,有两种操作:1:给第i个数的值增加X2:询问区间[a,b]的总和是什么?输入描述输入文件第一行为一个整数n,接下来是n行n个整数,表示格子中原来的整数。接下一个正整数q,再接下来有q行,表示q个询问,第一个整数表示询问代号,询问代号1表示增加,后面的两个数x和A表示给位置X上的数值增加A,询问代号2表示转载 2017-08-20 12:24:19 · 293 阅读 · 0 评论 -
异或
问题给定整数m以及n各数字A1,A2,..An,将数列A中所有元素两两异或,共能得到n(n-1)/2个结果,请求出这些结果中大于m的有多少个。 输入描述:第一行包含两个整数n,m. 第二行给出n个整数A1,A2,…,An。数据范围对于30%的数据,1 <= n, m <= 1000对于100%的数据,1 <= n, m, Ai <= 10^5输出描述:输出仅包括一行,即所求的答案思路使用字典树(Tr原创 2017-08-05 20:12:02 · 2495 阅读 · 2 评论 -
图是否是树
题目描述 给出 n 个节点,标号分别从 0 到 n - 1 并且给出一个 无向 边的列表 (给出每条边的两个顶点), 写一个函数去判断这张`无向`图是否是一棵树 注意事项 你可以假设我们不会给出重复的边在边的列表当中. 无向边 [0, 1] 和 [1, 0] 是同一条边, 因此他们不会同时出现在我们给你的边的列表当中。 样例 给出n = 5 并且原创 2017-07-28 19:45:07 · 614 阅读 · 0 评论 -
动态规划——吹气球
问题描述有n个气球,编号为0到n-1,每个气球都有一个分数,存在nums数组中。每次吹气球i可以得到的分数为 nums[left] * nums[i] * nums[right],left和right分别表示i气球相邻的两个气球。当i气球被吹爆后,其左右两气球即为相邻。要求吹爆所有气球,得到最多的分数。样例给出 [4, 1, 5, 10]返回 270nu原创 2017-08-28 13:17:49 · 1513 阅读 · 0 评论 -
编程题——攀爬字符串
给定一个字符串 S1,将其递归地分割成两个非空子字符串,从而将其表示为二叉树。下面是s1 = "great"的一个可能表达: great / \ gr eat / \ / \g r e at / \ a t在攀爬字符串的过程中,我们可以选择其中任意一个非叶节点,然后交换该节点的两个转载 2017-08-28 17:23:35 · 332 阅读 · 0 评论 -
LRU缓存策略
问题描述:为最近最少使用(LRU)缓存策略设计一个数据结构,它应该支持以下操作:获取数据(get)和写入数据(set)。获取数据get(key):如果缓存中存在key,则获取其数据值(通常是正数),否则返回-1。写入数据set(key, value):如果key还没有在缓存中,则写入其数据值。当缓存达到上限,它应该在写入新数据之前删除最近最少使用的数据用来腾出空闲位置。原创 2017-08-29 19:48:35 · 536 阅读 · 0 评论 -
LFU缓存策略
Example:LFUCache cache = new LFUCache( 2 /* capacity */ );cache.put(1, 1);cache.put(2, 2);cache.get(1); // returns 1cache.put(3, 3); // evicts key 2cache.get(2); // returns -1 (原创 2017-08-30 21:17:05 · 836 阅读 · 0 评论 -
最小生成树
问题描述给出一些Connections,即Connections类,找到一些能够将所有城市都连接起来并且花费最小的边。如果说可以将所有城市都连接起来,则返回这个连接方法;不然的话返回一个空列表。 注意事项返回cost最小的连接方法,如果cost相同就按照city1进行排序,如果city1也相同那么就按照city2进行排序。样例原创 2017-08-17 11:43:04 · 347 阅读 · 0 评论 -
删除二叉查找树的节点
问题描述给定一棵具有不同节点值的二叉查找树,删除树中与给定值相同的节点。如果树中没有相同值的节点,就不做任何处理。你应该保证处理之后的树仍是二叉查找树。样例给出如下二叉查找树: 5 / \ 3 6 / \2 4删除节点3之后,你可以返回: 5 / \2 6 \ 4或者:原创 2017-08-02 12:46:06 · 536 阅读 · 1 评论 -
验证二叉查找树
问题描述:给定一个二叉树,判断它是否是合法的二叉查找树(BST)一棵BST定义为:节点的左子树中的值要严格小于该节点的值。节点的右子树中的值要严格大于该节点的值。左右子树也必须是二叉查找树。一个节点的树也是二叉查找树。思路一:由于二叉查找树的特有性质,若我们按中序输出该树,按左子树--根--右子树的顺序输出,那么输出元素将是递增的!class Solut原创 2017-07-04 22:55:35 · 269 阅读 · 0 评论 -
在二叉查找树中插入节点
问题描述:给定一棵二叉查找树和一个新的树节点,将节点插入到树中。你需要保证该树仍然是一棵二叉查找树。递归解法:class Solution {public: /** * @param root: The root of the binary search tree. * @param node: insert this node int原创 2017-07-04 18:03:05 · 272 阅读 · 0 评论 -
数据结构与算法--子数组和为0
问题:子数组和为0Given an integer array, find a subarray where the sum of numbers is zero.Your code should return the index of the first number and the index of the last number.ExampleGiven [-3, 1, 2, -3, 4]转载 2017-05-26 22:33:52 · 1018 阅读 · 0 评论 -
数据结构与算法--子数组和为k
问题:子数组和为kGiven an nonnegative integer array, find a subarray where the sum of numbers is k.Your code should return the index of the first number and the index of the last number.ExampleGiven [1, 4, 2转载 2017-05-27 09:17:09 · 541 阅读 · 0 评论 -
二叉树的最大深度
问题描述:给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的距离。递归解法:class Solution {public: /** * @param root: The root of binary tree. * @return: An integer */ int maxDepth(TreeNode *root) {原创 2017-06-28 18:42:38 · 252 阅读 · 0 评论 -
编程题——判断扑克牌大小
题目描述:扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A,2各4张,小王1张,大王1张。牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王):) 3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER 输入两手牌,两手牌之间用“-”连接,每手牌的每张牌以空格分隔,“-”两边没有空格,如:4 4 4 4-joker原创 2017-07-05 23:39:02 · 2011 阅读 · 0 评论 -
编程题——简单错误记录
问题描述:开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。 处理:1.记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加;(文件所在的目录不同,文件名和行号相同也要合并)2.超过16个字符的文件名称,只记录文件的最后有效16个字符;(如果文件名不同,而只是文件名的后16个字符和行号相同,也不要合并)3.输入的文件可原创 2017-07-05 23:48:34 · 896 阅读 · 0 评论 -
编程题——复杂链表的复制
问题描述:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。解题思路:使用hash_map容器按顺序存储每个节点,并生成一个新的节点,不过在加入hash_map前,要先判断节点是否已经存在容器中,已判断链表是否是循环链表。同理,在遍历hash_map容器时,要用另一个容器set存储当前已原创 2017-07-10 20:17:24 · 235 阅读 · 0 评论 -
字符串的全排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。解题思路:维持一个string,若当前元素未被访问且当前元素与前一个元素不相等时,我们将该元素加入到str原创 2017-07-12 09:46:21 · 284 阅读 · 0 评论 -
树的遍历
一、前序遍历 递归解法:class Solution {public: /** * @param root: The root of binary tree. * @return: Preorder in vector which contains node values. */ vector preorderTraversal(TreeNode *原创 2017-06-25 22:42:51 · 211 阅读 · 0 评论 -
链表重排序
问题描述:给定一个单链表L: L0→L1→…→Ln-1→Ln,重新排列后为:L0→Ln→L1→Ln-1→L2→Ln-2→…必须在不改变节点值的情况下进行原地操作。题解1 - 链表长度(TLE) __直观角度来考虑,如果把链表视为数组来处理,那么我们要做的就是依次将下标之和为n的两个节点链接到一块儿,使用两个索引即可解决问题,一个索引指向i, 另一个索引则指向其之后的第n - 2*i个节点(对于链表转载 2017-06-13 21:53:58 · 584 阅读 · 0 评论 -
编程题——整数中1出现的次数
题目描述输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次。解题思路考虑将n的十进制的每一位单独拿出讨论,每一位的值记为weight。1) 个位从1到n,每增加1,weight就会加1,当weight加到9时,再加1又会回到0重新开始。那么weight转载 2017-07-15 14:12:20 · 436 阅读 · 0 评论 -
编程题——正则表达式匹配
题目描述请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配解题思路分析:递归实现每次分别在str 和pattern中取一个字符进行匹配,原创 2017-07-16 09:09:43 · 1491 阅读 · 0 评论 -
最小子串覆盖
题目描述给定一个字符串source和一个目标字符串target,在字符串source中找到包括所有目标字符串字母的子串。 注意事项如果在source中没有这样的子串,返回"",如果有多个这样的子串,返回起始位置最小的子串。样例给出source = "ADOBECODEBANC",target = "ABC" 满足要求的解 "BANC"原创 2017-07-20 20:56:48 · 639 阅读 · 0 评论 -
最长公共前缀
问题描述:给k个字符串,求出他们的最长公共前缀(LCP)解题思路:自定义一个字典树结构,每个树节点有一个int型整数count,表示有多少个字符串经过该节点。除此之外,每个节点还有58个指针指向下一个节点,设计成58个指针,是因为‘a’与‘A’的ASCII编码相差58。我们使用字典树表示所有字符串,构造字典树的时间复杂度为O(n*length),其中n为字符串个数,le原创 2017-07-17 23:26:33 · 755 阅读 · 0 评论 -
迷宫寻路
问题描述:假设一个探险家被困在了地底的迷宫之中,要从当前位置开始找到一条通往迷宫出口的路径。迷宫可以用一个二维矩阵组成,有的部分是墙,有的部分是路。迷宫之中有的路上还有门,每扇门都在迷宫的某个地方有与之匹配的钥匙,只有先拿到钥匙才能打开门。请设计一个算法,帮助探险家找到脱困的最短路径。如前所述,迷宫是通过一个二维矩阵表示的,每个元素的值的含义如下 0-墙,1-路,2-探险家的起始位置,原创 2017-09-08 15:06:02 · 1057 阅读 · 0 评论