算法
文章平均质量分 83
MatthiasDong
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
快速旋转数组(或字符串)
介绍一种时间复杂度为O(n),空间复杂度为O(1)的算法。俗称三步翻转法。例如想把“123456”旋转为“456123”,第一步,旋转123为321,第二部旋转456为654,整个变为“321654”,第三步对此整体做一次旋转,即变为“456123”class QuickReverse {private: void reverse(int arr[], int begin, int e原创 2016-07-23 22:10:32 · 452 阅读 · 0 评论 -
寻找最小的k个数
从n个书中找出最小的k个数。解法有如下几种:(1)全部排序之后找前k个,时间为O(n*n)(2)部分排序。维护一个大小为k的数组a[k],遍历n个数的过程中更新数组a。时间为O(k*n)(3)维护一个容量为k 的大顶堆,遍历过程中更新堆。时间为O(nlogk)。(4)下面着重介绍一种平均时间复杂度为O(n)的算法,线性选择算法。该算法的思想类似于快速排序。原创 2016-07-24 09:29:29 · 337 阅读 · 0 评论 -
数字的拆分问题和换零钱问题
一、(1)输入n,和k,问将n用1到k这k个数字进行拆分,有多少种拆分方法。例如:n=5,k=3 则有n=3+2, n=3+1+1, n=2+1+1+1, n=2+2+1, n=1+1+1+1+1这5种拆分方法。 这个问题是动态规划问题,用a[i][j]表示考虑到用数j进行拼接时数字i的拼接方法,可以得到状态转移方程如下:a[i][j]=a[i][j-1]+a[i-j][j-1]+a[i原创 2016-03-30 18:59:14 · 662 阅读 · 0 评论 -
找数组中唯一重复的元素
1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次.每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空间。(1) 方法一:(当N为比较大时警惕溢出)将1001个元素相加减去1,2,3,……1000数列的和,得到的差即为重复的元素。int Find(int* a) { int i; for (i转载 2016-07-24 11:00:49 · 457 阅读 · 0 评论 -
找出现奇数次的两个数
一个数组中,有两个数出现了奇数次,其余的数都出现偶数次,找出这两个数。用异或操作可在O(n)时间复杂度和O(1)空间复杂度内找到。 设要找的两个数为A和B,第一步让所有的数异或,结果就是A^B ,记为C,则C中一定有不为0的二进制位,假设第k位。则A或B的第k位不为0,数组中的其余的数中若有第k位不为0的数对,则A或B与这些数对异或,可得到A或B,及异或数组中所有第k位不为0的所有数原创 2016-07-24 22:14:12 · 1715 阅读 · 0 评论 -
红黑树和平衡二叉树 区别
红黑树和平衡二叉树区别如下:1、红黑树放弃了追求完全平衡,追求大致平衡,在与平衡二叉树的时间复杂度相差不大的情况下,保证每次插入最多只需要三次旋转就能达到平衡,实现起来也更为简单。2、平衡二叉树追求绝对平衡,条件比较苛刻,实现起来比较麻烦,每次插入新节点之后需要旋转的次数不能预知。平衡二叉树又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度转载 2016-07-25 22:52:49 · 1265 阅读 · 0 评论 -
求全排列
本文取自July的《编程之法》一书。求n个字符的n!个全排列。解法一: 从字符串中选出一个字符作为排列的第一个字符,然后对剩余的字符进行全排列。如此递归处理,从而得到所有字符的全排列。如字符串为“abc”,按一下步骤进行。将a固定在第一位,求后面bc的排列,得到:“abc”和“acb”。将b固定在第一位,求后面ac的排列,得到:“bac”和“bca”。将c固定在转载 2016-07-28 22:19:27 · 537 阅读 · 0 评论 -
折半查找算法的正确实现
从一个有序数组中查找元素,可以用折半查找,时间复杂度为O(logn)。该算法理解起来比较简单,但能否正确实现的人并不多。下面给出该算法的正确实现int binarySearch(int *arr, int size, int key) { int left = 0; int right = size - 1; /*如果上面这句是int right = size的话,则下面有两原创 2016-07-28 10:35:49 · 2101 阅读 · 0 评论
分享