
算法
文章平均质量分 63
huan-yong
这个作者很懒,什么都没留下…
展开
-
将数组中元素排列为奇数在前偶数在后
处理策略是定义两个指针pHead,pTail并令其初始指向数组头节点和尾节点。pHead从前往后找应该放在尾部的偶数节点,pTail从后往前找应该放在头部的奇数节点,若pHead位于pTail之前则交换二者内容,否则结束处理过程。处理流程如下图所示。 对于用例: 1,2,4,5,3处理结果为:1,3,5,4,2 下面给出在java语言下的实现:原创 2016-03-31 11:58:40 · 5439 阅读 · 1 评论 -
0-1背包问题
public static void pack0_1(int[] v,int[] w,int cap) { int n = v.length; if(n<=0 || cap<=0) { System.out.println(0);//不存在物品或背包容量小于等于0 return; } int[] f = new int[cap+1]; for(int i原创 2016-05-08 14:48:03 · 361 阅读 · 0 评论 -
tarjan算法介绍与分析
tarjan算法是一个求取有向图的所有强连通分量的算法,它是以算法提出者Robert Tarjan的名字来命名的。提出此算法的Robert Tarjan是普林斯顿大学的教授,同时他也是1986年的图灵奖获得者(图灵奖是计算机领域的最高荣誉,和物理、化学领域的诺贝尔奖是一个层次的奖项)。 在详细讲述该算法之前,我们需要明确几个概念(注意该算法的研究对象是有向图,无向图没有强连通等概念)。 1.原创 2016-05-20 15:03:53 · 1019 阅读 · 0 评论 -
Trie树学习笔记
Trie树:字典树,单词查找树特点:根节点不包含元素;将根到当前节点路径上的字符连接起来,即为该节点对应的字符串;每个节点的子节点对应的字符串各不相同;对n个字符串构建字典树,时间复杂度为O(n*len),len表示字符串的平均长度;对字典树查找的时间复杂度为O(len),len为待查找字符串的长度;以空间换时间。应用:在n个字符串中,判断是否存在某个字符串是另一个字符串的前缀;对原创 2017-03-01 15:25:45 · 265 阅读 · 0 评论 -
ac自动机
kmp算法:单模式串匹配算法,fail指针用于在当前字符失配时,跳转到具有最长公共前后缀的字符进行匹配; Trie树:字典树(单词查找树)。 ac自动机:多模式串匹配算法;ac自动机通俗来说,就是Trie树中每个节点有一个fail指针,fail指针指向当前匹配失效时应跳转的位置,类似于kmp中的next数组;fail指针生成规则:fail指针置为父节点fail指针指向节点的相应next指向原创 2017-03-02 16:34:15 · 273 阅读 · 0 评论 -
手摇算法及其应用
手摇算法及其应用原创 2016-03-06 17:01:18 · 766 阅读 · 0 评论 -
超级素数幂解题报告
如果从p进行枚举,则p∈[2,n√]p\in[2,\sqrt{n}],时间复杂度较高,会超时。 如果从q进行枚举,则q∈[2,log2n]q\in[2,\log_2 n],时间复杂度较低,可以AC。 下面给出在Java下的代码。import java.util.Scanner;public class Main { public static void main(String[] args原创 2017-03-08 15:31:19 · 529 阅读 · 0 评论 -
序列和解题报告
分析:序列和要求序列是连续的,也就是说它们之间相差1,符合等差数列性质,且要求是对这个序列求和,因此可以用等差数列的求和公式处理。等差数列求和公式:La1+L(L−1)/2La_1+L(L-1)/2,其中LL代表求和的项数,a1a_1代表等差数列首项。 -L L长度范围较小,可以由小到大对其进行枚举,如果找到一个可行的等差数列首项且LL满足题设范围,则结束处理。下面给出java代码:impor原创 2017-03-11 10:32:31 · 253 阅读 · 0 评论 -
判定链表是否有环
class ListNode //链表节点定义{ int val; ListNode next; public ListNode(int val) { super(); this.val = val; this.next = null; } }public boolean existCircle(ListNode head) //判定链表是否有环 { if(he原创 2016-04-21 21:36:14 · 437 阅读 · 0 评论 -
RMQ问题分析
RMQ问题是一类经典问题,在ACM编程竞赛中我们经常会见到它的身影。其中RMQ是Range Minimium/Maxmium Query的缩写形式,代表区间最小/最大值查询。问题描述为:对一个已知长度为n的数组a,给出多组区间[i,j],对于每个区间给出该区间的最值。该问题需要注意的地方是要处理多组数据。 常规解法是直接遍历区间[i,j]对应的数组元素,然后找出所求的最值。该方法在只有一次查询原创 2016-05-26 15:32:56 · 534 阅读 · 0 评论 -
最短子数组
最短子数组问题描述: 给定一个数组a和数组长度n,求出需要排序的最短子数组长度,使得该子数组排好序时整个数组有序。测试样例:输入:a={1,4,6,5,9,10}, n=6输出:2问题分析: 由题意知,我们需要找到一个子数组使得当该子数组排好序时整个数组有序。这就是说原数组可以分为三个部分,即a=pqk,此时我们找到的子数组为q。p和r已经分别有序且p中所有元素小于q中任意一个元素,k中任原创 2016-05-13 16:19:59 · 1035 阅读 · 0 评论 -
top-K问题详解
top-K 问题是一类经典的问题,它能解决许多海量数据处理相关的问题,例如在1亿个ip中找出访问次数前1000的ip,在海量搜索字符串中找出搜索频率排在前十的搜索字符串等等。下面我们由浅入深对其进行分析。我们可以将这类问题分为三个方向考虑: 1.将输入内容(假设用数组存放)进行完全排序,从中选出排在前K的元素即为所求。有了这个思路,我们可以选择相应的排序算法进行处理,目前来看原创 2016-04-09 17:03:28 · 14050 阅读 · 0 评论 -
最长递增子序列(LIS)问题
public ArrayList LIS(int[] arr) //获取最长递增子序列 { ArrayList array = new ArrayList(); int len = arr.length; if(len==0) //数组长度为0 return array; int[] f = new int[len]; //记录以当前元素作为尾元素的最长递增子序列长度原创 2016-04-28 18:29:13 · 400 阅读 · 0 评论 -
子数组最大和问题
需求: 对于一个有正数、负数或零的整数数组a[n],找出其中和最大的子数组。分析: 这是典型的子数组最大和问题,下面我们由浅入深考虑其处理方法:1.生活中很多事情,最直接的方法就是暴力处理,基于此我们给出如下处理策略。 我们可以通过一个对数组索引的两次循环来获得每一个子数组的开始与结束索引,再利用累计求和方式处理开始与结束索引原创 2016-04-16 15:17:33 · 466 阅读 · 0 评论 -
页码统计解题报告
题目要求统计0∼90\sim 9每个数字出现的次数,可以基于经典题(统计1∼n1\sim n中11的个数)来求解。首先给出几个概念: - 当前数位currNumcurrNum,低位数字构成的数lowerNumlowerNum,高位数字构成的数upperNumupperNum。引入它们的原因是对于当前数位,它能放置11的个数由这三个数确定。对于n=12345n=12345,若currNum=3cu原创 2017-03-14 16:35:55 · 484 阅读 · 0 评论