- 博客(46)
- 收藏
- 关注
原创 排列序号
题目描述:给出一个不含重复数字的排列,求这些数字的所有排列按字典序排序后该排列的编号。其中,编号从1开始。样例:例如,排列 [1,2,4] 是第 1 个排列。关于“字典序”和排列的相关基础概念请翻看我之前的博客(详见:点击打开链接),在这篇博客里面我还写了是如何求取一个排列的下一个排列的,如果这些内容你不清楚的话,请先打开链接回看,然后再来做这道题,因为很多内容我会当做你已经很
2016-06-30 15:26:36 1412
原创 下一个排列
题目描述:给定一个若干整数的排列,给出按正数大小进行字典序从小到大排序后的下一个排列。如果没有下一个排列,则输出字典序最小的序列。样例:左边是原始排列,右边是对应的下一个排列。1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1先解释一下“字典序”。官方的准确定义我就不说了,自己可以去查。我只说说针对这类编程题,我们应该怎么理解。一个序
2016-06-30 10:28:43 1353 1
原创 三数之和
题目描述:给出一个有n个整数的数组S,在S中找到三个整数a, b, c,找到所有使得a + b + c = 0的三元组。样例:如S = {-1 0 1 2 -1 -4}, 你需要返回的三元组集合的是:(-1, 0, 1),(-1, -1, 2)可以先对整个数组排序,然后依次取数组中的元素,固定,再检查从这个元素之后的那个元素开始,直到数组结尾的部分中,存不存在两个数的和,恰好是固定
2016-06-28 22:32:18 837
原创 背包问题 II
题目描述:给出n个物品的体积A[i]和其价值V[i],将他们装入一个大小为m的背包,最多能装入的总价值有多大?样例:对于物品体积[2, 3, 5, 7]和对应的价值[1, 5, 2, 4], 假设背包大小为10的话,最大能够装入的价值为9。做这道题之前,如果你不知道在不考虑对应价值的情况下的“背包问题”,请出门左转,看我的上一篇博文(详见:点击打开链接)。因为很多思路和上一篇是
2016-06-27 17:02:46 635
原创 背包问题
题目描述:在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为A[i]样例:如果有4个物品[2, 3, 5, 7]如果背包的大小为11,可以选择[2, 3, 5]装入背包,最多可以装满10的空间。如果背包的大小为12,可以选择[2, 3, 7]装入背包,最多可以装满12的空间。函数需要返回最多能装满的空间大小。背包问题是计算机科学中非
2016-06-27 16:13:38 815
原创 硬币排成线 II
题目描述:有 n 个不同价值的硬币排成一条线。两个参赛者轮流从左边依次拿走 1 或 2 个硬币,直到没有硬币为止。计算两个人分别拿到的硬币总价值,价值高的人获胜。请判定 第一个玩家 是输还是赢?样例:给定数组 A = [1,2,2], 返回 true.给定数组 A = [1,2,4], 返回 false.动态规划+博弈论的问题。设现在的两个玩家分别为player1,
2016-06-26 20:34:46 1040
原创 不同的二叉查找树
题目描述:给出 n,问由 1...n 为节点组成的不同的二叉查找树有多少种?样例:给出n = 3,有5种不同形态的二叉查找树:二叉查找树的特点是任何一个节点左子树的节点值都小于这个节点,右子树的节点值都大于这个节点。根据这个规律,我们来分析:设置一个一维数组record来保存n在不同的值时,不同的BST(二叉查找树)的数量1. n = 0,没有节点,只有空树一种情况
2016-06-26 12:29:53 992
原创 乘积最大子序列
题目描述:找出一个序列中乘积最大的连续子序列(至少包含一个数)。样例:比如, 序列 [2,3,-2,4] 中乘积最大的子序列为 [2,3] ,其乘积为6。动态规划问题,用一个数组record记录每次运算的结果。这里面有个问题,就是求前n位的乘积最大子序列的最大乘积时,的确和前n - 1位有关,但是不一定和前n - 1位的乘积最大子序列的乘积有关,他有可能是由乘积最小子序列得到的
2016-06-23 19:38:35 3097
原创 二叉树中的最大路径和
题目描述:给出一棵二叉树,寻找一条路径使其路径和最大,路径可以在任一节点中开始和结束(路径和为两个节点之间所在路径上的节点权值之和)样例:给出一棵二叉树: 1 / \ 2 3返回 6这里面有一个默认的事实,那就是不管这个路径在哪,他都肯定有一个最高的节点。我们不妨可以设这个节点为A,以A为最高节点的路径的最大长度
2016-06-23 18:51:41 3758 2
原创 最大正方形
题目描述:在一个二维01矩阵中找到全为1的最大正方形样例:1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0返回 4求的是正方形的面积,当然,如果能知道这个正方形的边长就解决了。还是动态规划,用一个二维表格record记录运算结果,其中,record[i][j]表示源矩阵当中以第 i 行,第 j 列的元素为正方形右下角的最大正方形的
2016-06-21 16:07:40 1772
原创 最长公共子串
题目描述:给出两个字符串,找到最长公共子串,并返回其长度。样例:给出A=“ABCD”,B=“CBCE”,返回 2首先得明白子串和子序列的区别,子序列是要保持顺序不变的元素组成的序列,也就是说,不一定要连续,但是子串是要顺序不变,同时还必须连续。如果你已经学习过之前我讲的对“两个字符串”这种动态规划问题的解法(例如:点击打开链接,点击打开链接等等),那么这道题就一点都不难,将
2016-06-21 11:30:57 788
原创 最长公共子序列
题目描述:给出两个字符串,找到最长公共子序列(LCS),返回LCS的长度。说明:最长公共子序列的定义:最长公共子序列问题是在一组序列(通常2个)中找到最长公共子序列(注意:不同于子串,LCS不需要是连续的子串)。该问题是典型的计算机科学问题,是文件差异比较程序的基础,在生物信息学中也有所应用。https://en.wikipedia.org/wiki/Longest_common_subs
2016-06-16 20:53:52 827
原创 打劫房屋 II
题目描述:在上次打劫完一条街道之后,窃贼又发现了一个新的可以打劫的地方,但这次所有的房子围成了一个圈,这就意味着第一间房子和最后一间房子是挨着的。每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警。给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,你最多可以得到多少钱 在不触动报警装置的
2016-06-16 15:32:23 931
原创 打劫房屋
题目描述:假设你是一个专业的窃贼,准备沿着一条街打劫房屋。每个房子都存放着特定金额的钱。你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警。给定一个非负整数列表,表示每个房子中存放的钱, 算一算,如果今晚去打劫,你最多可以得到多少钱 在不触动报警装置的情况下。样例:给定 [3, 8, 4], 返回 8.动态规划问题。因为只
2016-06-16 10:28:57 1007
原创 编辑距离
题目描述:给出两个单词word1和word2,计算出将word1 转换为word2的最少操作次数。你总共三种操作方法:插入一个字符删除一个字符替换一个字符样例:给出 work1="mart" 和 work2="karma",返回 3与上一道题“不同的子序列”(详见:点击打开链接)有点类似,都是用动态规划处理两个字符串的的问题。其实我觉得大家做这种东西一定要对方法
2016-06-15 20:57:54 971
原创 不同的子序列
题目描述:给出字符串S和字符串T,计算S的不同的子序列中T出现的个数。子序列字符串是原始字符串通过删除一些(或零个)产生的一个新的字符串,并且对剩下的字符的相对位置没有影响。(比如,“ACE”是“ABCDE”的子序列字符串,而“AEC”不是)。 样例:给出S = "rabbbit", T = "rabbit",返回 3可以尝试用动态规划建立二维表格record,其中,record[
2016-06-15 14:55:57 665
原创 最长上升连续子序列
题目描述:给定一个整数数组(下标从 0 到 n-1, n 表示整个数组的规模),请找出该数组中的最长上升连续子序列。(最长上升连续子序列可以定义为从右到左或从左到右的序列。)样例:给定 [5, 4, 2, 1, 3], 其最长上升连续子序列(LICS)为 [5, 4, 2, 1], 返回 4. 给定 [5, 1, 2, 3, 4], 其最长上升连续子序列(LICS)为 [1, 2, 3, 4]
2016-06-14 16:53:39 2371
原创 不同的路径 II
题目描述:"不同的路径" 的跟进问题:现在考虑网格中有障碍物,那样将会有多少条不同的路径?网格中的障碍和空位置分别用 1 和 0 来表示。样例:如下所示在3x3的网格中有一个障碍物:[ [0,0,0], [0,1,0], [0,0,0]]上一道“不同的路径”的题目是这道题的背景(详见:点击打开链接),所以我在这里直接进入正题了,如果你不知道上一道题是怎
2016-06-14 15:00:50 1216
原创 房屋染色
题目描述:这里有n个房子在一列直线上,现在我们需要给房屋染色,分别有红色蓝色和绿色。每个房屋染不同的颜色费用也不同,你需要设计一种染色方案使得相邻的房屋颜色不同,并且费用最小。费用通过一个nx3 的矩阵给出,比如cost[0][0]表示房屋0染红色的费用,cost[1][2]表示房屋1染绿色的费用。样例:costs = [[14,2,11],[11,14,5],[14,3,10]] retur
2016-06-14 12:52:47 3445
原创 栅栏染色
题目描述:我们有一个栅栏,它有n个柱子,现在要给柱子染色,有k种颜色可以染。必须保证最多只有两个相邻的柱子颜色相同,求有多少种染色方案。样例:n = 3, k = 2, return 6 post 1, post 2, post 3way1 0 0 1 way2 0 1 0way3
2016-06-14 10:44:19 4337
原创 不同的路径
题目描述:有一个机器人的位于一个M×N个网格左上角。机器人每一时刻只能向下或者向右移动一步。机器人试图达到网格的右下角。问有多少条不同的路径?跟之前的那道“最小路径和”(详见:点击打开链接)是一模一样的逻辑,而且比之前还要简单。1. 看状态如何转移:到达网格的i行j列可能的路径为到达i - 1行,j列的路径数加上到达i行,j - 1列的路径数,因为机器人只有这两条途径能到达目的地[
2016-06-12 20:21:44 1227
原创 数字三角形
题目描述:给定一个数字三角形,找到从顶部到底部的最小路径和。每一步可以移动到下面一行的相邻数字上。样例:比如,给出下列数字三角形:[ [2], [3,4], [6,5,7], [4,1,8,3]]从顶到底部的最小路径和为11 ( 2 + 3 + 5 + 1 = 11)。按照之前讲的动态规划的解法,还是分两步,1. 找转移方程,2. 处理边
2016-06-12 19:51:44 1111
原创 最小路径和
题目描述:给定一个只含非负整数的m*n网格,找到一条从左上角到右下角的可以使数字和最小的路径。注意事项:你在同一时间只能向下或者向右移动一步典型的动态规划解决最优化问题。对于这类问题,解决思路可分为以下两步:1. 找到最优化问题与其子问题之间的关系,也就是写出状态转移方程(比如,我们在“爬楼梯”(详见:点击打开链接)问题中的f[i] = f[i - 1] + f[i - 2
2016-06-12 17:31:05 1561
原创 爬楼梯
题目描述:假设你正在爬楼梯,需要n步你才能到达顶部。但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部?样例:比如n=3,1+1+1=1+2=2+1=3,共有3中不同的方法,返回 3从这道题目开始,我们来解决一类之前从未接触过的算法问题:动态规划。动态规划与之前接触的“分治法”(详见:点击打开链接)类似,都是将一个大问题分解为小问题解决,最后将小问题的解按照某种规则合并,得到
2016-06-12 16:18:29 3438 1
原创 尾部的零
题目描述:设计一个算法,计算出n阶乘中尾部零的个数样例:11! = 39916800,因此应该返回 2如果直接计算阶乘的结果,再计算结果中尾部0的个数,那显然效率太低了,也当然不是这道题想表达的意思。我们再来看题目,求的是尾部0的个数,那其实就是计算1 * 2 *......*n这个数中,能分解出多少2和5构成的数对。而我们根据常识又知道,2的数目一定是大于5的数目的,所以,关
2016-06-09 11:09:50 834
原创 玩具工厂
题目描述:工厂模式是一种常见的设计模式。请实现一个玩具工厂 ToyFactory 用来产生不同的玩具类。可以假设只有猫和狗两种玩具。样例:做法跟上一道题“形状工厂”(详见:点击打开链接)是一致的,甚至还要更简单一些,基本的做法我在“形状工厂”中已经讲解过,此处省略,直接给出代码:"""Your object will be instantiated and calle
2016-06-07 23:06:55 1684
原创 形状工厂
题目描述:工厂模式是一种常见的设计模式。实现一个形状工厂 ShapeFactory 来创建不同的形状类。这里我们假设只有三角形,正方形和矩形三种形状。样例:考察对类的设计和类的方法的实现。由题目要求可知,我们首先要定义一个类:Shape,这个类作为三角形,正方形和矩形的父类,然后再定义三个由Shape这个类派生出来的子类:Triangle,Rectangle,Square,这三
2016-06-07 23:01:28 1008
原创 在二叉查找树中插入节点
题目描述:给定一棵二叉查找树和一个新的树节点,将节点插入到树中。你需要保证该树仍然是一棵二叉查找树。样例:给出如下一棵二叉查找树,在插入节点6之后这棵二叉查找树可以是这样的:
2016-06-07 18:14:31 1831
原创 O(1)时间检测2的幂次
题目描述:用 O(1) 时间检测整数 n 是否是 2 的幂次。样例:n=4,返回 true; n=5,返回 false.乍一看,好像没什么思路,最笨的思路就是一直除2,看最后能否等于1,但是显然不符合时间复杂度的要求。不过在之前学习位运算的过程中,我们了解过整数n与n - 1的关系(详见:点击打开链接):当n是偶数,n -1是奇数,二进制形式中,偶数尾巴上的所有0(直到倒数第一
2016-06-07 11:58:10 2044 1
原创 矩阵的之字型遍历
题目描述:给你一个包含 m x n 个元素的矩阵 (m 行, n 列), 求该矩阵的之字型遍历。样例:对于如下矩阵:[ [1, 2, 3, 4], [5, 6, 7, 8], [9,10, 11, 12]]返回 [1, 2, 5, 9, 6, 3, 4, 7, 10, 11, 8, 12]首先,先说明一下题目的意思。其实是以45度角方向遍历
2016-06-07 11:28:40 2027
原创 将整数A转换为B
题目描述:如果要将整数A转换为B,需要改变多少个bit位?样例:如把31转换为14,需要改变2个bit位。(31)10=(11111)2(14)10=(01110)2之前,我说过位运算的一些基本操作(详见:点击打开链接),此处其实求的是两个二进制中不同的位的个数。所以,可以采用两种方法。1. 直接求出两个数的二进制表示,然后比较两个01字符串的不同的位的个数2. 先
2016-06-07 09:40:33 1534
原创 Fizz Buzz 问题
题目描述:给你一个整数n. 从 1 到 n 按照下面的规则打印每个数:如果这个数被3整除,打印fizz.如果这个数被5整除,打印buzz.如果这个数能同时被3和5整除,打印fizz buzz.样例:比如 n = 15, 返回一个字符串数组:[ "1", "2", "fizz", "4", "buzz", "fizz", "7", "8", "fizz",
2016-06-07 09:06:53 1244
原创 余弦相似度
题目描述:给你两个相同大小的向量 A B,求出他们的余弦相似度;返回 2.0000 如果余弦相似不合法 (比如 A = [0] B = [0]).样例:给出 A = [1, 2, 3], B = [2, 3 ,4]. 返回 0.9926,给出 A = [0], B = [0]. 返回 2.0000python计算这种数据科学的东西简直是举重若轻,即使不用任何第三方的库,也能以很简洁
2016-06-07 08:59:40 4695
原创 哈希函数
题目描述:在数据结构中,哈希函数是用来将一个字符串(或任何其他类型)转化为小于哈希表大小且大于等于零的整数。一个好的哈希函数可以尽可能少地产生冲突。一种广泛使用的哈希函数算法是使用数值33,假设任何字符串都是基于33的一个大整数,比如:hashcode("abcd") = (ascii(a) * 33^3 + ascii(b) * 33^2 + ascii(c) *33 + ascii
2016-06-06 16:33:04 1329
原创 乱序字符串
题目描述:给出一个字符串数组S,找到其中所有的乱序字符串(Anagram)。如果一个字符串是乱序字符串,那么他存在一个字母集合相同,但顺序不同的字符串也在S中。样例:对于字符串数组 ["lint","intl","inlt","code"],返回 ["lint","inlt","intl"]还是使用哈希表。对于每个字符串出现的字符构成键,所在的索引构成值。这样,所有值中不止一个的,
2016-06-06 15:07:04 2809
原创 数组剔除元素后的乘积
题目描述:给定一个整数数组A。定义B[i] = A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1], 计算B的时候请不要使用除法。样例:给出A=[1, 2, 3],返回 B为[6, 3, 2]最直观的方法就是写两层循环,第一层遍历n个位置(n是数组长度),第二层遍历除了这个位置的元素之外的所有元素,计算乘积。这样做的时间复杂度为O(n^2);
2016-06-05 21:16:57 1242
原创 删除元素
题目描述:给定一个数组和一个值,在原地删除与值相同的数字,返回新数组的长度。元素的顺序可以改变,并且对新的数组不会有影响。样例:给出一个数组 [0,4,4,0,0,2,4,4],和值 4,返回 4 并且4个元素的新数组为[0,0,0,2]最简单的方法,一次扫描,若扫描到的元素与要删除的元素相等,删除就行。代码如下:class Solution: """ @par
2016-06-04 14:24:19 583
原创 连续子数组求和
题目描述:给定一个整数数组,请找出一个连续子数组,使得该子数组的和最大。输出答案时,请分别返回第一个数字和最后一个数字的下标。(如果两个相同的答案,请返回其中任意一个)样例:给定 [-3, 1, 3, -3, 4], 返回[1,4].做这道题之前,一定要先弄明白之前的一道题目“最大子数组”(详见:点击打开链接),那道题目要求我们求取一个数组的和最大的子数组的和。这道题和之前的一模一
2016-06-03 23:11:59 504
原创 装最多水的容器
题目描述:给定 n 个非负整数 a1, a2, ..., an, 每个数代表了坐标中的一个点 (i, ai)。画 n 条垂直线,使得 i 垂直线的两个端点分别为(i, ai)和(i, 0)。找到两条线,使得其与 x 轴共同构成一个容器,以容纳最多水。样例:给出[1,3,2], 最大的储水面积是2.根据题意,储水面积是由两个高度的最小值 * 两个高度间的水平距离构成的。描述成代码的语
2016-06-03 22:45:25 1172
原创 验证二叉查找树
题目描述:给定一个二叉树,判断它是否是合法的二叉查找树(BST)一棵BST定义为:1. 节点的左子树中的值要严格小于该节点的值。2. 节点的右子树中的值要严格大于该节点的值。3. 左右子树也必须是二叉查找树。4. 一个节点的树也是二叉查找树。之前,有一道验证平衡二叉树的问题(详见:点击打开链接),现在回过头看,那道题真的很值得好好学习借鉴,他既是典型的递归算法的应用
2016-06-03 16:56:14 1922
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人