随笔分类 -  算法

摘要: 阅读全文
posted @ 2020-03-22 15:54 和风细羽 阅读(753) 评论(0) 推荐(1)
摘要: 阅读全文
posted @ 2020-03-22 12:26 和风细羽 阅读(804) 评论(0) 推荐(0)
摘要:一、问题描述构造出0~n-1 的所有子集。二、算法分析一次选出一个元素放入集合。三、代码实现#define ARRAY_LENGTH 10{ int A[ARRAY_LENGTH]; print_subset(ARRAY_LENGTH, A, 0);}void print_subset(int n, int* A, int cur){ // cur:当前位置 prin... 阅读全文
posted @ 2020-03-15 14:01 和风细羽 阅读(162) 评论(0) 推荐(0)
摘要: 阅读全文
posted @ 2020-03-15 14:00 和风细羽 阅读(230) 评论(0) 推荐(0)
摘要:1、交换 A 和 B// 1.中间变量void swap1(int a, int b) { int temp = a; a = b; b = temp;}// 2.加法void swap2(int a, int b) { a = a + b; b = a - b; a = a - b; }// 3.异或(相同为0,不同为1)void swap3(int a, int b)... 阅读全文
posted @ 2020-03-15 13:59 和风细羽 阅读(172) 评论(0) 推荐(0)
摘要:一、问题描述有一座高度是10 级台阶的楼梯,从下往上走,每跨一步只能向上1 级或者2 级台阶。要求用程序来求出一共有多少种走法。二、算法分析从简单的分析,要到第 10 级台阶,有多少种方法?要么从 9 级跨 1 级,要么从 8 级跨 1 级。记 10 级台阶的状态为 f(10),9 级台阶的状态为 f(9),8 级台阶的状态为 f(8),那么 f(10) = f(9) + f(8)。f(9)... 阅读全文
posted @ 2020-03-15 13:58 和风细羽 阅读(304) 评论(0) 推荐(0)
摘要:一、冒泡排序1.1 简介冒泡排序是蛮力法在排序问题上的一个典型的应用场景。对于一个给定长度为 n 的无序数组,由初始位置开始,比较数组相邻两个元素。如果是逆序排列的,就交换它们的位置,重复多次之后,最大数就“沉”到了数组最后的位置。第二次再从初始位置开始,将第二大的元素沉到倒数第二个位置。这样一直做 n-1 次,整个数组就是有序的了。对于一个长度为 n 的数组,整个算法消耗的时间为:(n-1) +... 阅读全文
posted @ 2020-03-15 13:57 和风细羽 阅读(338) 评论(0) 推荐(0)
摘要:一、问题描述在一个 2k * 2k(k ≥ 0)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为特殊方格,显然,特殊方格在棋盘中出现的位置有 4k 种情形,因而有 4k 种不同的棋盘。二、算分分析用分治策略。当 k > 0 时,将 2k * 2k 棋盘分割成 4 个2k-1 * 2k-1子棋盘,特殊方格必定只位于某个子棋盘中。用一个 L 型骨牌覆盖 3 个无特殊方格子棋盘的结合处... 阅读全文
posted @ 2020-03-15 13:54 和风细羽 阅读(453) 评论(0) 推荐(0)
摘要:#includeusing namespace std;void swap_t(int a[],int i,int j){ int t=a[i]; a[i]=a[j]; a[j]=t;}int par(int a[],int p,int q)//p是轴,轴前面是比a[p]小的,后面是比a[p]大的{ int i=p,x=a[p]; for(int j=p+1;j=x)... 阅读全文
posted @ 2020-03-15 13:52 和风细羽 阅读(127) 评论(0) 推荐(0)
摘要:一、问题描述有 n 个数或字符,有多少种排列方法。二、算法分析采用分治法把大问题分解成很多的子问题。大问题是所有的排列方法,分解得到的小问题就是以 1 开头的排列,以 2 开头的排列,以 a 开头的排列,以 b 开头的排列...把这些问题继续分解,以 12 开头的排列,以 123 开头的排列...将余下的看成大问题,一直分解下去,直到分解成的子问题只有一个数字或字符的时候,不再分解。因为 1 个数... 阅读全文
posted @ 2020-03-15 13:51 和风细羽 阅读(198) 评论(0) 推荐(0)
摘要:一、分治 1.1 基本思想 将一个难以直接解决的大问题,分割成 n 个规模较小的子问题,这些子问题相互独立,且与原问题相同,然后各个击破,分而治之。 能用分治法的基本特征: 问题缩小到一定规模容易解决 分解成的子问题是相同种类的子问题,即该问题具有最优子结构性质(递归思想) 分解而成的小问题在解决之 阅读全文
posted @ 2020-03-15 13:50 和风细羽 阅读(1051) 评论(0) 推荐(0)
摘要:一、问题描述有 5 座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人数也不同。参与挖矿工人的总数是 10 人。每座金矿要么全挖,要么不挖,不能派出一半人挖取一半金矿。要求用程序求解出,要想得到尽可能多的黄金,应该选择挖取哪几座金矿?二、算法分析w 表示总共人数,n 表示金矿数,排列组合每一座金矿都有挖与不挖两种选择,排列组合起来就有 2n 种选择。对所有可能性做遍历,剔除那些使用工人数超过 10... 阅读全文
posted @ 2020-03-15 13:45 和风细羽 阅读(478) 评论(0) 推荐(0)
摘要:一、问题描述一个袋子里有若干硬币,其中一枚是假币,并且和假币和真币一模一样,目前只知道假币比真币轻一点。请问如何找到这枚假币?二、算法分析根据分治的策略,将硬币平分为两份(奇数个硬币取出中间的硬币后再平分),比较两边的重量之和的大小。左侧重,则假币在右半段,反之,假币在左半段(或者中间的假币),然后继续在有假币的半区查找,直到剩余两个硬币,比较大小后,返回假币的位置。时间复杂度:O(logn)。三... 阅读全文
posted @ 2020-03-15 13:42 和风细羽 阅读(792) 评论(0) 推荐(0)
摘要:一、问题描述 设有 n = 2k 个运动员要进行网球循环赛。现在要设计一个满足以下要求的比赛日程表 每个选手必须与其他 n 1 个选手各赛一场 每个选手一天只能比赛一场 循环赛一共进行 n 1 天 二、算法分析 按此要求可将比赛日程表设计成 n 行 n 1 列的表,在表中第 i 行和第 j 列处填入 阅读全文
posted @ 2020-03-15 13:40 和风细羽 阅读(3940) 评论(0) 推荐(1)
摘要:1、问题描述假设有 1 元、3 元、5 元的硬币无限个,现在需要凑出 11 元,问如何组合才能使硬币的数量最少?2、算法分析有最小单位 1 的情况下,可以使用贪心算法:NSInteger count = m / 5;NSInteger mol = m % 5; if(mol/3 > 0) { count++; mol %= 3;} count += mol;但当硬币的种... 阅读全文
posted @ 2020-03-15 13:38 和风细羽 阅读(387) 评论(0) 推荐(0)
摘要:1、问题描述将一个正整数 n 写成如下形式n = m1 + m2 + ... + mi; (其中 mi 为正整数,并且 1 1 f(n, m) = f(n, n-1) + 1 加上的 1 代表 n + 0 = n 这个划分方案③、n n的情况④、n > m f(n, m) = f(n, m-1) + f(n-m, m);f(n, m-1) 表示划分方案中没... 阅读全文
posted @ 2020-03-15 13:36 和风细羽 阅读(424) 评论(0) 推荐(0)
摘要:1、问题描述给定一个字符串s,找到s中最长的回文子串。2、算法分析大多数问题都可以用暴力法解决。暴力法将选出所有子字符串可能的开始和结束位置,并检验它是不是回文。时间复杂度:O(n3),假设n是输入字符串的长度,则 (n *(n−1))/2​为此类子字符串(不包括字符本身是回文的一般解法)的总数。因为验证每个子字符串需要O(n)的时间,所以运行时间复杂度是O(n3)。空间复杂度... 阅读全文
posted @ 2020-03-15 13:35 和风细羽 阅读(184) 评论(0) 推荐(0)
摘要:1、问题描述给定一个无序的整数数组,找到其中最长上升子序列的长度。如:[5, 3, 4, 8, 6, 7] 返回 4。2、算法分析面对这个问题,首先要定义一个"状态"来代表它的子问题, 并且找到它的解。注意,大部分情况下,某个状态只与它前面出现的状态有关,而独立于后面的状态。假如考虑求 A[1], A[2], ..., A[i],i d[i]) d[i] = d[... 阅读全文
posted @ 2020-03-15 13:34 和风细羽 阅读(234) 评论(0) 推荐(0)
摘要:1、问题描述计算 an2、算法分析先将 n 变一变,寻找新的计算路径。预处理就是变治法的根本。如果单纯循环执行 n 次相乘,那么时间复杂度为 O(n)。可以利用二进制幂大大改进效率。主要思路是:将十进制的 n 转换成二进制的数组序列 b[]。二进制幂求解有两种方法:从左至右二进制幂和从右至左二进制幂。从左至右二进制幂变换:an = a(b[n]2m + ... + b[0]20)先求 n 的二进制... 阅读全文
posted @ 2020-03-15 13:33 和风细羽 阅读(1379) 评论(0) 推荐(0)
摘要:1、问题描述在一个有序(升序)数组查找一个数 x2、算法分析暴力的做法就是拿 x 跟数组里面每个数比较一下,然后返回找到的 x 的下标。这里明显可以使用分治的思想:可以把数组分成很多部分,在每个部分里面查找 x。如果所有部分都没有找到 x,那么把这些子问题合并起来后,表示整个数组里没有 x。这很好的反应了分治的思想,先分解成很多小问题,解决这些小问题,把解决的小问题合并起来,大问题就解决了。3、代... 阅读全文
posted @ 2020-03-15 13:30 和风细羽 阅读(174) 评论(0) 推荐(0)