- 博客(21)
- 收藏
- 关注
原创 《算法概论》习题解答 8.10
8.10 证明以下问题是某些NP完全问题的一般化,以此证明该问题也是NP完全的。 证明思路是将问题中的某些条件特殊化,并证明特例与某些NP完全问题相同。(a)判断一个无向图G是否为另一个无向图H的子图。 A:令图G是一个环,而且G和H的顶点数相同。那么如果G是H的子图,H中必然存在Rudrata回路。因此求解这个问题相当于求解图H的Rudrata回路,因此问题(a)是NP完全的。(b)找出一个图
2017-07-05 21:22:09
782
原创 LeetCode 474 Ones and Zeroes 题解
题意简述:有若干个由0和1组成的字符串,现在限定使用m个0和n个1,每个0和1至多使用1次,问最多能组成多少个给定的字符串。 输入:字符串的vector,m和n的值 输出:能组成的字符串的数目 示例:给出m=5,n=3。字符串有{“10”, “0001”, “111001”, “1”, “0”},最多可以组成4个字符串:“10,”0001”,”1”,”0”。题解: 如果把提供的0和1看作容量
2017-06-28 14:36:58
993
原创 LeetCode 279 Perfect Squares 题解
题意简述:给定一个正整数,求出它最少可以用多少个平方数之和表示。例如13=4+9只需两个平方数。 输入:正整数n 输出:平方数的最少个数题解: 求解最少个数的话应该采用bfs。采用队列存放中间得到的整数。对于当前队头n,减去一个平方数可能得到n-1、n-4、……n−⌊n√⌋2n-\lfloor\sqrt{n}\rfloor^2,将这些数当中之前在队列中未出现的数全部放进队列里,平方数个数+1。
2017-06-28 10:28:49
381
原创 LeetCode 103 Binary Tree Zigzag Level Order Traversal 题解
题意简述:给出一棵二叉树,要求按以下顺序遍历:第一层结点由左到右,第二层结点由右到左,第三层结点由左到右如此重复。 输入:二叉树的根结点root 输出:嵌套vector,一个vector包含同一层结点的遍历顺序 示例:对于左下的二叉树,它的遍历结果如右下所示 3 [ / \ [3], 9 20
2017-06-27 17:27:45
343
原创 LeetCode 312 Burst Balloons 题解
题意简述:给出一排气球(用0到n-1代表),每个气球都有一个分数,打爆一个气球可以获得该气球以及它左右气球的三个分数的乘积,并且打爆之后,左右气球变成相邻。求出打爆所有气球所能获得的分数最大值。 输入:一个vector,表示每个气球的分数 输出:分数的最大值 示例:对于4个气球,分数分别为[3,1,5,8],按气球1、2、0、3的顺序打爆,可以获得最大分数 3*1*5+3*5*8+3*8+8
2017-06-24 12:35:56
564
原创 LeetCode 394 Decode String 题解
题意简述:给定一个解码规则k[encoded_string] -> encoded_string重复k次,以及一个根据此规则编码的字符串,求出解码后的字符串。 输入:编码的字符串s 输出:解码后的字符串 示例:字符串“3[a2[c]]”将被解码为“accaccacc”,3[a2[c]]=3[acc]=accaccacc题解: 涉及到括号匹配和嵌套,因而采用DFS进行求解。 设置一个int记
2017-06-24 10:23:37
598
原创 LeetCode 221 Maximal Square 题解
题意简述:给定一个由0和1组成的二维矩阵,找到其中只包含1的最大正方形。 输入:char类型二维矩阵matrix 输出:最大正方形的面积 示例:对于以下矩阵,所能找到的最大正方形用加粗表示,其面积为4。 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0题解: 采用动态规划,考虑求解以点(i,j)作为右下角所能找到的正方形最大边长。边界情况是最上方的行和
2017-06-13 21:08:07
517
原创 LeetCode 483 Smallest Good Base 题解
题意简述:给定一个正整数n,肯定存在基底k(k>2),使n在基底k的表示中所有位都是1,求出所有这样的基底中最小的一个。 输入:一个string,表示正整数n。 输出:一个string,表示满足条件的最小基底k。 示例:对于数13,其在基底3下的表示是111,小于3的基底都不满足,因此输出是3。题解: 问题用数学描述,就相当于求解方程n=km+km−1+...+k+1n=k^m+k^{m-1
2017-06-09 12:19:47
635
原创 LeetCode 174 Dungeon Game 题解
题意简述:有一个M*N的网格迷宫,位于左上角的骑士要到达右下角的公主的位置。每到达一个位置,骑士的生命值都会发生变化(负数为减少,正数为增加),如果在途中骑士的生命值降至0或以下,会立刻死亡。 假设骑士的生命值没有上限,而且每一步只能向右或者向下走。给定一个迷宫,那么骑士要安全到达右下角最少需要的初始生命值是多少。 输入:嵌套vector,代表迷宫每个网格骑士生命值的变化。 输出:一个int,
2017-06-08 19:30:28
620
原创 LeetCode 207 Course Schedule 题解
题意简述:有n个课程,分别用0到n-1表示。有些课程需要另外的课程作为基础,现在把所有的课程依赖条件给出,问能不能在遵守依赖条件的情况下学习所有课程。 输入:课程总数numCourses,条件对prerequisites(类型为包含pair的vector),任意一个pair(i,j)表示,要学习课程i需要先学习课程j。 输出:一个bool,是否能够学习所有课程。 示例:对于输入(2,[[0,1
2017-06-03 16:49:33
475
原创 LeetCode 134 Gas Station 题解
题意简述:有n个加油站,呈环形分布在一条公路上。给出每个加油站所能提供的油量gas,和从一个加油站到达下一个加油站消耗的油量cost。假设车的油缸可以装无限的汽油,那么能否找到一个出发点,使车能够绕公路一圈回到出发点而不会在两个加油站的中间耗尽油量。题目保证如果有解,解是唯一的。 输入:简述中的两个数组gas和cost。 输出:如果解存在,输出起始点的下标,否则输出-1。题解: 考虑对于区间[
2017-06-02 20:41:29
619
原创 LeetCode 33 Search in Rotated Sorted Array 题解
题意简述:给定一个按升序排序的数组,这个数组进行了数次旋转(例如数组[0,1,2,4,5,6,7]在2和4之间执行一次旋转就会变成[4,5,6,7,0,1,2]。需要搜索某个数是否在这个数组里面。数组里面没有重复元素。 输入:数组nums,要搜索的值target 输出:如果target在nums里面,那么返回它在数组里面的位置下标;否则返回-1。 示例:对于nums=[4,5,6,7,0,1,
2017-04-29 16:49:41
405
原创 LeetCode 464 Can I Win 题解
题意简述:给定两个值n和desiredTotal,要求两位玩家从整数1,2,……,n中依次取数,每个数只能取一次,每个取出的数都会加到一个和数上,最先使和数大于或等于desiredTotal的玩家获胜。问玩家1(先取数的)是否必胜。假设两位玩家都会作出最优选择。 输入:两个值n和desiredTotal。 输出:一个bool值,表示玩家1是否获胜。 示例:对于n=10和desiredTotal
2017-04-27 18:43:53
1380
原创 LeetCode 486 Predict the Winner 题解
题目简述:给定非负数组nums。有两个玩家,从玩家1开始交替取出一个数并加到他的分数上,取的时候只能取数组剩余的头尾两个数之一。当所有数都被取完时分数高的玩家获胜。求在给定nums的情况下,预测玩家1是否获胜。假设两个玩家每次操作都是最优的。 输入:非负数组nums。 输出:一个bool值,表示玩家1是否获胜。 示例:对于数组[1,5,2],玩家1必输,因为无论取1还是2,玩家2都会取5而获
2017-04-21 21:42:52
820
原创 LeetCode 494 Target Sum 题解
题意简述:给定一个非负数组nums和目标值S,你需要在每个数之前加上加号或减号组成表达式。求令表达式的值恰好为S的方法总共有多少种。 输入:非负数组nums,目标值S 输出:使表达式的值恰好为S的方法总数。 示例:对于数组[1,1,1,1,1],S=3,那么总共有5种方法:令其中1个1取-号,剩余4个1取加号即可。题解: 表面上看,每个位置都是考虑取加法还是取减法。我们不妨换个思路:记sum
2017-04-20 13:50:05
897
原创 LeetCode 402 Remove K Digits 题解
题意简述:给定一个有数字组成的字符串,要求从里面删去k个数字后剩下的数尽可能小,求最小值。 输入:一个数字组成的字符串num,要删去的数量k 输出:所得到的数的最小值 示例:对于字符串“1432219”,要删去3个数,可以删去第2、3、4位,剩下的“1219”是最小的。题解: 无论我们怎样操作,最终得出的数的位数是固定的(num的长度减去k),那么要让数尽可能小,就是要让高位的数字尽可能小。
2017-04-16 19:16:12
720
原创 LeetCode 45 Jump Game II 题解
题意简述:给定一个非负数列,数列元素的值表示可以向后跳的最大距离。求出从第一个下标元素跳到最后一个下标元素所需要的最小跳跃次数。 输入:非负数列nums 输出:最小的跳跃次数 示例:对于数列[2,3,1,1,4],从数2跳到数4最小需要两次:从第一个元素跳一格到第二个元素,再从第二个元素直接跳到最后一个元素。题解: 可以采用类似BFS的解法:先从起点开始,找出所有能在1跳到达的位置,然后在这
2017-04-09 21:24:23
455
原创 LeetCode 437 Path Sum III 题解
题意简述:给定一棵二叉树,以及一个和sum,问在树中是否存在一条路径,路径上所有结点之和恰好等于sum。路径不限制一定要开始于根结点或者结束于叶子结点,但是一定要是向下的(从父亲结点向儿子结点)。如果存在这样的路径,求出有多少条。 输入:二叉树的根结点指针root,以及和sum 输出:满足条件的路径数 示例:对于下图的二叉树,sum为8,则存在3条路径: 10
2017-03-26 18:56:09
870
原创 LeetCode 454 4Sum II 题解
题意简述:给出A、B、C、D四个区间,分别从这四个区间取出一个整数,使其相加得到的和等于0,求出总共有多少种方式。 输入:四个整型的vectorA、B、C、D 输出:满足条件的四元组(i,j,k,l)的个数题解: 如果采用四个区间同时进行枚举的方式,时间复杂度是O(N4^4),这显然是不可接受的。注意到枚举的对象既可以是区间内的整数,也可以是整数的和。所以可以采用二分的思路:把四个区间分成两组
2017-03-12 19:33:58
727
原创 LeetCode 282 Expression Add Operators 题解
题意简述:给定一个数字串和一个目标值,允许在数字串中任意两个相邻数字之间插入+、-和*来组成表达式,求出所有这样的表达式,表达式求出的值恰好等于目标值。 输入:一个只由数字组成的字符串num,一个整数target。 输出:所有计算值为目标值的表达式。 示例:输入为(”105”,5),输出为[“1*0+5”,”10-5”]题解: 这应该是条搜索题,搜索所有可能的表达式并分别计算结果,储存所有结
2017-03-04 15:04:19
731
原创 LeetCode 6 ZigZag Conversion 题解
题意简述:将一个字符串以连续的N字形排列转存到二维矩阵后按行依次输出得到一个新字符串。 输入:原字符串s,二维矩阵行数nRows。 输出:二维矩阵按行输出的结果(空白部分不输出)。 示例:输入为(”PAYPALISHIRING”, 3),输出为”PAHNAPLSIIGYIR”,排列如下所示。P A H NA P L S I I GY I R题解: 先以一个例子观察是否
2017-02-26 15:29:49
379
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人