算法之路
run noob
向前看!交流就是一种进步!
展开
-
ccf_201909-2 小明种苹果(续)-python
题目思路这一题是加强版的小明种苹果。大致思路还是和题目一差不多。边读取边处理。设置一个辅助数组,用以存储该树是否有掉落苹果,方便判断是否有连续三棵树掉落。对于每一棵树,有一个初始化的苹果数量,遇到负值直接加,遇到正值,判断与当前树上剩余苹果数量是否相同,相同则表示没有苹果掉落,继续向下执行,该正值小于当前苹果数,则表示有苹果掉落,更新当前苹果数目,存储该树编号。代码代码一(50分)N ...原创 2019-11-26 11:28:35 · 3426 阅读 · 0 评论 -
ccf_201909-1 小明种苹果-python
题目以及测似案例解决思路输入实际是一个矩阵,行表示每颗树,第一列表示每棵树的苹果数,其他列表示每棵树对应的每次疏果操作。计算T 可以直接把每个输入数加起来即可。每次处理一行数据,计算疏果个数,存储对应苹果树编号。当后一行(既下一颗树)的疏果个数大于当前疏果个数时,更新K P代码str = input()nums = str.rsplit()nums = list(map(int, ...原创 2019-11-26 10:45:54 · 1482 阅读 · 1 评论 -
算法之路__19、动态规划之矩阵链相乘
动态规划之矩阵链相乘问题描述给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。思路:构造递归解设m[i,j]为矩阵链Ai…Aj的最优解的代价,则 ┌ 0 如果i = jm[i,j] = │ └ min(i≤k<j) {m[i,k] ...原创 2019-11-05 08:50:48 · 3418 阅读 · 0 评论 -
算法之路__19、动态规划之最长公共子序列
序列可以理解成一个字符串, 比如『Chinese』就是一个序列,而子序列指的是由序列中的若干字符, 按原相对次序构成的序列。需要注意的是,子序列中的各个字符的相对次序一定和原来序列中的相对次序一样。 比如,『Cin』是『Chinese』的子序列,而『sin』就不是『Chinese』的子序列。 最长公共子序列(Longest Common Subsequence)问题, 就是要找出两个序列的最长的公共子序列。 假设有一个长度为n的序列A[1,n]和一个长度为m的原创 2019-11-05 08:34:35 · 3249 阅读 · 0 评论 -
算法之路_6、小和问题
一、问题小和问题 在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组 的小和。例子: [1,3,4,2,5]1左边比1小的数:没有;3左边比3小的数:1;4左边比4小的数:1、3;2左边比2小的数:1;5左边比5小的数:1、3、4、2;所以小和为1+1+3+1+1+3+4+2=16 二、解析通过以上例子大致可...原创 2019-01-16 21:13:57 · 17157 阅读 · 0 评论 -
算法之路_7、逆序对问题
一、问题在一个数组中,左边的数如果比右边的数大,则折两个数构成一个逆序对,请打印所有逆序对。二、解析如果前一篇小和问题能够理解,那么这个逆序对问题也就可以迎刃而解了。两个问题其实差不多,只不过换了种说法。三、代码package algorithm;/* *2019年1月11日 */public class Code_Inverse { public stati...原创 2019-01-16 21:29:49 · 17027 阅读 · 0 评论 -
算法之路_14、堆的基本操作
一、解释在上一篇博文堆的预备知识 中,我们谈到,堆实际上可以理解为一个数组表示的完全二叉树。他也具有树的一些性质。在这一篇中主要来记录一些堆的基本操作。其中会涉及到上篇博文中阐述到的部分完全二叉树的性质。二、代码1、建立一个大根堆大根堆是堆的两种形式之一。根节点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆,又称最大堆(大顶堆)。大根堆要求根节点的关键字既大...原创 2019-01-23 14:36:45 · 15457 阅读 · 0 评论 -
算法之路_17、用数组结构实现大小固定的队列和栈
题目:用数组结构实现大小固定的队列和栈一、数组实现栈结构: 栈结构是先进后出的,只需要一个数组和一个记录位置的变量size,当进来一个元素,size就++,出去一个元素size就--public class ArrayStack{ private Integer[] arr; private Integer size; ...原创 2019-04-24 10:02:48 · 7705 阅读 · 0 评论 -
算法之路_18、实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作
题目:实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返 回栈中最小元素的操作。【要求】1.pop、push、getMin操作的时间复杂度都是O(1)。2.设计的栈类型可以使用现成的栈结构。设计思路:1.为保证操作时间复杂度为O(1) 需要准备两个栈:data栈,min栈2.栈空入栈的时候,data栈和min栈都需要压入这个数,栈不空时,data栈正常入栈,入mi...原创 2019-04-24 10:19:37 · 7994 阅读 · 0 评论 -
算法之路_19、仅用队列结构实现栈结构&&仅用栈结构实现队列结构
题目:1、仅用队列结构实现栈结构2、仅用栈结构实现队列结构实现思路:1、队列实现栈我们需要定义两个队列,一个数据队列 Data 和 一个辅助队列 Help。操作:压栈:只要有新的数据,就压入 Data 队列。出栈:如果 Data 队列为空,报错。因为栈是先进后出,所以如果 Data 队列中的元素数量大于 1,则将Data 队列中的数据迁移至Help 队列,直到...原创 2019-04-25 09:04:49 · 7726 阅读 · 0 评论 -
算法之路_16、求最大差值
一、题目给定一组数据,求排序后,相邻数据之间的最大差值 时间复杂度要求 O(N)eg:arr={2,12,4,0,5,3,20,80};排序后:0,2,3,4,5,12,20,80最大差值即为80-20=60二、算法思路:1、若不看时间复杂度,直接暴力求解,先排序,后求相邻最大差值。但几个排序算法最好也是O(N*logN)。无法做到O(N)2、借助桶排序思想,以保证时间...原创 2019-01-27 19:30:40 · 17942 阅读 · 0 评论 -
算法之路_1、冒泡排序
一、详解冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。(摘自百度百科)冒泡排序算法的原理如下: 比较相邻的元素。如果第一个比第二个大,就交换他们两...原创 2019-01-10 11:16:48 · 16934 阅读 · 0 评论 -
算法之路_13、堆操作预备知识
一、解释堆通常是一个可以被看做一棵树的数组对象。所以在认识堆之前,我们先来了解了解满二叉树和完全二叉树,这样在后面做堆问题时会有很大帮助。满二叉树:对于满二叉树的定义呢,国内和国外有所不同。本篇博文中按照国内定义。满二叉树定义:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点二叉树。即一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二...原创 2019-01-21 11:27:25 · 15839 阅读 · 0 评论 -
算法之路_3、插入排序
一、解释插入排序。通俗点讲类似我们打扑克时整理牌。先将0 1位置排好序,然后将2位置元素插入已经排好序的区域,直至全部有序。二、代码 public static void insertSort(int arr[]){ //初始认为0位置已排定 for确定待排区域 for (int i = 1; i < arr.length; i++...原创 2019-01-11 09:19:23 · 16634 阅读 · 0 评论 -
算法之路_4、递归思想
一、解释先不谈递归是怎样的,我们先举个通俗易懂得栗子。我们在上大学的时候,学校里总会统计学生竞赛等获奖人数以及奖项。而此时校方就下发命令要求各二级学院去统计各学院获奖人数,二级院校又会下发命令要求各班级去统计。各班级由学生个人汇报自己得情况,然后班级汇总交给二级学院,二级学院再汇总交给学校。这其实就是一个递归的过程。大问题划分为小问题,小问题求解汇总,大问题汇总小问题,最终得解。递...原创 2019-01-11 09:39:20 · 17158 阅读 · 0 评论 -
算法之路_8、数组切分问题
一、问题给定一个数组arr,和一个数num,请把小于等于num的数放在数 组的左边,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度O(N)二、解释问题应该很好理解。数组中的每个数和num相比,小于等于num放左边,大于num放右边。解决这个问题最普遍的思路就是建立一个辅助数组,然后对arr进行遍历,把每一个数字与num相比较,并且对辅助数组就行赋值。但是这...原创 2019-01-17 10:36:07 · 17228 阅读 · 0 评论 -
算法之路_9、荷兰国旗问题
一、荷兰国旗问题(数组分割问题的扩展) 给定一个数组arr,和一个数num,请把小于num的数放在数组的 左边,等于num的数放在数组的中间,大于num的数放在数组的 右边。要求额外空间复杂度O(1),时间复杂度O(N)二、解释通过具体问题可以看出,这是上一篇博文数组分割问题的扩展,上一篇是将小于等于的放在数组左边,大于放在数组右边,两份切。本篇荷兰国旗问题是小于数放左边,等于放中...原创 2019-01-17 11:01:50 · 16714 阅读 · 0 评论 -
算法之路_15、堆排序
一、解释从前面的博客中谈到堆分为最大堆和最小堆,其实就是完全二叉树。最大堆要求节点的元素都要不小于其孩子,最小堆要求节点元素都不大于其左右孩子,两者对左右孩子的大小关系不做任何要求。基于这些定义,对于大根堆,处于最大堆的根节点的元素一定是这个堆中的最大值。而堆排序算法就是利用堆的这一特点,每次都取堆顶的元素,将其放在序列最后面,然后将剩余的元素重新调整为最大堆,依次类推,最终得到排序的序列...原创 2019-01-24 08:45:55 · 15243 阅读 · 5 评论 -
算法之路_10、经典快速排序
一、算法思路快速排序(Quicksort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。在本篇中采用以数组最后一位数作为中轴,通过一次partition将数组分为两部分,左边区域小于等于该数字,右边区域...原创 2019-01-19 14:48:51 · 16201 阅读 · 0 评论 -
算法之路_11、优化后的快速排序
一、优化使用之前介绍过的 算法之路_9、荷兰国旗问题 来改进经典快速排序。上一篇快排讲到得是将数组分割成两部分,直至全部有序。而荷兰国旗问题则是将一个数组分成三部分,左边小于比较数字,中间等于比较数字,右边大于比较数字。所以,采用荷兰国旗思想来改进快排,可以在一定情况下减少比较次数(中间等于部分)。二、代码+注释package algorithm_02;import logari...原创 2019-01-19 14:57:02 · 16117 阅读 · 0 评论 -
算法之路_12、随机快排
一、解释在经典快速排序中,每次拿最后一个数来做比较,当数据样本大致有序时,每次都会比较N次,这时时间复杂度O(N*logN)的快排算法就会蜕变为O(N^2)的算法。在算法设计中,通常为避免数据样本所带来的问题,会采用以下两种方法 *1、随机数方式(本算法中采用) *2、hash函数方式二、代码+注释package algorithm_02;import logarithm...原创 2019-01-19 15:04:32 · 16293 阅读 · 0 评论 -
算法之路_5、归并排序
一、解释归并排序(merge—sort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并,说白了就是分开,后合并。举个通俗的栗子:有一堆人,要按大小个排队。先把这一堆人分成两队,两队各自...原创 2019-01-15 10:50:32 · 16718 阅读 · 0 评论 -
算法之路__2、选择排序
一、解释选择排序法事实上 是对 定位比较交换法(也就是冒泡排序法) 的一种改进。基本思想:第1趟,在待排序记录r[1]~r[n]中选出最小的记录,将它与r[1]交换;第2趟,在待排序记录r[2]~r[n]中选出最小的记录,将它与r[2]交换;以此类推,第i趟在待排序记录r[i]~r[n]中选出最小的记录,将它与r[i]交换,使有序序列不断增长直到全部排序完毕。从以上的 算法思想中可以看...原创 2019-01-10 15:32:33 · 16660 阅读 · 0 评论