自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(42)
  • 资源 (3)
  • 收藏
  • 关注

原创 五大常用算法之二:动态规划算法(最详细全面的讲解)

一、基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。二、基本思想与策略 基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解。...

2020-05-30 17:04:28 998

原创 A*寻路算法(Python)

一、题目描述在一个迷宫游戏里,有一些小怪物要去攻击主角,现在希望给这些小怪物加上聪明的AI,让他们可以自动绕过迷宫中的障碍物,寻找到主角所在。二、解题思路迷宫游戏里的场景通常都是由小方格组成。假设我们有一个7*5大小的迷宫,图中红色格子是终点,绿色格子是起点,蓝色格子是一堵墙。...

2020-05-28 16:33:43 2833 2

原创 五大常用算法之一:分治算法(最详细全面的讲解)

分治算法一、基本概念 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。问题的规模越小,越容易直接求解,解题所需的计算时间也越少。例如,对于n个元素的排序问题,当...

2020-05-27 22:07:31 1791

原创 分红包算法(Python)

一、题目描述线上发红包功能,红包功能需要满足以下具体规则:1、所有人抢到的金额之和要等于红包金额,不能多也不能少。2、每个人至少抢到1分钱。3、要保证红包拆分的金额尽可能分布均衡,不要出现两极分化太严重的情况。二、解题思路二倍均值法假设剩余红包金额是m元,剩余人数是n,那么有如下公式:每次抢到的金额=随机区间[0.01,m/n * 2-0.01]元假设有5个人,红包总额为100元:100/5 * 2 =40,所以第一个人抢到的金额的随机范围是[0.01,39.99]元,在正常情况下,平均

2020-05-26 15:39:05 2768 1

原创 寻找缺失的整数:三(Python)

一、问题描述假设一个无序数组里有若干个正整数,范围1~100,其中有98个整数出现了偶数次,只有两个整数出现了奇数次,如何找到这2个出现奇数次的整数?二、问题求解

2020-05-26 10:23:38 271

原创 寻找缺失的整数:二(Python)

一、题目描述一个无序数组里有若干个整数,

2020-05-25 18:12:13 285

原创 寻找缺失的整数:一(Python)

一、题目描述在一个无序数组里有99个不重复的正整数,范围是1~100。唯独缺少一个1到100的整数,如何找到这个缺失的整数。二、解题思路1、方法一创建一个哈希表,以1到100这100个整数为Key 。然后遍历整个数组,每读到一个整数,就定位到哈希表中对应的Key,然后删除这个Key .直到最后,只剩下一个Key值没有被删除,剩下的这个数就是缺失的整数。该方法时间复杂度为O(n) ,空间复杂度为O(n).2、方法二先把数据元素从小到大进行排序,然后遍历已经有序的数组,如果发现两个相邻元素并不连续

2020-05-25 09:37:33 1157

原创 如何找到两个数组中的中位数(Python)

一、题目描述给定两个升序数组,如何找到这两个数组归并以后新的升序数组的中位数?(如果新的数组长度为奇数:中位数为中间的元素;如果数组长度为偶数,中位数为中间两个元素的平均值。)简单的方法:可以直接对两个数组进行归并操作,进而求得中位数。但这种方法效率不高,时间复杂度为O(m+n)二、解题思路中位数:中位数把一个升序数组分成了长度相等的两个部分,其中左半部分的最大值永远小于或等于右半部分的最小值。设有两个初始数组A和B,它们归并后的大数组为C,则大数组的左右部分,分别来源于两个初始数组A和B的左右部

2020-05-24 15:41:13 997

原创 删除k个数字后的最小值(贪心算法:Python)

一、题目描述给出一个整数,从该整数中去除k个数字,要求剩下的数字形成的新整数尽可能小。如:1593212,删除3个数字后的,新整数的最小情况是121230200,删除一个数字,新整数的最小情况是200二、解题思路这个题可以用贪心算法来解,每次求出删除一个数字后,让剩下数字形成的新整数达到最小。像这样依次取得局部最优解,最终得到全局最优解的思想,叫做贪心算法。如何做到删除一个整数后,让剩下的数字最小呢?其主要思想是把高位的数字降低。 把原整数的所有数字从左到右进行比较,如果发现某一位数字大于它

2020-05-24 10:44:00 2163 1

原创 寻找全排列的下一个数(Python)

一、题目描述给出一个数,找出这个正整数所有数字全排列的下一个数。即:在一个整数所包含数字的全部组合中,找到一个大于且仅大于原数的新整数。如:如果输入12345,则返回12354;如果输入12354,则返回12435二、解题思路首先当这5个数字逆序组合时最大:54321;顺序组合时最小:12345为了得到比原数稍大的下一个数,我们需要尽量保持高位不变,低位在最小的范围内变换顺序。至于变换顺序的范围大小,则取决于当前整数的逆序区域。比如:12354,要想获得比它大的下一个数,则需要从倒数第三

2020-05-23 22:22:08 604

原创 用两个栈实现队列(Python)

一、题目描述用栈来模拟一个队列,要求实现队列的两个基本操作:入队和出队。二、解题思路栈:先入后出(栈底指向栈底元素,栈顶指向栈顶元素)队列:先入先出(队头指向队首元素,队尾指向队尾元素的下一个位置)解题过程:1、如栈时,让元素一次压入栈A2、出栈时,让元素依次从栈A中pop(),再压入栈B中,此时栈B中的元素顺序与原来栈A中的元素顺序刚好相反,然后直接从栈B中弹出元素即可。3、这时如果再次执行入栈操作,则直接把元素压入栈A中即可。4、如果还要再次出栈,则从栈B中弹出;直到栈B为空,再把元素

2020-05-23 17:25:00 335

原创 无序数组排序后的最大相邻差(Python)

一、题目描述有一个无序整型数组,如何求出该数组排序后的任意两个相邻元素的最大差值?要求时间复杂度和空间复杂度尽可能的低二、解题思路1、方法一我们可以使用任何一种高效算法,然后再对相邻的两个元素求差值。这种方法效果比较差,因为这个题显然不是让我们排序的,但是也可以实现一下。我们找一种时间复杂度为O(nlogn)的排序算法,这里使用快排。代码实现:# 无序数组求最大相邻差def QuickSort(arr=[],left=None,right=None): left=0 if not

2020-05-23 16:42:46 1437

原创 如何判读一个整数是否是2的整数次幂(三种方法实现)

一、题目二、解题方法1、方法一2、方法二3、方法三一、题目实现一个方法,判断一个正数是否是2的整数次幂。(如:8是2的3次幂,返回True,9不是,返回False)要求性能尽可能地高。二、解题方法1、方法一暴力解法:设置一个中间量temp=1,每次乘以2后和原数据比较,如果等于则返回True,否则继续乘2。直到大于原数据,返回False。时间复杂度为O(logn)代码实现:def is_power_of_2(num): temp=1 while temp<=nu

2020-05-22 17:27:44 1374

原创 四种方法求最大公约数(Python)

一、最大公约数二、解题思路1、暴力枚举法2、辗转相除法3、更相减损术4、更相减损术与移位相结合一、最大公约数题目:写一段代码,求出两个整数的最大公约数,要尽量优化算法性能。二、解题思路1、暴力枚举法从较小整数的一半开始,试图找到一个合适的整数i,看这个数能否被a,b同时整除。它的时间复杂度为O(min(a,b))暴力枚举法效率比较低,当我传入的整数是10000和10001时,这种方法要比较10000/2-1=4999次。暴力枚举法的代码实现:在这里插入代码片...

2020-05-19 14:11:34 33395

原创 最全排序算法汇总(Python)

最全排序算法汇总

2020-05-19 12:43:36 155

原创 十大排序算法之十:基数排序(Python)

一、基数排序简介基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按照每个位数分别比较。从最低位开始,依次进行一次排序,这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。(这是因为不顾是在哪一位进行排序,总是该位中数字最小的放在前面,所以当总的位数排序完,此时在数列最前面的一定是最小的数,之后依次增大。)二、基数排序 vs 计数排序 vs 桶排序这三种排序算法都利用了桶的概念,但是对桶的使用方法有明显差异。基数排序:根据键值的每位数字来分配桶计数排序:

2020-05-18 23:03:21 143

原创 最小栈的实现(Python)

一、题目描述实现一个栈,该栈带有出栈(pop)、入栈(push)、取最小元素(get_min)三个方法,要保证这三个方法的时间复杂度都是O(1)。二、解题思路可能大部分在看到这个题后,第一反应是创建一个整型变量min,用来存储栈中的最小元素,每新进来一个元素,就让它和最小元素比较,只要它比最小元素小,就更新它为最小元素。当调用get_min时,直接返回min的值即可。以上算法错误之处在于只考虑了进栈的情况,当栈顶元素出栈时,此时栈中的最小值我们并不能知道是多少。所以,只存一个最小值是不够的,我们需

2020-05-18 21:13:09 268

原创 关于链表有环的扩展问题:求环的长度和入环节点

一、求环的长度二、求入环节点一、求环的长度解法:当两个指针首次相遇,说明链表有环,让两个指针从相遇点继续循环前进,并统计前进的次数,直到两个指针再次相遇。具体可参考如下公式:环长=每一次速度差 X 前进次数代码实现:class Node: def __init__(self,data): self.data=data self.next=Nonedef isCycle(head): p1=head p2=head flag=Fa

2020-05-18 16:23:35 452

原创 如何判断链表有环的三种解法(Python)

一、问题描述二、解题思路三、最优解的代码实现一、问题描述有一个单向链表,链表中有可能出现环,如何判断链表是否有环?二、解题思路方法一:首先从头节点开始,依次遍历单链表中的每一个节点。每遍历一个新节点,就从头检查新节点之前的所有结点,用新节点和此结点之前的所有结点依次作比较。如果发现该节点和之前的某个节点相同,则说明该节点被遍历过两次,链表有环;如果之前的所有结点中不存在与新节点相同的结点,就继续遍历下一个新节点,继续重复刚刚的操作。该方法的时间复杂度为O(n^2),空间复杂度为O(1)方法

2020-05-18 14:46:24 1042

原创 十大排序算法之九:桶排序

一、桶排序简介桶排序是计数排序的升级版,它利用了函数的映射关系,高效与否的关键在于这个映射函数的确定。为了使桶排序更加高效,我们需要做到两点:1、在额外空间充足的情况下,尽量增大桶的数量2、使用的映射函数能够将输入的N个数据均匀的分配到K个桶中。同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。什么时候最快?当输入的数据可以均匀的分配到每一个桶中,此时时间复杂度为O(n)什么时候最慢?当输入的数据被分配到了同一个桶中,此时时间复杂度为O(nlogn)桶排序同样是一种线性

2020-05-17 22:23:56 264

原创 计数排序的优化

一、计数排序计数排序是将序列中的数值转化为数组的下标,当数字a出现一次时,就把数组中对应a下标的值加1。这些数据需要存放在额外开辟的数组空间中(我们把该数组成为统计数组),计数排序的时间复杂度为线性的,它适用于在一定范围内的整数排序,在取值范围不是很大的情况下,它的性能可以超过那些时间复杂度为O(nlogn)的排序。当待排序的数据为95、94、91、98、99、90、99、93、91、92时,我们还以数列的最大值来决定统计数组的长度时,要创建一个长度为100的数组,那么从0-89的位置空间就都浪费了。

2020-05-17 19:10:49 456

原创 十大排序算法之八:计数排序(Python)

一、计数排序简介二、计数排序步骤三、代码实现一、计数排序简介计数排序是将序列中的数值转化为数组的下标,当数字a出现一次时,就把数组中对应a下标的值加1。这些数据需要存放在额外开辟的数组空间中,计数排序的时间复杂度为线性的,它适用于在一定范围内的整数排序,在取值范围不是很大的情况下,它的性能可以超过那些时间复杂度为O(nlogn)的排序。二、计数排序步骤1、得到数列的最大值,作为申请数组空间的依据2、根据数列最大值确定数组长度3、遍历数列,填充数组4、遍历数组,输出结果三、代码实现def

2020-05-17 00:25:44 270

原创 鸡尾酒排序(Python)

一、鸡尾酒排序简介二、算法步骤三、代码实现一、鸡尾酒排序简介冒泡排序是每个元素根据自身的大小,一点一点的向数组的一端进行移动,它是一个单向的运动,每一轮都是从左到右来比较元素。鸡尾酒排序,也是属于冒泡排序的一种改进方法,它是每一轮进行两个方向的比较和移动,刚开始从左到右比较,确定出一个最大数,然后从右向左比较,确定出一个最小数。其实就相当于冒泡排序在一轮中从左到右排序后,再从右往左排序一次。这样可以减少排序回合数,但是代码量和冒泡排序相比要增加一倍。鸡尾酒排序在大部分元素已经有序的情况下,才可以

2020-05-16 13:35:50 551

原创 十大排序算法之七:堆排序(Python)

一、堆排序简介二、堆排序步骤三、代码实现一、堆排序简介堆排序是指利用堆这种数据结构所设计的一种排序算法。堆有最大堆和最小堆,在堆排序中:最大堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排序。最小堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排序。堆排序的时间负责度为O(nlogn)二、堆排序步骤1、构建堆,本例以最大堆为例,生成升序序列。所以先构建最大堆。2、删除堆顶元素,把它替换到二叉堆的末尾,调整产生的新的堆顶。注意:这里并不是真的删除堆顶元素

2020-05-16 01:17:36 165

原创 冒泡排序的两种改进方法(Python)

1、改进方法一2、改进方法二1、改进方法一冒泡排序一般在进行到最后几轮时,有时会出现数据已经有序的情况,但是根据传统的冒泡排序算法,还是会进行比较。比如有一列数据,在第六轮的时候是:1、2、**3、5、6、7、8、9**此时数据已经有序,但是仍然会进行第七轮排序:1、**2、3、5、6、7、8、9**在这种情况下,如果能够判断出数据已经有序,并且做出标记,那么剩下的几轮排序我们就不用进行了。基于此,提出了第一种优化方法:设立一个flag,当在遍历中没有元素发生交换时,说明该序列已经有序。

2020-05-16 00:16:00 1428

原创 用最大堆实现最大优先队列(Python)

超详细注解,让你更好的理解算法过程

2020-05-15 12:02:40 324 1

原创 二叉堆的创建以及上浮下沉操作(Python)

用Python实现二叉堆的创建、上浮及下沉操作,超详细注解

2020-05-14 22:46:03 441

原创 十大排序算法之六:快速排序(Python)

一、快速排序简介快速排序和冒泡排序一样也属于交换排序,通过元素之间的比较和交换位置来达到排序的目的。它是一种分而治之的思想在排序算法上的应用。快排是处理大数据最快的排序算法之一,不仅快而且效率高。快速排序的核心就是确定基准(pivot)元素位置。简单的说就是选择一个基准元素,将比他小(或者相等)的数放在一边,比他大的数放到另一边,此时基准元素在其排好序后的正确位置,从而将数列拆成两个部分,再对这两个部分再递归上述方法。快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用

2020-05-11 22:02:27 212

原创 用队列实现二叉树的层序遍历(即广度优先遍历)(Python)

from queue import Queueclass TreeNode: def __init__(self,data): self.data=data self.left=None self.right=Nonedef create_binary_tree(input_list=[]): if input_list is None or len(input_list)==0: return None data

2020-05-10 22:14:42 363

原创 十大排序算法之五:归并排序(Python)

一、归并排序简介归并排序是分治法的典型应用,它有两种实现方式,一种是自上而下的递归;还有一种的自下而上的迭代。有人可能不清楚递归和迭代的区别,我在这里说一下:递归:有大问题分解成小问题,大步骤分解成小步骤迭代:与递归相反,由小问题层层解决,一直到解决了大问题。这样说可能有些抽象,举个例子:5!求解:要求5的阶乘就要先求出4的阶乘,求4的阶乘就要求3的阶乘,这样由上到下就是递归。而迭代是递归的相反过程,先求1!,再求2!…一直迭代运算求到5!,自下而上是迭代。它们两个很相似,但是还是不同的。

2020-05-10 19:11:20 195

原创 利用递归实现二叉树的前中后序遍历(Python)

class Treenode: def __init__(self,data): self.data=data self.left=None self.right=Nonedef create_binary_tree(input_list=[]): if input_list is None or len(input_list)==0: return None data=input_list.pop(0) #每次把列

2020-05-09 23:56:06 142

原创 十大排序算法之四:希尔排序(Python)

一、希尔排序简介希尔排序是简单插入排序的一种改进,也称递减增量排序算法,它属于插入排序,但是它是一种更高效的插入排序,而且非常稳定。同时,它是排序算法中时间复杂度冲破O(n^2)的第一批算法之一。希尔排序与简单插入排序的区别:eg:[5,4,3,2,1,0]对于这种倒序序列,数组末端的0要回到首位置很是费劲,比较和移动元素均需n-1次。而希尔排序在数组中采用跳跃式分组的策略,通过某个增量将数组元素划分为若干组,然后对每个分组进行简单插入排序,随后逐步缩小增量,继续按组进行插入排序操作,直至增量为1。

2020-05-09 16:40:37 222

原创 利用Python实现循环队列

class MyQueue: def __init__(self,capacity): self.list=[None]*capacity #队列容量为capacity self.front=0 self.rear=0 def enqueue(self,element): if (self.rear+1)%len(self.list)==self.front: raise Exception('队列已满

2020-05-08 23:34:59 397

原创 栈和队列的简单介绍

栈是一种线性数据结构,属于先入后出(FILO),栈的栈底和栈顶是有区分的,最早进入的元素存放的位置叫做栈底(bottom),最后进入的元素存放的位置叫做栈顶(top)。栈这种数据结构既可以用数组来实现,也可以用链表来实现。在Python中,列表很好的实现了栈的功能,append方法相当于入栈,pop方法相当于出栈。队列是一种线性数据结构,属于先入先出(FIFO),队列的出口叫队头(front),队列的入口叫队尾(rear)。既可以用数组来实现,也可以用链表来实现。但是用数组实现时,把队尾位置规定为最后

2020-05-08 23:07:33 224

原创 利用Python实现链表

class Node: ''' 相当于C语言中的结构体,定义了一个结点类型 ''' def __init__(self,data): self.data=data self.next=None # 初始化为None,如果后面不赋新值则一直为Noneclass LinkedList: ''' __init__(self):属于类的构造函数或者初始化方法,每当创建一个这种类 的实例,这个函数就会被执行一次 '''

2020-05-08 22:05:16 191

原创 C语言结构体与C++中类的区别

C语言中有结构体的概念,没有类的概念,因为类是面向对象才有的概念,所以在C++中有了类的概念,从一定程度上来说,类可以看成是结构体的升华。但是除此之外,C++中也有结构体的概念,但是和C语言中是不同的。在C语言的结构体中只能自定义数据类型,不允许有函数,而C++中的结构体可以加入成员函数。那么C++的结构体和C++的类有什么区别呢?一般C++结构体中定义的成员默认是public,而类中的定义...

2020-05-08 16:24:06 589

原创 十大排序算法之三:插入排序(Python)

一、插入排序简介插入排序之所以叫插入排序,是因为它的排序方式是不断从未排序序列中取出一个数,插入到已排序序列的合适位置。就像是数组插入一样,需要不断的移动数据,如果要插入的这个数是在已排序的序列中间的话,就需要从中间往后的数据依次后后移一个位置,给新插入的元素腾位置。它的原理是先构建一个有序序列,对于未排序数据,在已排序序列中从后向前扫面,找到对应位置并且插入。二、插入排序步骤1:首先把序...

2020-05-08 12:57:52 128

原创 十大排序算法之二:选择排序(Python)

一、选择排序概述选择排序是一种比较简单的排序方法,时间复杂度为O(n^2),数据量较大时最好不要使用选择排序,这种排序方法只适合数据规模比较小的情况。二、选择排序流程选择排序就像我们平常从一堆数字中自己排序一样,只不过是把人类的行为进行了程序化的描述。1、从待排序序列中选择一个最小(最大)的数字,放在序列头部;2、从剩余序列中再选择一个最小(最大)的数字,放在刚刚已排序的序列尾部;重复,...

2020-05-07 17:21:05 138

原创 空间复杂度的四种计算情况,超级简单好懂

刚接触空间复杂度的时候,可能很多人知道什么是空间复杂度,但是往往不知道怎么计算。和时间复杂度类似,空间复杂度是对一个算法在运行过程中临时占用存储空间大小的度量,也是使用大O表示法。1、常量空间存储空间大小固定,和输入没有关系时,空间复杂度是O(1)2、线性空间算法中定义了一个线性集合,如一个列表,并且集合大小和输入规模n成正比,空间复杂度记为O(n)3、二维空间算法中定义了一个二维列...

2020-05-06 15:30:44 17148 4

转载 排序算法总结

总共有哪些算法,算法的特性以及时间复杂度等的介绍

2020-05-06 10:46:22 223

hw性格测试1.0.xlsx

文件资源是华为性格测评的答案,仅供参考哦~,因为华为的性格测评要求比较严,一不小心就会挂掉,按照文件中给的建议,很容易就能通过~

2020-11-23

python3实例.zip

Python新手编程练习,帮你打牢每一个知识点,再也不用担心新知识刚学就忘了,里面包含了35个常见问题,对新手友好。

2020-05-06

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除