python算法
黎明之道
One has to adapt to survive.
Standing on the Shoulders of Giants.
展开
-
python算法之分治算法(连续子列表的最大和)
连续子列表的最大和在一个列表中找到连续子列表的最大和。列表中的数字可负可正,并且子列表不能为空。问题提出:找到以下列表的最大子列表的和:[-2,1,-3,4,-1,2,1,-5,4]解题思路最大子列表有可能在左子列表、右子列表与右子列表之间。我们需要做的是找到左子列表的最大子列表的和、右子列表的最大子列表的和、左子列表与右子列表之间的子列表的最大和,再进行比较。三种可能:如何找到左子列表与右子列表的最大子列表的和呢?分治的想法是:让左子列表与右子歹表的子列表回答这个问题就可以了,此时此刻原创 2020-07-07 19:58:46 · 1010 阅读 · 1 评论 -
python算法之利用回溯算法解数独
利用回溯算法解数独小明最近对数独着迷,在玩游戏的时候,计算机程序能够立刻的出答案,好奇的它想知道计算机是怎么得出结果的。数独的游戏规则是根据盘面上的已知数字推理出空格里的数字,要求每一行、每一列、每一个粗线格中均含1~9,且不重复。问题求解:面对这样的问题,没有像公式一样的直接解决方式,所以只能靠尝试。就像在走迷宫,没有地图没所以面对每一个岔路口都只能以探索的形式深入,一旦发现路线不对就返回岔路口,选择另一个分支。把这个比喻用在数独上的话,每一个空格就是一个岔路口,而每一个岔路口都有9种选择。我们肯原创 2020-06-28 21:22:19 · 1212 阅读 · 1 评论 -
python算法之贪心算法解决活动安排问题
解决活动安排问题小明学校的阶梯教室经常开展各类活动那个,这些活动的开始和结束时间各异,且可能出现重叠,为了开展尽可能多的活动,要怎么安排?问题描述小明学校有讲座、演出、电影放映、辩论赛、考试和会议等一系列活动需要在阶梯教室举行,具体活动信息如下,怎么样安排才能使尽可能多的活动的得以开展?活动信息表:为了解决问题,我们考虑使用贪心算法解决问题。问题分析目标是在固定的教室中尽量多地安排活动,可以考虑的贪心策略有总是选择最早开始的、总是选择时间最短的、总是选择与其他活动冲突最少的、总是选择结束时间原创 2020-06-24 20:26:02 · 3406 阅读 · 0 评论 -
python算法之贪心算法(硬币找零问题)
硬币找零问题贪心算法贪心算法遵循某种既定原则,不断地选取当前条件下最优的选择来构造每一个子步骤,直到获得问题最终的求解。即在求解时,总是做出当前看来最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是局部最优解。利用贪心算法解题,需要解决以下两个问题。是问题是否适合用贪心法求解,即所求解问题是否具有贪心选择性质。所谓贪心选择性质,是指应用同一规则,将原问题变为一个相似的但规模更小的子问题,后面的每一步都是当前看似最佳的选择。这种选择依赖于已做出的选择,但不依赖于未做出的选择。从全局来看,运原创 2020-06-23 21:46:51 · 5836 阅读 · 3 评论 -
python算法之利用广度优先遍历解决二叉树的右侧问题
二叉树的右侧问题:小明和小伙伴去摘柠檬,小明负责摘树的右侧的柠檬,假如柠檬树的每个树干只有两个树枝、一个树枝、零个树枝三种可能,那么一棵树可以被看作一颗二叉树,小明摘树的右侧,让我们算一下,它可以摘到哪些柠檬。解决问题这个问题可以用二叉树来表示,如图:树1:树2:对于树1来说,小明可以摘到的柠檬为1、3、6、7这四个柠檬。对于树2来说,小明可以摘到的柠檬为1、3、5、7,也就是说要摘下站在树右边能看到的柠檬。注意:二叉树是每个节点最多有两个子树的树结构此时,本题的问题就变成了给定一颗原创 2020-06-19 12:25:34 · 310 阅读 · 0 评论 -
Python算法之括号匹配的问题【带详细注释的代码】(广度优先遍历算法)
合法的括号问题:为了帮助老师更快的修改学生的括号匹配问题,小明决定开发一个程序,来寻找正确的小括号组合我们包含括号的合法的字符串并不陌生,字符串中的左右括号数应该相同,而且每个右括号左边一定有其对应的左括号,给定一个包含括号的字符串,那么问题就变成了在一个给定的输入字符串中,移除掉最少量的错误括号,从而使得这个括号变为有效的字符串,并且返回所有有效的字符串。问题解析:注意:字符串中除了‘(’和‘)’之外,还有字母和数字。例如:有一个学生写了这样一个字符串:(a)(b))(),我们的程序应该能够识别原创 2020-06-16 19:30:17 · 1561 阅读 · 0 评论 -
python算法之广度优先遍历算法(解决选课的烦恼程序)
广度优先遍历(解决选课的烦恼程序)广度优先遍历也是从某个状态出发查询可以达到的所有状态,总是先去查询距离初始状态最近的状态。问题:小郎正在面临选课的问题,我们要学习计算机基础、数学、英语、算法、Java等五门课程,其中学习算法前需要先学习Java、英语,学Java前又需要学数学和计算机基础,那么小郎该如何选课?选课图:解决问题我们先给每门课设置一个编号,编号从0卡死hi。先选课的关系如何表达呢,课程与课程间的依赖关系以一个二维数组的形式给出,如下图。例如数组中第一行第三列的1表示课程0是课程2原创 2020-06-09 21:17:47 · 595 阅读 · 0 评论 -
python算法之二叉树中的最大路径和程序
二叉树中的最大路径和写一个程序,输出最大可能的路径和。源代码:#给定一颗二叉树,求各个路径的最大和,路径可以以任意结点作为起点和终点。class TreeNode: #二叉树节点定义 def __init__(self, val): self.val = val #节点值 self.left = None #左节点值 self.right = None#右节点值class IntRef: def __init__(self):原创 2020-06-06 19:26:54 · 1268 阅读 · 0 评论 -
python算法之深度优先遍历算法(二叉树、怎么抓住小偷源程序)
深度优先遍历深度优先遍历问题一定要按照规则尝试所有的可能才行。深度优先遍历算法是经典的图论算法,从某个节点v出发开始进行搜索,不断搜索直到该节点的所有边都被遍历完。当节点v的所有边都被遍历以后,深度优先遍历算法则需要回溯到v的前驱节点,来继续搜索这个前驱节点的其他边。如果还存在尚未遍历的节点,则深度优先遍历算法将会按照同意的规则从这些剩下的节点中选择一个节点在重复同样的遍历过程。这样的搜索过程从最开始的节点一直持续到最后一个节点的所有边都遍历完。二叉树二叉树有几个特殊的类型:空二叉树、满二叉树、完原创 2020-06-04 20:34:12 · 732 阅读 · 0 评论 -
python算法之神奇的词根(替换词根)
神奇的词根问题:字典为[“cat”,“bat”,“rat”],句子为"the cattle was ralled by the battery",经过替换,输出句子为"the cat was by the bat“。解决:首先建立两个字典,并做好初始化工作。在建立字典时我们使用collections.defaultdict()建立一个默认字典,它本身是一个字典,只不过python会自动为他的键赋一个初始值。接下来,以每一个词根的首字母为键,把每一个词根放到键所对应的值中去,这里的值是一个集合(s原创 2020-06-03 20:49:07 · 1661 阅读 · 0 评论 -
python算法 之 猜词游戏
猜词游戏问题:一个人写下几个数字让另一个人猜,当每次答题方猜完之后,出题方会给答题方一个提示,告诉他刚才的猜测中有多少位数字和确切位置都猜对了(成为“Bulls”,公牛),还有多少位数字猜对了但是位置不对(称为“Cows”,奶牛)。答题方将会根据出题方的提示继续猜,直到猜出秘密数字为止。写一个程序,它能根据秘密数字和朋友的猜测数返回提示,其中用A表示公牛,用B表示奶牛。解决:解决查找公奶(A)的数量。首先定义一个变量A表示公奶的数量,之后循环把每个位置上的数字都取出来,按位置对比即可,数字一样则让原创 2020-06-03 20:37:43 · 1118 阅读 · 0 评论 -
python算法之单词模式匹配
单词模式匹配首先给定两个字符串,一个是单词模式字符串,以恶是目标字符串。之后检查目标字符串是否为给定的单词模式,即求目标字符串中单词出现的规律是否符合单词模式字符串中的规律。例如:单词模式字符串为“一二二一”,目标字符串为“苹果 香蕉 香蕉 苹果”,二者的规律一样,匹配成功。首先建立哈希表来存储数据,由于不仅需要排除一个模式对应多个字符串的情况,还需要排除多个模式对应一个字符的情况,我们需要建立两个哈希表:hash和used。hash用来存储模式字符串和目标字符串的对应关系,used记录目前已经使用原创 2020-06-03 20:25:54 · 1219 阅读 · 0 评论 -
python算法之两个数的和
两个数的和在给定的一些数字中找出两个数,使得他们的和为N,前提是数据中保证有答案,并且只有一个答案。例如给定5个数字:3,4,5,7,10,从中选择两个数使他们的和为11,可以选择4和7,如何解决这个问题?第一种求和方法先将数组从小到大排序,排序时需要把数据复制到一个新的数组中,然后对新的数组进行排序。数组排序后,可以开始查找了。建立两个指针left和right,分别指向新数组的第一个元素和最后一个元素。如果俩个指针的两个数据相加的和等于目标值,那么查找结束,返回这两个数的下标,如果他们的和小于目标原创 2020-06-03 19:33:23 · 4971 阅读 · 0 评论 -
python算法之链表(单链表、双链表、插入元素、删除元素)
链表链表是用指针连接的用于存储数据的数组,它最大的优点在于可以有效利用零碎的内存空间。如果使用了链表,则可以改变数组的长度,并且可以在同一个数组中存储不同类型的元素。一、 单链表1.输出一个由两个列表组成的单链表:源代码:#输出一个由两个列表组成的单链表ListValue = [1,5,6,2,4,3]ListPointer = [3,2,-1,5,1,4]head = 0 #head是指向链表第一个元素的指针,需要自己定义print(ListValue[head])#直接输出第一原创 2020-06-02 21:01:59 · 1472 阅读 · 1 评论 -
python算法之双指针问题
用指针合并两个有序数组指针的意思是内存空间的地址。可以通过一个数组中每个元素的下标来找出它的值,所以存储这个元素位置的下标值的变量可以看作一个指针。将这个概念来实现python中的指针问题,由于它不是真正意义上的指针,所以我们家他“模拟指针问题”。有两个从小到大党的有序排列的数组:1,3,4,6,102,5,8,11第一个数组里有5个元素,第二个数组里有4个元素。要想把他们合并成一个性的从小到大排列的数组,实现编程如下:源代码:#用指针很冰两个有序数组arr1 = [1,3,4,6,10]原创 2020-06-02 18:02:31 · 481 阅读 · 0 评论