随笔分类 -  算法笔记

考研复试准备
摘要:所谓质因子分解是指将一个正整数 n 写成一个或多个质数的乘积形式,例如 24=2*2*2*3。显然,由于最后都要归结到若干不同质数的乘积,不妨先把素数表打印出来。 由于每个质因子都可以不止出现一次,因此不妨定义结构体 factor ,用来存放质因子及其个数,如下所示: 而有一个结论:对一个正整数 n 阅读全文
posted @ 2018-01-18 11:29 Just_for_Myself 阅读(1934) 评论(0) 推荐(0)
摘要:素数又称为质数,是指除了 1 和本身之外,不能被其他数整除的一类数。应特别注意的是,1 既不是素数,也不是合数。 本章将解决两个问题:1. 如何判断给定的正整数 n 是否是质数;2. 如何在较短的时间内得到 1~n 内的素数表。 一、素数的判断 只需要判定 n 能否被 2,3,... ,$ \lef 阅读全文
posted @ 2018-01-18 10:03 Just_for_Myself 阅读(532) 评论(0) 推荐(1)
摘要:所谓分数的四则运算是指,给定两个分数的分子和分母,求它们加减乘除的结果。 一、 分数的表示和化简 1. 分数的表示 对一个分数来说,最简洁的写法就是写成 假分数 的形式。因此可以使用一个结构体来储存这种只有分子和分母的分数: 于是就可以定义 Fraction 类型的变量来表示分数,或者定义数组来表示 阅读全文
posted @ 2018-01-17 12:43 Just_for_Myself 阅读(1683) 评论(0) 推荐(1)
摘要:1. 最大公约数 正整数 a 与 b 的最大公约数是指 a 与 b 的所有公约数中最大的那个公约数,一般用 gcd(a,b) 来表示 a 和 b 的最大公约数,而求解最大公约数常用欧几里得算法(即辗转相除法)。 欧几里得算法基于下面这个定理: 设 a、b 均为正整数,则 gcd(a,b) = gcd 阅读全文
posted @ 2018-01-16 20:20 Just_for_Myself 阅读(489) 评论(0) 推荐(0)
摘要:在考试中,经常会出现一类问题,它们不涉及很深的算法,但却跟数学息息相关。这样的问题通常难度不大,也不需要特别的数学知识,只要掌握简单的数理逻辑即可。下面来看一个例题。 【PAT B1019/A1069】数字黑洞 题目:给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非 阅读全文
posted @ 2018-01-16 19:45 Just_for_Myself 阅读(385) 评论(0) 推荐(0)
摘要:1. 打表 打表是一种典型的用空间换时间的技巧,一般将所有可能需要用到的结果事先计算出来,这样后面需要用到时就可以直接查表获得。打表常见的用法有如下几种: 在程序中一次性计算出所有需要用到的结果,之后的查询直接取这些结果。例如在一个需要大量查询 Fibonacci 数的问题中,则可以把所有 Fibo 阅读全文
posted @ 2018-01-16 11:31 Just_for_Myself 阅读(428) 评论(0) 推荐(0)
摘要:什么是 two pointers 以一个例子引入:给定一个递增的正整数序列和一个正整数 M,求序列中的两个不同位置的数 a 和 b,使得它们的和恰好为 M,输出所有满足条件的方案。 本题的一个最直观的想法是,使用二重循环枚举序列中的整数 a 和 b,判断它们的和是否为 M。时间复杂度为 O(n2)。 阅读全文
posted @ 2018-01-15 20:40 Just_for_Myself 阅读(1294) 评论(0) 推荐(0)
摘要:二分查找 二分查找是基于有序序列的查找方法(以下假设严格单调自增),该算法一开始令 [left,right] 为整个序列的下标区间,然后每次测试当前 [left,right] 的中间位置 mid=(left+right)/2 ,判断 A[mid]与欲查询的元素 x 的大小: 如果 A[mid] == 阅读全文
posted @ 2018-01-14 20:00 Just_for_Myself 阅读(721) 评论(0) 推荐(0)
摘要:简单贪心 PAT B1020 月饼 题意:现有月饼需求量为D,已知 n 种月饼的库存量和总售价,问如何销售这些月饼,使得可以获得的收益最大。求最大收益 思路:总是选择单价最高的月饼出售,可以获得最大利润 1 #include <cstdio> 2 #include <string> 3 #inclu 阅读全文
posted @ 2018-01-13 11:01 Just_for_Myself 阅读(473) 评论(0) 推荐(1)
摘要:分治 将原问题划分为若干个规模较小而结构与原问题相同或相似的子问题,然后分别解决这些子问题,最后合并子问题的解,即可得到原问题的解。 分解 解决:递归求解所有子问题 合并 递归 使用递归求解 n 的阶乘 // n! = 1*2*...*n int F(int n) { if(n==0) return 阅读全文
posted @ 2018-01-12 10:47 Just_for_Myself 阅读(399) 评论(0) 推荐(0)
摘要:散列的定义与整数散列 题目要求:M个预查询的数中每个数在N个数中出现的次数 思路:设定一个int型数组 hashTable[10010] ,然后在输入 N 个数时进行预处理,即当输入的数为 x 时 ,就令 hashTable[x]++,时间复杂度为 O(N+M) #include <cstdio> 阅读全文
posted @ 2018-01-09 11:32 Just_for_Myself 阅读(431) 评论(0) 推荐(0)
摘要:简单选择排序 令i从0到n-1枚举,进行n趟操作,每趟从A[i,n]中选择最小的元素 ,算法复杂度为O(n^2) /* 选择排序 思路:令i从0到n-1枚举,进行n趟操作,每趟从A[i,n]中选择最小的元素 */ void selectSort(int A[], int n) { for(int i 阅读全文
posted @ 2018-01-06 14:31 Just_for_Myself 阅读(407) 评论(0) 推荐(0)
摘要:简单模拟 PAT B1001 害死人不偿命的(3n+1)猜想 // time: 2018.01.03 // title: PAT B1001 害死人不偿命的(3n+1)猜想 P85 // idea: 利用循环直接模拟即可 #include <cstdio> #include <cstring> #i 阅读全文
posted @ 2018-01-05 15:33 Just_for_Myself 阅读(419) 评论(0) 推荐(0)
摘要:C/C++入门 阅读全文
posted @ 2018-01-02 18:52 Just_for_Myself 阅读(1238) 评论(0) 推荐(0)
摘要:算法笔记 第 2 章 C/C++ 快速入门 第 3 章 入门篇(1)——入门模拟 第 4 章 入门篇(2)——算法初步 4.1 排序 4.2 散列 4.3 递归 4.4 贪心 4.5 二分 4.6 two pointers 4.7 其它高效技巧与算法(打表、递推、随机选择) 第 5 章 入门篇(3) 阅读全文
posted @ 2018-01-01 11:40 Just_for_Myself 阅读(456) 评论(0) 推荐(1)