![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法拾遗
文章平均质量分 77
兰亭风雨
在路上
展开
-
【算法拾遗】二分查找递归非递归实现
本篇博文没太多要说的,二分查找很简单,也是常见常考的查找算法,一下是递归非递归的实现。 非递归实现:原创 2014-06-24 12:45:59 · 4557 阅读 · 2 评论 -
【算法拾遗】阶乘
前言 主要看两道题,我们通过这两道题目引伸出一些结论。题目一:N!末尾0的个数 找末尾0出现的个数,那我们就要找产生0的乘数,即哪些数相乘会得到10。我们需要对N!进行质因数分解,由于10 = 2*5,因此0的个数至于N!中2和5出现的的对数有关,而能被2整除的数出现的频率比能被5整除的数要多得多,因此我们找出N!中质因数5出现的个数,即为N!末尾0的个数。原创 2014-06-04 00:48:44 · 2707 阅读 · 0 评论 -
【算法拾遗】最大公约数
求两个正整数的最大公约数是一个很古老且很基本的问题,欧几里得在其著作《几何原本》中给出了高效的解法——辗转相除法,也叫做欧几里得算法。下面我们来看下求最大公约数的一些方法。方法一 我们先来看欧几里得的辗转相除法。原理很简单,假设用f(x,y)表示x和y的最大公约数,我们令x>y,则有x=ky+b,如果一个数能够同时整除x和y,则必能同时整除b和y,而能够同时整除b和y的数也必能同时整除x和y,即x和y的公约数与b和y的公约数相同,因此二者的最大公约数也相同,则有f(x,y)=f(y,x%y),一原创 2014-06-05 00:44:58 · 3431 阅读 · 3 评论 -
【算法拾遗】子数组的最大乘积
给定一个长度为N的整数数组,只允许使用乘法,不能使用除法,计算任意N-1个数的组合乘积的最大值。 这道题目重点要注意数组中有负数、0的情况。最直观的做法就是把所有可能的N-1个数的组合找出来,分别计算他们的乘积,并比较大小。找出所有组合需要O(N)时间,计算每个组合的乘积需要O(N)时间,因此该算法的时间复杂度为O(N*N)。 编程之美上给出了两种O(N)的解法。 第一种比较直观,假设去掉第i个元素后的剩下的N-1个元素的成绩为p[i],则从左向右扫描数组,计算第0到第i-1个元素原创 2014-06-08 08:33:03 · 5603 阅读 · 0 评论 -
【算法拾遗】阿里实习生电面题目:输出给定字符串的全部连续子串
今天下午阿里电面的题目,给定一个字符串,输出其所有连续子串,如:给定字符串为abcd,则要输出的其全部连续子串为:a,b,c,d,ab,bc,cd,abc,bcd,abcd。 很快给出了最简单的方法,就是先从第一个字符遍历,向后输出,再从第二个字符开始遍历,向后输出,依此类推,直到开始遍历的字符为数组的最后一个字符。这个时间复杂度很高啊,要O(n*n*n)。 接下来就假设字符串很大,想优化的方法,不知道脑子是短路了还是咋地,居然联想到Trie树上去了,完全不沾边的东西。电面后想了下,感觉应该原创 2014-03-12 00:19:29 · 24556 阅读 · 172 评论 -
【算法拾遗】最大数和最小数
求一个数组中的最大值和最小值,我们一般的做法是扫描一遍数组求的最大值,扫描一遍数组求最小值,这样做需要比较2N次才能求解。而实际上我们可以比较1.5N次即可得到结果。考虑如下几种方法。 方法一: 我们可以把数组分成两部分,首先按照顺序将数组中的相邻的两个数分在同一组,接着比较同一组中奇数位上的值和偶数位上的值,将较大的放在偶数位上,较小的放在奇数位上,这样经过0.5N次比较后,最大数肯定在偶数位上,最小的数肯定在奇数位上,而后分别扫描一遍数组的偶数位和奇数位,便可得到最大值和最小值。这样,原创 2014-06-06 00:07:29 · 5691 阅读 · 0 评论 -
【算法拾遗】大数相加(不开辟额外空间)
大数相加可以借助多种方法来实现,这里提供了一种链表节点的数据域为int型(用char型也可以,这样更省空间)的思路。这篇文章采用常用的转变为字符串进行处理的方法,下面说下我用字符串实现大数相加的思路: 假设输入了如下两个字符串(其中上面的红色部分表示数组的下标,下面的绿色和黄色部分表示各字符):原创 2014-05-12 10:07:14 · 4320 阅读 · 7 评论 -
【算法拾遗】三种方法求连续子数组的最大和
这是一道考的烂的不能再烂的题目,但是依然有很多公司乐于将这样的题目作为笔试或面试题,足见其经典。 问题是这样的:一个整数数组中的元素有正有负,在该数组中找出一个连续子数组,要求该子数组中各元素的和最大,这个子数组便被称作最大子数组。比如数组{2,4,-7,5,2,-1,2,-4,3}的最大子数组为{5,2,-1,2},最大子数组的和为5+2-1+2=8。 下面按照时间复杂度逐步优化的顺序依次给出这三种算法。原创 2014-03-13 00:09:18 · 36468 阅读 · 27 评论