随笔分类 -  算法

摘要:一. 问题 外汇交易可以通过兑换不同国家的货币赚取汇率差。比如1美元兑换100日元时购入1000美元,然后等汇率变动到1美元兑换108美元时再卖出,这样就可以赚取(108 - 100)× 1000 = 8000日元。 现在请将某货币在 t 时刻的价格 Rt (t = 0, 1 , 2, ..., n 阅读全文
posted @ 2020-10-22 14:19 Hello_Nolan 阅读(1086) 评论(0) 推荐(0)
摘要:一. 问题 给定一个含有 n 个元素的序列 A,将序列中的元素逆转。 二. 思路 在前两篇文章中,我用到两种手法来逆转数组,第一种是元素交换第二种是用一个额外的栈。现在我们考虑一种新的算法:用一个队列来读入序列中的元素,再将队列中元素弹出,从后向前重新放回序列中,这样就完成了整个序列的逆转。此算法的 阅读全文
posted @ 2020-08-30 18:24 Hello_Nolan 阅读(134) 评论(0) 推荐(0)
摘要:一. 问题 给定一个含有 n 个元素的序列 A,将序列中的元素逆转。 二. 思路 在前一篇文章中,我选择用用临时变量,来进行前后元素交换。这种算法的时间复杂度是 O( n ),空间复杂度是 O( 1 )(因为用到了有限个临时变量)。现在我们考虑一种新的算法:用一个栈来读入序列中的元素,再将栈中元素弹 阅读全文
posted @ 2020-08-30 18:07 Hello_Nolan 阅读(156) 评论(0) 推荐(0)
摘要:一. 问题 给定含 n 个整数的数组,找出连续的有序最长子数组。算法的运行时间是多少? 二. 思路 假设有一个序列, data = (1, 2, 3, 4, 2, 1, 3, 0),显然,从元素 1 到元素 4 是升序排列的,并且有 4 个元素。我们为了简单起见,仅查找升序排列的子序列。 要获得子序 阅读全文
posted @ 2020-08-26 03:31 Hello_Nolan 阅读(588) 评论(0) 推荐(0)
摘要:一. 问题 给定一个由 0 到 9 的 n 个数字组成的字符串 S,描述一个将 S 转换成它表示的整数的有效算法。算法的运行时间是多少? 二. 思路 按照题目,我们假设给定字符串为 S = “12345”,可以看出,字符串 S 中含有 5 个字符,那么我们怎么将它们转换成相应整数?先将问题进行简化, 阅读全文
posted @ 2020-08-25 22:39 Hello_Nolan 阅读(619) 评论(0) 推荐(0)
摘要:一. 问题 给定一个数组 A,描述一个将 A 逆转的高效算法。例如,如果 A = (1, 2, 3, 4, 5),逆转以后是 A = (5, 4, 3, 2, 1)。除了 A 本身使用的空间外,只能使用 O( 1 )的额外内存。算法的运行时间是多少? 二. 思路 规定只能使用固定大小的额外内存,说明 阅读全文
posted @ 2020-08-24 22:05 Hello_Nolan 阅读(246) 评论(0) 推荐(0)
摘要:一. 问题 给定一个整数 c 和一个下标从 1 到 n 的数组 A,A 中的元素是范围 1 到 5n(可能有重复)的 n 个整数。描述一个有效算法来确定 A 中是否存在两个整数 A[ i ] 和 A[ j ] ,其和为 c,即 c = A[ i ] + A[ j ], 1 ≤ i < j ≤ n。算 阅读全文
posted @ 2020-08-24 21:24 Hello_Nolan 阅读(244) 评论(0) 推荐(0)
摘要:一. 问题 给定一组序列,找出其中的最大元素。 二. 实例分析 1.循环手法 (1)思路 给定一组序列, data = (1, 3, 4, 9, 12, 3)。我们一眼看出,最大值是 12 ,但是计算机并不能一眼看出。我们用一个变量来保存最大值,并将序列中的每个元素与之比较,如果大于这个最大值,就将 阅读全文
posted @ 2020-08-23 06:10 Hello_Nolan 阅读(1057) 评论(0) 推荐(0)
摘要:一. 问题 给定一个数 n ,用递归的手法求出从 1 到 n 的累加和。 1. 实例分析 假设传入参数 n = 5。 (方法一)高斯公式 1 int gauss_sum(int n) { 2 int sum = (1 + n) * n / 2; 3 4 return sum; 5 } 利用公式,一次 阅读全文
posted @ 2020-08-22 22:16 Hello_Nolan 阅读(2700) 评论(0) 推荐(0)
摘要:一. 问题 给定一组数据,将元素用递归的手法打印出来。 二. 实例分析 1. 循环手法 给定一组数据, data = (1, 2, 3, 4, 5, 6)。现在要打印元素,常规手法就是用循环,代码如下: 1 void print_element(const vector<int>& data) { 阅读全文
posted @ 2020-08-22 10:03 Hello_Nolan 阅读(467) 评论(0) 推荐(0)
摘要:一. 最大子序列和-联机算法 在前两篇博文中,我们了解了两种较差算法,和一种分治算法。下面我们讲解一个更好的方法:联机算法。这种算法的时间复杂度是 O(n)。这个方法也是解决这个问题的最好算法,因为无论如何,读取数据也要 n 次。 1. 实例分析 给定一组数据,data = (1, 4, -3, 7 阅读全文
posted @ 2020-08-21 19:38 Hello_Nolan 阅读(115) 评论(0) 推荐(0)
摘要:在上一篇博文中,我们了解了最大连续子序列和的概念,也实现了两种低效算法,但是我们发现还有更加高效的算法。(好吧,其实并不是我们发现的,几乎每一本教科书里,讲到最大连续子序列和问题时,都会依次分析这4种算法,从而展现对同一问题使用不同方法,产生的效果也会不同)。 一. 最大连续子序列和-分治算法 分治 阅读全文
posted @ 2020-08-21 05:47 Hello_Nolan 阅读(224) 评论(0) 推荐(0)
摘要:一. 定义 1.序列: 给定一组数据,这组数据就叫做序列。这里的数据有可能是一年的交易额,或者有其余的含义。所以数据并不是经过排序的。比如 data = (1, 4, -3, 7, -6, 10). 2.连续子序列: 在序列中,任取连续区间的一组数据,叫做连续子序列。 3.最大连续子序列和: 把每个 阅读全文
posted @ 2020-08-20 04:30 Hello_Nolan 阅读(776) 评论(0) 推荐(0)
摘要:一. 定义 1.移动平均值是什么? (1)移动平均值,是一种统计指标,用于观测一组随时间变化的量。 (2)M-移动平均值,是最后 M 个数的移动平均值。一定要注意,这边算出的平均值是一组数,而不是一个数。 2. 移动平均值怎么算? 首先我们给出一组数据,data = ( 1, 2, 3, 4, 5, 阅读全文
posted @ 2020-08-19 00:18 Hello_Nolan 阅读(1930) 评论(0) 推荐(0)
摘要:一. 问题 一元二次方程的一般形式为 ax2 + bx + c = 0,求出 x 的值。 二. 思路 因为已经明确说明了是二次的,所以我们不考虑 a = 0 的情况。在这里,我们选择利用求根公式计算方程的根。 三. 代码实现 1 void solution(double a, double b, d 阅读全文
posted @ 2020-07-27 15:46 Hello_Nolan 阅读(184) 评论(0) 推荐(0)
摘要:一. 问题 编写程序,找出1到100之间的所有素数。 二. 思路 1. 用一个 vector 保存当前找到的素数,这个 vector 称为素数表。 2. 对 1 到 100 之间的每一个数,都用这个vector中的素数去除,如果发现能整除,那么说明当前这个数是合数;如果不能整除,那么就说明当前这个数 阅读全文
posted @ 2020-07-26 23:45 Hello_Nolan 阅读(302) 评论(0) 推荐(0)
摘要:一. 问题 1. 定义:中值使得一个序列中一半元素在它之前,一半元素在它之后。 2. 问题:求出一个序列的中值。 二. 思路 我们有一个序列,需要知道序列元素的个数。当有奇数个元素时,中值自然就是最中间的数字;当有偶数个元素时,需要将最中间的两个元素相加,求得的平均值就是序列的中值。 序列的元素可以 阅读全文
posted @ 2020-07-25 22:01 Hello_Nolan 阅读(1340) 评论(0) 推荐(0)
摘要:一. 算法内容: 将一组未排序的数字,按照从小到大的顺序排序。 二 . 算法思路及步骤: 算法将元素分为两部分,假想有一条分界线,它的左边是已排序的元素,右边是未排序的元素。算法将相邻数字两两比较,如果前一个数字大于后一个数字,那么交换这两个数,否则向后移动一个数,继续执行比较操作。每趟比较将最大的 阅读全文
posted @ 2020-06-23 23:27 Hello_Nolan 阅读(441) 评论(0) 推荐(0)
摘要:一. 概念引入 1.定义 (1)x 的 n 次多项式: P(x) = anxn + an-1xn-1 + ... + a1x + a0。(其中 x 是底数, n 是指数, ai 是每一项前面的系数, 0 ≤ i ≤ n ,并且最高次项前面的系数不为 0 ) 2. 实例分析 (1)求 xn 的方法: 阅读全文
posted @ 2020-06-22 09:51 Hello_Nolan 阅读(3102) 评论(0) 推荐(0)
摘要:算法内容: 求两个正整数 m , n 的最大公约数。 步骤: 1. 用 m 除以 n 得到余数 r 2. 判断 r 是否为 0 ,如果为 0,那么说明最大公约数是 n,如果不为 0,则将 n 的值给 m ,将 r 的值给 n。直到 r 的值为 0 为止。 算法分解: 实例一: 假设 m = 10, 阅读全文
posted @ 2020-06-15 23:40 Hello_Nolan 阅读(353) 评论(0) 推荐(0)