算法
Aamax
这个作者很懒,什么都没留下…
展开
-
排序算法(直接插入、折半插入、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序、基数类排序)
目录一、概述二、算法复杂度三、插入类排序 1.直接插入排序 2.折半插入排序 3.希尔排序四、交换类排序 1.冒泡排序 2.快速排序五、选择类排序 1.简单选择排序 2.堆排序六、归并排序 1.二路归并排序七、基数排序 1.基数...原创 2019-08-16 21:29:43 · 12192 阅读 · 7 评论 -
Python算法——查找数组前三名
要求: 在数组中找出前k大的值(如k=3)分析: 最大的三个数比数组中其他数都大,因此可以利用类似求最大值的方法求前三名,具体思路为:初始化前三名(r1:第一名,r2:第二名,r3:第三名)为最小整数,然后遍历数组:(1)如果当前值tmp大于r1:r3=r2,r2=r1,r1=tmp;(2)如果当前值tmp大于r2且不等于r1:r3=r2,r2=tmp...原创 2019-08-08 12:19:08 · 4661 阅读 · 0 评论 -
Python算法——求数组中两个元素最小距离(动态规划)
要求: 给定一个数组,数组中含有重复元素,给定两个数字num1和num2,求这两个数字在数组中出现位置的最小距离。分析: 方法一:蛮力法 主要思路为:对数组进行双重遍历,外层循环遍历查找num1,只要遍历到num1,内层循环对数组从头开始遍历找num2,每当遍历到num2,就计算他们距离dist。当遍历结束后最小的dist值就是他们最小的距离。...原创 2019-08-08 22:41:54 · 3197 阅读 · 0 评论 -
Python算法——求解最小三元组距离
要求: 已知三个升序整数数组a[l], b[m]和c[n],请在三个数组中各找一个元素,使得组成的三元组距离最小。三元组的距离定义是:假设a[i]、b[j]和c[k]是一个三元组,那么距离为:Distance = max(|a[ i ] – b[ j ]|, |a[ i ] – c[ k ]|, |b[ j ] – c[ k ]|),请设计一个求最小三元组距离的最优算法,并分析时间...原创 2019-08-09 11:57:58 · 1158 阅读 · 0 评论 -
Python算法——求数组中绝对值最小的数
要求: 对于升序排列数组,数组中有正数、负数、或0,求数组中元素的绝对值最小的数。例如数组[-10,-5,-2,7,15,50]中绝对值最小的数为-2。分析: 方法一:顺序比较法 最简单的方法就是从头到尾遍历数组元素,对每个数字求绝对值,然后比较就可以求出绝对值最小的数。 方法二:二分法 求绝对值最小的数分为三种情...原创 2019-08-09 18:23:15 · 6433 阅读 · 0 评论 -
Python算法——求数组连续最大和
要求: 一个有n个元素的数组,这n个元素既可以是正数也可以是负数,数组中连续的一个或多个元素组成一个连续的子数组,求子数组和的最大值。例如数组[1,-2,4,8,-4,7,-1,-5],其最大和的子数组为[4,8,-4,7],最大值为15。分析: 方法一:蛮力法 找出所有的子数组,然后求出子数组的和,在所有子数组的和中取最大值。 ...原创 2019-08-09 21:43:25 · 3093 阅读 · 0 评论 -
Python算法——对数组逆时针45°旋转
要求: 将一个n*n的二维数组逆时针旋转45°后打印。 分析: 从右上角开始对数组中的元素进行输出实现代码:# -*- coding:utf-8 -*-def rotateArr(arr): lens = len(arr) #打印二维数组对角线右上半部分 i = lens-1 while i > 0: ...原创 2019-08-10 11:20:20 · 1137 阅读 · 0 评论 -
Python算法——求集合的所有子集
要求: 有一个集合,求其全部子集(包含集合自身)。例如集合[1,2,3]其全部子集为:<∅,1,2,12,3,13,23,123>分析: 方法一:位图法 ①使用两层循环,外层循环为子集个数,对于集合长度为N,子集个数为。外层循环每循环一次一个子集。内层循环用来判断二进制下标为i的位置数是否为"1",如果对应位为1,那么就输出这个位...原创 2019-08-11 17:32:05 · 19598 阅读 · 5 评论 -
Python算法——对数组进行循环移位
要求: 对含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。分析: 方法一:蛮力法 要求将数组元素循环右移K位,只需要每次将数组中元素右移一位,循环K次即可。如原数组为abcd1234,右移4位具体移动过程为abcd1234-->4abcd123-->34abcd12-->1234abcd。...原创 2019-08-11 19:01:22 · 4999 阅读 · 0 评论 -
Python算法——如何在有规律的二维数组中进行高效数据查找
要求: 二维数组每一行按照从左到右递增顺序排列,每一列按照从上到下顺序排列。实现一个函数,输入一个整数判断数组中是否含有该整数。分析: 最简单的方法就是对二维数组进行顺序遍历,然后判断待查找元素是否在数组中,这种时间复杂度为O(M*N),M,N分别为二维数组行数和列数。但顺序遍历不是最好的方法,当数组有序的时候,二分查找是一个很好的方法,具体思路如下:给定数...原创 2019-08-11 19:36:08 · 1086 阅读 · 0 评论 -
Python算法——如何寻找最多的覆盖点
要求: 列表上从左到右依次为点a[0]、a[1]、a[2]、a[3]...a[n-1],假设一根木棒长度为L,求L最多能覆盖列表的几个点?分析: 本题求a[j]-a[i]≤L && a[j+1]-a[i]>L(其中i<j)这两个条件的 j 与 i 中间所有点的个数中的最大值,即 j-i+1 最大,思路为直接从左到右扫描,使用两个索引 ...原创 2019-08-12 10:32:50 · 1057 阅读 · 0 评论 -
Python算法——如何求解迷宫问题(回溯法)
要求: 给定一个N*N的迷宫,从迷宫左上角(对应矩阵[0][0])走到迷宫右下角(对应矩阵[N-1][N-1]),只能向两方向移动:向右或向下。在迷宫中0表示没有路,1表示有路。分析: 这里使用回溯法,当碰到死胡同时,回溯到前一步,然后从前一步出发继续寻找可达路径。 申请一个结果矩阵用来标记移动路径 if 到达了目的地 ...原创 2019-08-12 15:41:50 · 3925 阅读 · 0 评论 -
Python算法——如何从三个有序数组中找出公共元素
要求:给定以非递减顺序排序的三个数组,找出这三个数组的公共元素。如ar1 = [2,5,12,20,45,85],ar2 = [16,19,20,85,200], ar3 = [3,4,15,20,39,72,85,190],那么其公共元素为[20,85]。分析: 假设当前遍历的三个数组元素分别为ar1[i]、ar2[j]、ar3[k],则存在以下几种可能性: ...原创 2019-08-12 16:56:41 · 1044 阅读 · 0 评论 -
Python算法——如何求两个有序集合的交集
要求: 两个有序集合,集合中每个元素都是一段范围,求其交集。例如集合{[4,8],[9,13]}和{[6,12]}的交集为{[6,8],[9,12]}。分析: 方法一:蛮力法 最简单方法就是遍历两个集合,针对集合中每个元素判断是否有交集,如果有,则求其交集。 方法二:特征法 方法一没有利用集合有序的特点,因此,不是...原创 2019-08-12 18:21:27 · 2741 阅读 · 0 评论 -
Python算法——判断两棵二叉树是否相等
要求: 如何判断两颗树是否相等?(两棵树相等是指这两课树有着相同的结构,并且在相同位置上的结点有相同的值)分析: 如果两颗二叉树root1, root2相等, 那么root1和root2结点的值相同,同时它们的左右子树也有着相同的结构,并且对应位置上结点的值相等,既root1.data = root2.data,并且root1的左右子树与root2的左右子树相等...原创 2019-08-05 18:15:40 · 3037 阅读 · 0 评论 -
Python算法——找出数组中出现奇数次的数
要求: 数组中有N+2个数,其中N个数出现了偶数次,2个数出现了奇数次(这两个数不相等),请用O(1)空间复杂度,找出这两个数。分析: 方法一:字典法 定义一个字典,把数组元素值作为key,遍历整个数组,如果key值不存在,则将value设为1,如果key值已经存在,则翻转该值(如果为0,则翻转为1;如果为1,则翻转为0),完成数组遍历后,字典中...原创 2019-08-08 11:36:03 · 2558 阅读 · 0 评论 -
Python算法——找出数组中丢失的数
要求: 给定一个由n-1个整数组成的未排序数组序列,其元素都是1到n中不同整数。寻找数组序列中缺失整数分析: 方法一: 累加求和:假设缺失数字是x,那么这n-1个数一定是1~n之间除了x以外所有数,试想一下,1~n一共n个数的和是可以求出来的,数组中的元素和也是可以求出来的,二者相减,其值不就是缺失数字x 的值? 方法二:...原创 2019-08-08 09:50:00 · 4075 阅读 · 0 评论 -
Python算法——分治法查找数组中元素最小最大值
要求: 给定数组a1,a2,a3,...an,找出数组中最大值和最小值。(数组中两两各不相同)分析: 算法思想类似于上图,将数组两两分为一组,如果数组元素奇数个,就把最后一个元素单独分为一组,然后分别对每一组中相邻两个元素比较,把二者中值小的数放在数组左边,值大的数放在数组右边,只需比较n/2次就可以将数组分组完成。这时候最小值在每一组左边部分,最大值在每一...原创 2019-08-07 22:26:36 · 2838 阅读 · 0 评论 -
python算法——实现栈的基本操作
要求: 实现一个栈的数据结构,使其具有:入栈、出栈、取栈顶元素、判断栈是否为空、获取栈中元素个数方法一:数组实现# -*- coding:utf-8 -*-'''数组实现栈的数据结构:入栈、出栈、取栈顶元素、判断栈是否为空、获取栈中元素个数'''class MyStack: #模拟栈 def __init__(self): sel...原创 2019-08-04 11:52:38 · 770 阅读 · 0 评论 -
Python算法——实现队列的基本操作
要求: 实现一个队列的数据结构,具有:入队、出队、查看队尾首元素、查看队列大小等功能。方法一:数组实现# -*- coding:utf-8 -*-'''数组实现队列'''class MyQueue(): def __init__(self): self.arr = [] self.front = 0 #队列头 ...原创 2019-08-04 14:45:28 · 1705 阅读 · 0 评论 -
Python算法——翻转栈的所有元素
要求: 翻转栈的所有元素,如输入{1,2,3,4,5},其中1处在栈顶,翻转之后栈为{5,4,3,2,1},其中,5处在栈顶。方法一: 申请一个额外队列,先把栈中元素依次出栈放到队列里,然后把队列里的元素按照出队列顺序入栈,这样就可以实现栈的翻转,缺点为需要申请额外的空间存储队列,因此,空间复杂度较高。方法二: 递归实现 递归...原创 2019-08-04 15:58:05 · 656 阅读 · 0 评论 -
Python算法——用O(1)的时间复杂度求栈中最小元素
要求: 由于栈具有后进先出(Last In First Out, LIFO)的特点,因此 push 和 pop 只需要对栈顶元素进行操作,只能访问到栈顶元素,而无法得到栈中最小的元素。那么,如何求栈中最小元素呢?解析: 1.利用一个变量记录栈底的位置,通过遍历栈中的所有元素找出最小值。但是这种方法的时间复杂度为 O(n)。 2.使用两个栈结构,一...原创 2019-08-04 17:45:40 · 1083 阅读 · 0 评论 -
Python算法——用两个栈模拟队列操作
要求: 用两个栈模拟队列,假设使用栈A与栈B模拟队列Q,A为插入栈,B为弹出栈,以实现队列Q。分析: 假设A和B都为空,可以认为A提供入队功能,栈B提供出队功能。要入队列,入栈A即可,而出队列则需要分两种情况考虑: (1)如果栈B不为空,则直接弹出栈B数据 (2)如果栈B为空,则依次弹出栈A的数据,放入栈B中,再弹出栈B的数据。...原创 2019-08-04 18:17:02 · 378 阅读 · 0 评论 -
Python算法——从给定的车票中找出旅程
要求: 给定一趟旅途中所有的车票信息,根据这个车票信息找出这趟旅程的路线。例如:给定下面的车票:(“西安”--->“成都“”),(“北京”--->”上海”),(“大连”--->“西安”),(“上海” --->“大连”),那么可以得到的旅程路线为:北京 > 上海,上海>大连,大连>西安,西安>成都。假定给定的车票不会有坏,也就是有一个城...原创 2019-08-05 14:40:06 · 320 阅读 · 0 评论 -
Python算法——从数组中找出满足a+b=c+d的两个数对
要求: 给定一个数组,找出数组中是否有两个数对(a,b)和(c,d),使得a+b=c+d,其中,a,b,c,d是不同元素。例如给定数组:[3,4,7,10,20,9,8],可以找到两个数对(3,8)和(4,7),使得3+8=4+7。分析: 算法思路为:以数组为单位进行遍历,在遍历过程中,把数对和数对的值存储在字典中(键为数对的和,值为数对),当遍历到一个键值对时...原创 2019-08-05 15:04:54 · 1467 阅读 · 0 评论 -
Python算法——把一个有序整数数组放到二叉树中
分析: 如果要把一个有序的整数数组放在二叉树中,那么所构造出来的二叉树必定也是一颗有序的二叉树。因此,取数组的中间元素作为根节点,将数组分成左右两部分,对数组的两部分用递归的方法分别构建左右子树。实现代码:# -*- coding:utf-8 -*-class BiTNode(): def __init__(self): self.data = ...原创 2019-08-05 17:34:56 · 399 阅读 · 0 评论 -
Python算法——把二叉树转化为双向链表
要求: 输入一颗二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能有新的结点,只能调整结点的指向。分析: 由于转换后的双向链表中结点的顺序与二叉树的中序遍历相同,因此,可以对二叉树的中序遍历算法进行修改,通过在中序遍历的过程中修改结点的指向来转换成一个排序的双向链表。代码实现:# -*- coding:utf-8 -*-class BiTN...原创 2019-08-05 19:30:18 · 1358 阅读 · 0 评论 -
Python算法——判断一个数组是不是二元查找树的后序遍历结果
要求: 输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。 例如输入[1,3,2,5,7,6,4],由于这一整数序列是如下树的后序遍历结果: 4/ \ 2 6 / \ / \13 57 因此...原创 2019-08-07 10:14:58 · 696 阅读 · 1 评论 -
Python算法——如何复制二叉树
要求: 给定一个二叉树,复制该树分析: 复制一颗二叉树,先复制其根结点,再复制左子树,最后复制右子树,从而复制完成;实现代码:# -*- coding:utf-8 -*-class BiTNode(): def __init__(self): self.data = None self.lchild = Non...原创 2019-08-07 10:46:37 · 1228 阅读 · 0 评论 -
Python算法——在二叉树中找出与输入整数相等的所有路径
要求: 从树的根节点开始往下访问一直到叶子结点经过的所有结点形成一条路径。找到所有的这些路径,使其满足这条路径上所有节点数据的和等于给定的整数。分析: 可以通过对二叉树的遍历找出所有的路径,然后判断各条路径上的所有结点的值的和是否满足给定的整数相等,如果相等,则打印出这条路径。实现思路为:对二叉树进行先序遍历,把遍历路径记录下来,当遍历到叶结点时,判断当前路径上...原创 2019-08-07 11:42:08 · 267 阅读 · 0 评论 -
Python算法——二叉树镜像反转
要求: 给定一棵二叉树,要求输出其左右翻转后二叉树的层次遍历。解析: 两个步骤:镜像翻转:只需要遍历二叉树,每次访问一个结点时,交换其左右孩子。 层次遍历。代码实现:# -*- coding:utf-8 -*-from collections import dequeclass BiTNode(): def __init__(se...原创 2019-08-07 12:19:44 · 775 阅读 · 0 评论 -
Python算法——在二叉排序树中找出第一个大于中间值的结点
要求: 对于一个二叉树,令f=(最大值 + 最小值)/2,设计一个算法,找出距离 f 值最近并且大于 f 值的结点。 6 / \ 3 9 / \ / \ 2 5 810 / / 1 ...原创 2019-08-07 16:59:07 · 543 阅读 · 0 评论 -
二叉排序树(BST)、平衡二叉树(AVL)、B-树、B+树
目录一、二叉排序树 1.二叉排序树(BST)定义 2.二叉排序树的操作二、平衡二叉树(AVL) 1.平衡二叉树的定义 2.平衡二叉树的建立 3.平衡调整 4.平衡二叉树实现的实例三、B-树(B树) 1.为什么会出现B树 2. B树的基本概念 3...原创 2019-08-21 22:45:49 · 2345 阅读 · 0 评论
分享