数据结构与算法
wenbin1996
最怕自己一生碌碌无为,还安慰自己平凡可贵。
展开
-
字符串问题---判断两个字符串是否为变形词
【问题】 给定两个字符串str1和str2,如果str1和str2中出现的字符种类一样并且每种字符出现的次数也一样,那么str1与str2互为变形词。请实现函数判断两个字符串是否互为变形词。【举例】 str1 = “123”,str2 = “231”,返回True str1 = “123”,str2 = “2331”,返回False【基本思路】如果两个字符串的长度不相同,直接返回原创 2017-08-16 23:21:35 · 1411 阅读 · 0 评论 -
字符串问题---字符串中数字子串的求和
【题目】 给定一个字符串str,求其中全部数字串所代表的数字之和。要求如下:忽略小数点字符,例如“A1.3”,其中包含两个数字1和3.如果紧贴数字子串的左侧出现字符“-”,当连续出现的数量为奇数时,则数字视为负,连续出现的数量为偶数时,则数字视为正。例如,“A-1BC–12”,其中包含数字-1和12。【举例】 str = “A1CD2E33”返回36. str = “A-1B原创 2017-08-17 00:01:00 · 3575 阅读 · 0 评论 -
字符串问题---去掉字符串中连续出现k个0的子串
【题目】 给定一个字符串str和一个整数k,如果str中刚好有连续的k个‘0’字符出现时,把k个连续的‘0’字符删除,返回处理后的字符串。【举例】 str = “A00B”,k = 2,返回 “AB”。 str = “A0000B000”,k = 3,返回 “A0000B”。【基本思路】使用两个变量count和start。count表示目前出现的连续‘0’的个数,start表示连原创 2017-08-17 00:27:03 · 953 阅读 · 0 评论 -
递归与动态规划---N皇后问题的递归方法和位运算方法
问题: N皇后问题是指在N×N的棋盘上要摆N个皇后,要求任何两个皇后不同行、不同列,也不在同一条斜线上。给定一个整数N,返回N个皇后的摆法有多少种。基本思路:1.递归方法。如果在位置(i,j)放置了一个皇后,那么那些位置就不能在放置皇后了呢?整个 i 行都不能放置整个 j 行都不能放置如果位置(a,b)满足 |a - i| = |b - j|,说明(a,b)与(i,j)处在同一条斜线上,也不原创 2017-08-15 21:30:52 · 890 阅读 · 0 评论 -
递归与动态规划---数组中的最长连续序列
问题: 给定无序数组,返回其中最长的连续序列的长度。举例: arr = [100, 4, 200, 1, 3, 2],最长的连续序列为[1, 2, 3, 4],所以返回4。基本思路: 利用哈希表可以实现时间、空间复杂度都为O(N)的方法。具体过程如下:生成哈希表map,key表示遍历过的某个数,value代表key这个数所在的最长连续序列的长度。从左到右依次遍历数组,假设遍历到ar原创 2017-08-15 20:30:45 · 1007 阅读 · 0 评论 -
递归与动态规划---排成一条线的纸牌博弈问题
问题: 给定一个整型数组arr,代表数值不同的纸牌排成一条线。玩家A和玩家B依次拿走每张纸牌,规定玩家A先拿,玩家B后拿,但是每个玩家每次只能拿走最左边或者最右边的一张牌,最后所拿牌累加和最大的玩家获胜,玩家A和玩家B都绝顶聪明。请返回最后获胜者的分数。举例: arr = [1, 2, 100, 4] 玩家A先拿1,玩家B拿4,玩家A再拿100,玩家B再拿2,游戏结束,玩家A获胜,原创 2017-08-15 19:01:33 · 963 阅读 · 1 评论 -
递归与动态规划---数字字符串转换为字母组合的种数
问题: 给定一个字符串str,str全部由数字字符组成,如果str中某一个或者某相邻两个字符组成的子串在1~26之间,则这个子串可以转换为一个字母。规定“1”转换为“A”,“2”转换为“B”……“26”转换为“Z”。求str有多少种不同的转换结果。举例: str = “1111” 能转换成的结果有“AAAA”,“LAA”,“ALA”,“AAL”和“LL”,返回5。 str =原创 2017-08-15 13:35:02 · 1733 阅读 · 0 评论 -
递归与动态规划---龙与地下城游戏问题
问题: 给定一个二维数组map,含义是一张地图,例如如下,矩阵: -2 -3 3 -5 -10 1 0 30 -5 游戏规则如下:骑士从左上角出发,每次只能向右或者向下走,最后到达右下角见到公主。地图中每个位置的只代表骑士要遭遇的事。如果是负数,表示此处有怪兽,要让骑士损失血量。如果是非负数,表示此处有血瓶,能让骑士回血。骑士从左上角到右下角的过程,走到原创 2017-08-15 13:08:02 · 2087 阅读 · 0 评论 -
递归与动态规划---字符串的交错组成
问题: 给定三个字符串str1, str2和aim, 如果aim包含且仅包含str1和str2的所有字符,而且在aim中属于str1的字符之间保持原来在str1中的顺序,属于str2的字符之间保持原来在str2中的顺序,那么称aim是str1和str2的交错组成。实现一个函数,判断aim是否是str1和str2的交错组成。举例: str1 = “AB”, str2 = “12”。那么”A原创 2017-08-14 02:07:45 · 672 阅读 · 0 评论 -
递归与动态规划---最小编辑代价
问题: 给定两个字符str1和str2,再给定三个整数ic,dc,rc,分别代表插入,删除和替换一个字符的代价,返回将str1编辑成str2的最小代价。举例: str1 = “abc”,str2 = “adc”,ic = 5,dc = 3,rc = 100。 从str1编辑到str2,先删除’b’,然后插入’d’是代价最小的,所以返回8。基本思路: 如果str1的长度为N,str2的长度为M原创 2017-08-14 01:34:31 · 1544 阅读 · 0 评论 -
递归与动态规划---最长公共子串问题
问题: 给定两个字符串str1和str2,返回两个字符串的最长公共子串。举例: str1 = “1AB2345CD”,str2 = “12345EF”,返回”2345”。基本思路: 假设str1的长度为N,str2的长度为M,生成N×M的矩阵dp,dp[i][j]的含义是必须以str1[i]和str2[j]结尾的最长公共子串的长度,dp[i][j]的计算方法如下:矩阵的第一行。如果s原创 2017-08-13 22:52:03 · 1532 阅读 · 0 评论 -
递归与动态规划---最长公共子序列问题
问题: 给定两个字符串str1和str2,返回两个字符串的最长公共子序列。举例: str1 = “1A2C3D4B56”,str2 = “B1D23CA45B6A”. “123456”或者”12C4B6”都是最长公共子序列,返回哪一个都行基本思路: 如果str1和str2的长度分别为N,M,生成N×M的矩阵dp,dp[i][j]的含义是str1[0…i]与str2[0…j]的最长公共子序列,原创 2017-08-13 20:55:21 · 1251 阅读 · 0 评论 -
递归与动态规划---汉诺塔问题
问题: 给定一个整数n,代表汉诺塔游戏中从小到大放置的n个圆盘,假设开始时所有的圆盘都放在左边的柱子上,想按照汉诺塔游戏的要求把所有的圆盘都移到右边的柱子上,实现函数打印最优移动轨迹。 举例: n = 2时,打印: move from left to mid move from left to right move from mid to right 基本思路:原创 2017-08-13 20:26:55 · 2364 阅读 · 0 评论 -
递归与动态规划---换钱的方法数
问题: 给定数组arr,arr中所有的值都为整数且不重复。每个值代表一种面值的货币,每种货币有无数张,再给定一个整数aim代表要找的钱数,求换钱的方法有多少种。 基本思路: 这道题的经典之处在于它可以体现暴力递归、记忆搜索、动态规划之间的关系,并可以在动态规划的基础上再进行一次优化。 首先介绍暴力递归的方法。如果arr = [5, 10, 25, 1],aim = 1000,分析过程如原创 2017-08-12 16:55:35 · 1969 阅读 · 0 评论 -
递归与动态规划---换钱的最少货币数(每种货币只有一张)
题目: 给定一个数组arr,arr中所有的值都为正数且不重复,每个值代表一种面值的货币,每种面值的货币只有一张,再给定一个整数aim代表要找的钱数,求组成aim的最少货币数。 基本思路: 生成dp数组,数组的每一行和每一列可以先确定,其他的位置dp[i][j] = min(dp[i-1][j], dp[i-1][j-arr[i]]+1)#python3.5#经典动态规划实现def原创 2017-08-12 00:18:12 · 845 阅读 · 0 评论 -
递归与动态规划---换钱的最少货币数(每种货币有无数张)
题目: 给定一个数组arr,arr中所有的值都为正数且不重复,每个值代表一种面值的货币,每种面值的货币有无数张,再给定一个整数aim代表要找的钱数,求组成aim的最少货币数。 基本思路: 生成dp数组,数组的每一行和每一列可以先确定,其他的位置dp[i][j] = min(dp[i-1][j], dp[i][j-arr[i]]+1)#python3.5#经典动态规划实现def mi原创 2017-08-12 00:15:12 · 3312 阅读 · 1 评论 -
二叉树问题---在二叉树中找到累加和为指定值的最长路径长度
题目: 给定一棵二叉树的头节点head和一个32位整数sum,二叉树节点值类型为整型,求累加和为sum的最长路径长度。路径是指从某个节点往下,每次最多选择一个孩子节点或者不选所组成的节点链。def getMaxLength(root, K): def getLengthByPreOrder(root, K, preSum, level, length, map):原创 2017-07-31 02:09:11 · 1902 阅读 · 0 评论 -
递归与动态规划---最长递增子序列问题
问题: 给定数组arr,返回arr的最长递增子序列基本思路: 首先介绍时间复杂度为O(N^2)的方法。具体过程如下:生成长度为N(arr的长度)的数组dp,dp[i]表示在以arr[i]结尾的情况下,arr[0…i]中的最长子序列。dp[0]表示以arr[0]结尾的情况下最长子序列,只有它自己,设为1对于dp的其他位置,从左到右依次遍历,假设遍历到i,首先在arr[0…i-1]中找到比原创 2017-08-13 00:03:45 · 4857 阅读 · 0 评论 -
递归与动态规划---矩阵的最小路径和
【题目】 给定一个矩阵m,从左上角开始每次都只能向下或者向右走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有路径中最小的路径和。【基本思路】 生成和m同样大小的矩阵dp,dp[i][j]的值表示从左上角走到位置(i, j)的最小路径和,矩阵的第一行和第一列的值可以先确定,其他的位置dp[i][j]的值等于min(dp[i-1][j], dp[i][j-1...原创 2017-08-12 00:06:58 · 1025 阅读 · 0 评论 -
二叉树问题---统计完全二叉树的节点个数
基本思路: 可以利用完全二叉树的性质,首先判断头节点的右子树的最左节点是否和头节点的最左节点在同一层。 如果在的话,说明头节点的左子树是一棵满二叉树,可以用公式计算出左子树的节点个数,再加上头节点,也就是(2^h-1)+1,接下来再计算右子树的个数,可以用递归的方式求出来。 同理,如果头节点的右子树的最左节点和头节点的最左节点不在同一层,则右子树是一棵满二叉树,可以用公式计算出右子原创 2017-08-11 23:46:47 · 1086 阅读 · 1 评论 -
二叉树问题---统计所有可能的二叉树结构的种数
问题: 给定一个整数N,如果N<1,代表空树结构,否则代表中序遍历的结果为{1,2,3,…,N}。请返回可能的二叉树结构有多少。 基本思路: 假设num[n]代表n个节点的搜索二叉树有多少种可能。假设序列{1 , …, i , … , N},如果以i作为头结点,i的左子树有i-1个节点,所以可能的结构有num[i-1]种,右子树有N-i个节点,所以有num[N-i]种可能,故以i作为头原创 2017-08-11 23:35:00 · 1391 阅读 · 0 评论 -
二叉树问题---通过先序和中序数组生成后序数组
基本思路: 根据当前的先序和中序数组,设置后序数组最右边的值,然后划分出左子树的先序、中序数组,以及右子树的先序、中序数组,先根据右子树的划分设置好后序数组,再根据左子树的划分,从右边到左边依次设置好后序数组的全部位置#python3.5#通过先序和中序数组生成后序数组def preInToPos(pre, mid): def preInPos(pre, pi, pj, mid,原创 2017-08-11 23:20:23 · 1028 阅读 · 0 评论 -
递归与动态规划---跳跃游戏
题目: 给定数组arr,arr[i] == k代表可以从位置i向右跳1~k个距离。比如,arr[2] == 3,代表从位置2可以跳到位置3、位置4或者位置5。如果从位置0出发,返回最少跳几次能跳到arr最后的位置上。举例: arr = [3, 2, 3, 1, 1, 4] arr[0] = 3,选择跳到位置2;arr[2] == 3,可以跳到最后的位置,所以返回2。基本思路:1.使原创 2017-08-15 20:04:22 · 823 阅读 · 0 评论 -
二叉树的一些操作的代码实现
计算树的深度def getDepth(root): if not root: return 0 return 1 + max(getDepth(root.left), getDepth(root.right))计算树的带权路径长度def getWPL(root, depth=0): if not root: return 0 if no原创 2017-07-28 01:29:12 · 319 阅读 · 0 评论 -
八大经典排序算法基本思想及代码实现(Python、C++)
一.插入排序——简单插入排序基本思想:每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。void insertSort(vector<int> &arr){ if(arr.size() <= 1) { return; } int j; int tmp; ...原创 2017-07-26 12:56:16 · 1011 阅读 · 0 评论 -
字符串问题---替换字符串中连续出现的指定字符串
【题目】 给定三个字符串str,from和to,已知from字符串中没有重复字符,把str中所有from的子串全部替换成to字符串,对连续出现from的部分要求只替换一个to字符串,返回最终的结果字符串。【举例】 str = “123abc”,from = “abc”,to = “4567”,返回“1234567”。 str = “123”,from = “abc”,to = “4567”原创 2017-08-18 21:44:41 · 727 阅读 · 0 评论 -
字符串问题---字符串的统计字符串
【题目】 给定一个字符串str,返回str的统计字符串。例如,“aaabbadddffc”的统计字符串为“a_3_b_2_1_d_3_f_2_c_1”。【补充题目】 给定一个字符串的统计字符串cstr,再给定一个整数index,返回cstr所代表的原始字符串上第index个字符。例如,”a_1_b_100”所代表的原始字符串上第0个字符是‘a’,第50个字符是‘b’。【基本思路】 原问题。从左原创 2017-08-18 22:21:53 · 1298 阅读 · 0 评论 -
字符串问题---判断字符数组中是否所有的字符只出现了一次
【题目】 给定一个字符类型数组chas,判断chas中是否所有的字符都只出现过一次。【基本思路】 一.时间复杂度为O(N)的算法。 使用哈希表,记录每个字符出现的频数,如果发现字符的频数不为1,直接返回False。 二.时间复杂度为O(NlogN),空间复杂度为O(1)的算法。 1.先将数组排序,再判断当前字符是否等于前一个字符即可。 2.关键使用什么原创 2017-08-18 22:31:09 · 1487 阅读 · 0 评论 -
字符串问题---字符串的调整与替换
【题目】 给定一个字符类型的数组chas[],chas的右半区全是空字符,左半区不含有空字符。现在想将左半区中所有的空格字符替换成“%20”,假设chas的右半区足够大,可以满足替换所需要的空间,请完成替换函数。要求时间复杂度O(N),空间复杂度O(1)。【补充题目】 给定一个字符类型的数组chas[],其中只含有数字字符和‘ * ’字符。现在想将所有的 ‘ * ’字符都放在chas的左边,数字原创 2017-08-19 12:09:56 · 2090 阅读 · 1 评论 -
字符串问题---翻转字符串
【题目】 给定一个字符类型的数组chas,请在单词间做逆序调整,只要做到单词顺序逆序即可,对空格的位置没有特别要求。例如把chas看成字符串为“I love you”,调整成“you love I”。【补充题目】 给定一个字符类型的数组chas和一个整数size,请把大小为size的左半区整体移到右半区,右半区整体移到左边。例如,如果把chas看作字符串“ABCDE”,size = 3,调整成“原创 2017-08-19 18:11:21 · 1387 阅读 · 0 评论 -
字符串问题---数组中两个字符串的最小距离
【题目】 给定一个字符串数组strs,再给定两个字符串str1和str2,返回strs中str1与str2的最小距离,如果str1或str2为null,或不在strs中,返回-1。【基本思路】 从左到右遍历strs,用变量last1记录最近一次出现的str1的位置,用变量last2记录最近一次出现str2的位置。如果遍历到str1,那么i - last2就是当前的str1和左边离它最近的str2原创 2017-08-19 18:59:39 · 1040 阅读 · 0 评论 -
二叉树问题---先序,中序,和后序数组两两结合重构二叉树
注意: 如果一棵二叉树除叶节点之外,其他的节点都有左孩子和右孩子,这样的树才能被先序和后序数组重建#python3.5#先序,中序数组重构二叉树def preInToTree(pre, mid): def preIn(pre, pi, pj, mid, mi, mj, map): if pi > pj: return None原创 2017-08-11 23:13:42 · 529 阅读 · 0 评论 -
二叉树问题---在二叉树中找到两个节点的最近公共节点
问题:给定一棵二叉树的头节点head,以及这棵树中的两个节点o1和o2,请返回o1和o2的最近 公共祖先节点基本思路: 后序遍历二叉树,假设遍历到的当前节点为cur,首先依次遍历它的左孩子和右孩子,此时可能发生以下的四种情景:如果发现cur等于None,或者等于o1或者等于o2,返回cur如果左孩子和右孩子都为空,说明cur整棵子树上没有出现过o1和o2,返回None如果左孩子和右孩子原创 2017-08-11 22:45:28 · 981 阅读 · 0 评论 -
二叉树问题---找到二叉树中的最大搜索二叉子树
题目: 给定一棵二叉树的头节点head,已知其中所有节点的值都不一样,找到含有节点最多的搜索二叉树,并返回这棵子树的头节点。(注意子树的概念)def biggestSubBST(root): def findBiggestSubBST(root, record): if not root: record[0] = 0 reco原创 2017-07-31 02:14:46 · 786 阅读 · 0 评论 -
二叉树问题---打印二叉树的边界节点
问题:给定一棵二叉树的头节点,按照如下两种标准分别实现二叉树边界节点的逆时针打印。 标准一:1.头节点为边界节点2.叶节点为边界节点3.如果节点在其所在层中的最左边或最右边,那么也是边界节点标准二:1.头节点为边界节点2.叶节点为边界节点3.树左边界延伸下去的路径为边界节点4.树右边界延伸下去的路径为边界节点#标准一def printEdge1(root): def get原创 2017-07-31 01:55:42 · 1396 阅读 · 0 评论 -
二叉树问题---较为直观的打印二叉树
class TreeNode: def __init__(self, x): self.val = x self.left = None sele.right = Nonedef printTree(root): if not root: return print("Binary Tree: ") pr原创 2017-07-31 01:51:36 · 909 阅读 · 1 评论 -
二叉树问题---二叉搜索树查找、插入与删除的代码实现
class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None查找def Find(root, x): if not root: print("The number {} is not found".format原创 2017-07-26 17:44:42 · 624 阅读 · 1 评论 -
二叉树问题---二叉树的前中后序的递归,非递归及Morris遍历
class TreeNode: def __init__(self, x): root.val = x root.left = None root.right = None创建二叉树def create_tree(root): element = input("Enter a key:") if element == '#':原创 2017-07-26 11:12:05 · 869 阅读 · 0 评论 -
二叉树问题---通过有序数组生成平衡搜索二叉树
#通过有序数组生成平衡搜索二叉树def generateTree(arr): def generate(arr, start, end): if start > end: return None center = (start + end) // 2 head = TreeNode(arr[center])原创 2017-08-02 02:03:54 · 709 阅读 · 0 评论 -
二叉树问题---判断一棵树是否为完全二叉树
#判断一棵树是否为完全二叉树def isCBT(root): if not root: return True isLeaf = False queue = [] queue.append(root) while queue: root = queue.pop(0) left = root.left原创 2017-08-02 02:03:12 · 531 阅读 · 0 评论