Processing math: 100%

随笔分类 -  每天一算法

摘要:蓄水池抽样算法是一类随机算法,实现从n个元素中随机选择k个元素,n 通常很大或者未知,该算法保证每个元素被选到的概率均为k / n. 阅读全文
posted @ 2015-07-14 22:50 python27 阅读(10833) 评论(0) 推荐(0) 编辑
摘要:LRU Cache Algorithm C++ 阅读全文
posted @ 2015-06-26 22:20 python27 阅读(2972) 评论(0) 推荐(0) 编辑
摘要:问题描述 设 A[1...n] 是一个数组,如果对于 i A[j], 则 A[i] 和 A[j] 构成一对逆序。给定一个数组,计算数组中逆序对的个数。例如数组 a[] = {1, 4, 3, 2}, 则 {4, 3} {4, 2} {3, 2}是逆序对,返回 3。解法一:暴力求解 两个 for 循... 阅读全文
posted @ 2015-03-31 21:17 python27 阅读(8231) 评论(0) 推荐(0) 编辑
摘要:题外话 最近有些网友来信问我博客怎么不更新了,是不是不刷题了,真是惭愧啊,题还是在刷的,不过刷题的频率没以前高了,看完《算法导论》后感觉网上很多讨论的题目其实在导论中都已经有非常好的算法以及数学证明,只是照搬的话好像意义也不是很大,希望找到些有代表性的题目在更新,另外希望能接着前面的《穷举递归和回溯... 阅读全文
posted @ 2015-03-20 22:40 python27 阅读(4973) 评论(0) 推荐(0) 编辑
摘要:原题链接:codeforce 267 Div2 C问题描述:给定长度为n的数组a[],从中选择k个长度为m的子数组,要求和最大。形式描述为:选择k个子数组[l1, r1], [l2, r2], ..., [lkl1, rk](1 ≤ l1 ≤r1 ... 阅读全文
posted @ 2014-09-22 14:12 python27 阅读(1782) 评论(0) 推荐(0) 编辑
摘要:问题描述题目来源:Topcoder SRM 627 Div2 BubbleSortWithReversals给定待排序数组A,在最多反转K个A的不相交子数组后,对A采用冒泡排序,问最小的swap次数是多少?冒泡排序的伪代码如下:BubbleSort(A): 循环len(A) - 1次: for i ... 阅读全文
posted @ 2014-07-14 11:19 python27 阅读(10994) 评论(0) 推荐(0) 编辑
摘要:问题描述 假设我们有8种不同面值的硬币{1,2,5,10,20,50,100,200},用这些硬币组合够成一个给定的数值n。例如n=200,那么一种可能的组合方式为 200 = 3 * 1 + 1*2 + 1*5 + 2*20 + 1 * 50 + 1 * 100. 问总过有多少种可能的组合方式?... 阅读全文
posted @ 2013-09-05 17:51 python27 阅读(27685) 评论(4) 推荐(3) 编辑
摘要:【题 目】写一个函数,求两个整数的和。要求在函数体内不用+,-,×,/。 【思 路】学过数电的人都知道,+,-,×,/在计算机处理中的基本都是使用的全加器,而全加器在进行计算的时候用到了很多的逻辑门电路(具体的这些门电路我现在也想不起来了,呵呵),所以运算的基础其实就是二进制的逻辑运算的组合。既然题目不要求我们使用+,-,×,/,那么我们可以直接从最底层的逻辑运算开始。 为了方便讨论,我们不妨拿4+14来作为例子,4的二进制是100,14的二进制是1110;我记得在数电中,有一个寄存器是用来存放进位的,也就是说我们首先计算的是各位相加不进位,然后加上每一个位从下一 阅读全文
posted @ 2011-12-20 22:16 python27 阅读(1357) 评论(0) 推荐(1) 编辑
摘要:【题 目】输入一个字符串,输出该字符串中最大对称子串的长度。例如输入字符串:“google”,该字符串中最长的子字符串是“goog”,长度为4,因而输出为4。 【思 路1】一看这题就是遍历!没错,我们最直观的往往也是最容易实现的,这里我们暂且不考虑效率的问题。我们的基本思路是:我们如果有一个判断一个字符串是不是对称的函数的话,我们就可以用这个子函数逐一检查原字符串中所有的字符串,然后输出长度最大的即可。 (1)怎样判断一个字符串是不是对称的字符串?我们可以用两个指针分别指向字符串的第一个字符和最后一个字符,判断是否相等,如果不等直接返回false,如果为真则接着比较下一对字符。(2)... 阅读全文
posted @ 2011-12-18 21:18 python27 阅读(6216) 评论(3) 推荐(2) 编辑
摘要:【题 目】实现函数double Power(double base,int exponent),求base的exponent次方,不需要考虑溢出。【思 路】这道题的核心太简单了,一个循环就搞定,就不在多说了。关键是我们要考虑代码的健壮性:(1)首先base=0,exponent=0在数学上是无意义的;base=0,exponent<0的时候是分母为零的情况,我们要作为特殊情况考虑。(2)如果exponent为负数,那么我们要首先求得对应的正数的幂,然后再取倒数。 这样我们就可以得到如下的代码: 1 #include<iostream> 2 #include<string 阅读全文
posted @ 2011-12-17 21:28 python27 阅读(4457) 评论(0) 推荐(1) 编辑
摘要:【题 目】输入一个表示整数的字符串,把该字符串转换成整数并输出。例如:输入“123”,输出整数123. 【思 路】当然首先想到的就是C语言库函数atoi,一行代码就完事了,当然我们是想不借助该库函数来实现自己的算法。首先,我们考虑怎么把字符串转换成整数,我们输入“123”,我们可以遍历这个字符串,首先读入1,然后读到2,这时我们想要的是12=1×10+2;然后读入3,我们想要的是123=12×10+3;分析到这里,我们就会发现,我们只需要注意遍历每一个字符,将已经得到的数字×10然后加上该字符,就能得到整数了,用一个循环就可以轻松搞定。 算法的主体框架算是完成了, 阅读全文
posted @ 2011-12-16 22:40 python27 阅读(2979) 评论(0) 推荐(2) 编辑
摘要:【题 目】数组中有一个数字的出现次数超过了该数组长度的一半,找出这个数字。 【思 路1】由于要寻找的数字的出现次数超过了数组长度的一半,所以如果将该数组排序,那么它的中位数必然是我们要寻找的数字,所以我们的任务就是对该数组进行排序,而性能最好的快速排序的时间复杂度为O(nlogn),我们可以直接借助库函数完成,由于其效率不是很高,所以这里就不再赘述。 【思 路2】对于一个数组中的元素的次数的统计,最快的查找方法是什么?当然哈希表了!我们能不能建立哈希表呢,稍微思考,我们就可以发现,哈希表只适用于元素的范围比较小的情况,而假设我们的数组是一个整型数组,取值范围跨度太大,所以不适合用哈希... 阅读全文
posted @ 2011-12-15 22:50 python27 阅读(2010) 评论(1) 推荐(1) 编辑
摘要:【题 目】输入一个整数n,求从1到n这n个正数中,1出现的次数。例如:输入12,出现一的数字有1,10,11,12共有5个1,则输出5. 【思 路1】几乎所有的算法题目都有很直观容易想到的方法,当然这类方法的效率通常都不是很好,然而解决问题是第一要义。所以还是从最容易想到的入手。我们可以遍历从1到n的每一个数字k,对于k我们计算出它其中包含的1的个数,方法其实很简单,只需要分别判断个位,十位,百位,千位等的每一位是否为1,然后用计数器记录就OK了。这种思路很简单,我们很容易就可以写出如下的代码: 1 #include<iostream> 2 #include<string&g 阅读全文
posted @ 2011-12-14 23:43 python27 阅读(3484) 评论(0) 推荐(3) 编辑
摘要:【题 目】输入两个字符串,从第一个字符串中删除第二个字符串中出现的所有字符。例如:输入"they are students." 与 “aeiou”,则应该输出“thy r stdnts.”。 【思 路1】首先我们还是以解决问题为第一要义,寻找最为直观的解决方案,很容易想到的方法就是,对于在第一个字符串中的每一个字符,拿它去查找是否在第二个字符串中出现过,如果是,则删除,如果不是则保留。删除一个字符,要让该字符之后的所有字符逐一向前移位,所以时间复杂度为O(n),对于长度为n的字符串,总的时间复杂度为O(N2).而对于给定的字符,在第二个字符串中查找该字符,如果遍历长度为m的 阅读全文
posted @ 2011-12-13 21:33 python27 阅读(6336) 评论(0) 推荐(1) 编辑
摘要:【题 目】在一个字符串找到第一个只出现一次的字符。例如:输入字符串abaccdeff,输出b。【思 路1】其实我看到这道题的第一个反应就是哈希表呀!当然我是学习过哈希表之后才这么说的,对于之前,我们的思路当然是,从头到尾遍历字符串,对于遍历到的每一个字符,拿它后面的每一个字符和它比较,如果没有和它相等的字符,那么它就是我们所要找的。很容看出来这种算法的时间复杂度是O(n2).【思 路2】当然哈希表啦!所有学习过哈希表的同学都知道哈希表的查找速度是O(1)。我的第一个反映是建立26个字母的哈希表,当然这没有包含各种标点符号,控制字符等,所以为了全面起见,我们建立长度为256的哈希表(每一个cha 阅读全文
posted @ 2011-12-12 22:36 python27 阅读(1359) 评论(1) 推荐(1) 编辑
摘要:【题 目】输入一个整型的数组,调整数组的数字,使得所有的奇数位于数组的前半部分,所有的偶数都位于数组的后半部分。要求时间复杂度为O(n)。 【思 路1】首先我们不考虑时间复杂度的要求,直观考虑:我们只需要从头到尾扫描整个数组,如果碰到奇数,放到第一的位置;如果碰到偶数,就放到最后的位置。这样就OK了。然后我们来分析这种算法的效率问题:首先我们需要一个临时变量来保存需要移动的元素,因而空间复杂度为O(1).时间上,对于第i个元素,它是奇数和偶数的概率各为1/2,因而它有1/2的概率向前移动(i-1)个位置,有1/2的概率想后移动(n-i)个位置,因而平均下来要移动(n-1)/2的位置,也就... 阅读全文
posted @ 2011-12-11 21:09 python27 阅读(1798) 评论(0) 推荐(2) 编辑
摘要:【题 目】输入一个正整数数组,将他们连接起来排成一个数,输出所有排出的数字中最小的一个。例如:输入数组『32,321』,输出所能排出的最小数为:32132.请给出该问题的算法。 【思 路】我们希望能够找到一种规则,按照这种规则排列出来的数是最小的数。要确定排序的规则,我们就必须知道,对于任意两个正整数a和b,如果确定一个规则,使得按照该问题进行排序能得到最小的数,也就是要比较a和b的值,而这种比较不是普通的数值的大小。 对于数字a和b,排列的结果为ab和ba,如果ab小于ba,应该输出ab,即a排在b的前面,也就是a<b。反之,如果ba小于ab,即b排在a前面,也就是b<a。如果a 阅读全文
posted @ 2011-12-10 22:44 python27 阅读(3020) 评论(6) 推荐(2) 编辑
摘要:开篇前言:为什么写这篇文章?笔者目前在学习各种各样的算法,在这个过程中,频繁地碰到到递归思想和分治思想,惊讶于这两种的思想的伟大与奇妙的同时,经常要面对的一个问题就是,对于一个给定的递归算法或者用分治思想缩小问题规模的算法,如何求解这个算法的时间复杂度呢?在google过很多的博文后,感觉这些博... 阅读全文
posted @ 2011-12-09 23:13 python27 阅读(48292) 评论(11) 推荐(15) 编辑
摘要:【题 目】输入一个字符串,打印该字符串的所有排列。例如输入字符串abc,输出其全排列为abc,acb,bac,bca,cab,cba。【思 路】我们想一下,如果不编程,手工做的话,我们的基本考虑是:每次首先固定一个字母,然后让其余的字母全排列;然后换一个字母固定,再全排列其余的字母,如此循环而已。换句话说:假设长度为n的字符串排列方式是f(n),那么我们的基本思路是:每次让n个字母中的一个字母“打头阵”,其余的n-1个字母则按f(n-1)的方式排列。这样我们就明白这明显是递归思路。 递归最重要的问题是:结束的条件是什么?或者说,最小子问题是什么?还是以上面的abc例子来说明,首先固定a,然后. 阅读全文
posted @ 2011-12-08 22:43 python27 阅读(4562) 评论(1) 推荐(2) 编辑
摘要:【题 目】一个整型数组中除了两个数字外,其他的数字都出现两次。请找出这两个只在数组中出现一次的数字。要求时间复杂度O(n),空间复杂度O(1)。【思 路】首先我们考虑一个稍微简单点的情况:如果这个数组中只有一个数字出现且仅出现一次,其他数字都出现两次,我们应该怎么样找出这个数字呢?我们题目说数字出现两次有什么深意呢?我们很容易联想到异或运算,因为任何一个数字和自身异或的结果为0;知道了这点,我们就很容易知道,我们将所有的数字进行异或,其结果就是仅出现一次的数字,因为其他所有的数字都两两异或为0了。 有了上面那个简单题目作为引子,我们很容易想到,如果我们将原题目的数组成功的分为两个子数组,而每. 阅读全文
posted @ 2011-12-07 22:24 python27 阅读(3530) 评论(7) 推荐(5) 编辑

点击右上角即可分享
微信分享提示