算法
xiaoyin992
这个作者很懒,什么都没留下…
展开
-
求数组中第二大值
对数组a[N]:取a[0],a[1]中较小者记为t,较大者记为s从a[2]遍历至数组尾部 (1) 如果a[i] (2) 如果a[i] > t (2.1) 如果a[i] (2.2) 如果a[i] > s,t=s,s=a[i]时间复杂度O(n)原创 2008-05-27 18:10:00 · 879 阅读 · 0 评论 -
求排序二叉树中间节点
给定一棵排序二叉树,求出值大小居于中间位置的节点。使用两个指针p1和p2,p1指向树的最小节点,p2指向树的最大节点p1在树上做前序遍历,p2在树上做后续遍历,每次p1和p2都移动一步,这样,最终或者p1与p2重合(树的节点数为奇数个),或者p1与p2称为父子关系(树的节点数为偶数个),此时我们便找到中间节点。原创 2008-05-27 22:24:00 · 1438 阅读 · 0 评论 -
矩形相交判定
判断两个矩形 (minx1, miny1, maxx1, maxy1)与(minx2, miny2, maxx2, maxy2)是否相交?解:记Lx=(maxx1-minx1+maxx2-minx2)/2或者Ly=(maxy1-miny1+maxy2-miny2)/2计算给定矩形中心距离tx, ty:如果tx=Lx或者ty= Ly,则相切;如果tx否则,相离原创 2008-05-27 22:32:00 · 954 阅读 · 0 评论 -
遍历矩阵格问题
M(列)*N(行)的格子,从左上到右下有几种走法?某个点(m,n)不能过有几种?某个点必须过有几种? 设想移动过程为从格子左下移动到右上,那么每一步骤或者向上(记为0)或者向右(记为1)。 一次完整的移动就是一个01序列,其中0和1的总数分别为N与M。这样,第一问就转换为满足这样的01序列共有多少个,答案显然是 必须经过(m,n)处:可以将移动分为原创 2008-05-28 18:37:00 · 1006 阅读 · 0 评论 -
循环赛日程安排问题
问题描述: 设有n(n=2^k)支队伍参加循环赛,循环赛共进行n-1天,每支队伍要与其他n-1支队伍比赛一场,且每支队伍每天必须比赛一场,不能轮空。试按此要求为比赛安排日程。 算法思路: 我们先安排奇数下标位置与偶数下标位置之间的比赛,就有n/2场,方法很简单,team[2k]=2k,所有奇数号组成一个序列[1,3...n-1],然后循环移动n/2-1次(比如第2个序列就是[3,原创 2008-10-04 09:58:00 · 3251 阅读 · 1 评论 -
检查数组是否有重复元素
问题: [0, n-1]的数存在一个整数数组A[n]中,判断A中是否有重复元素,要求使用尽可能少的空间。算法:(O(1)空间复杂度,O(n)时间复杂度) 一次遍历A,对于当前元素A[i],那么对数组中下标为A[i]的元素自减n。若无重复元素,那么一遍处理后,A[i] = A[i]-n,取值范围恰在[-1, -n]。所以对处理后的A一遍扫描,如果有正数说明有重复。原创 2008-10-08 15:07:00 · 2447 阅读 · 1 评论 -
图算法总结
图的定义: 很简单,G(V,E), V、E分别表示点和边的集合。 图的表示: 主要有两种,邻接矩阵和邻接表,前者空间复杂度,O(V2),后者为O(V+E)。因此,除非非常稠密的图(边非常多),一般后者优越于前者。图的遍历: 宽度遍历BFS(start): (1) 队列Q=Empty,数组bool visited[V]={false...}. Q原创 2008-10-08 15:22:00 · 11045 阅读 · 1 评论 -
排列组合相关算法
排列生成算法 问题: 给出数字a1,a2,...an,生成所有排列。 如果用递归,这个算法运行时的递归深度会很大的,而且递归如何一个一个地返回排列结果呢。下面的算法的核心思想都是如何根据当前给定的排列P(第一个排列自然是P=a1a2...an了),然后生成唯一的下一个排列。如此循环n!次,自然获得所有的排列。 字典序法 字典序法原创 2008-10-13 10:09:00 · 1581 阅读 · 0 评论 -
分配问题
问题: 把n个球放到r个盒子里一共有多少种分法?这里要考虑的因素包括:球是否区分、盒子是否区分、盒中是否允许为空? 讨论:球可区分、盒可区分、允许空盒对每个球而言都可以选择放在任意一个盒子中,并且这样得到的结果不会与其他重合,因此有rn种选择球可区分、盒可区分、不允许空盒首先将n个球分成r个非空子集(共S(n, r)种),对于每个这样的划分,它原创 2008-10-14 15:51:00 · 1729 阅读 · 0 评论