算法
文章平均质量分 86
shanql
这个作者很懒,什么都没留下…
展开
-
几何约束求解思维框架
几何约束求解思维框架转载 2024-02-02 22:45:00 · 650 阅读 · 0 评论 -
算法练习:矩阵清零
问题描述给定一个二维的m * n 矩阵,如果某个元素为0, 那么将其所在行和列的所有元素设为0。不允许使用额外的矩阵空间。 举例1034 000056080000原创 2015-06-21 19:22:25 · 1370 阅读 · 0 评论 -
算法练习:数位重组
一、问题描述给定两个数组表示整数,比如Array1 = {2,4,1,0},Array2 = { 1,2,3,4},求第二个数组重组后的值,此值最接近第一个数组表示的整数,并且大于第一个数组中表示的整数。假设两个整数数组大小相同,并且肯定能找出符合条件的数。举例:输入:{2,4,1,0}和{1,2,3,4}输出:{2,4,1,3} 二、分析与解答将数组2中的数按从小到大原创 2015-06-14 20:37:58 · 956 阅读 · 0 评论 -
算法练习:重叠区间个数
一、题目描述给定多个可能重叠的区间,找出重叠区间的个数。举例如下:输入:[1,5],[10,15],[5,10],[20,30]输出:2 说明:题意应该是找出重叠区间中区间的最大个数,当没有区间重叠时,重叠个数最大为1,比如输入为:[1,5],[10,15],则输出为1;输入为:[1,2],[2,3],[3,4],[4,5],则输出为2(重叠区间相互之间都要有交集)原创 2015-06-14 17:56:21 · 9065 阅读 · 0 评论 -
算法练习:最大下标距离
一、题目描述给定一个整型数组,找出最大下标距离j-i,当且仅当a[j]>a[i],i 。 二、直观方案( 时间复杂度为O(n^2) )对每个元素,从其后找出比其大的元素,并计算下标距离,取距离中的最大值即可。该方案的时间复杂度为O(n^2)。那么能不能优化下呢? 三、优化方案( 时间复杂度为O(n) )存在这样一个事实,当a[i+1]大于a[i]时,如果在它们原创 2015-06-11 22:19:55 · 2264 阅读 · 3 评论 -
算法练习:TopK_1
问题描述求一维数组中最小的K个数。 方法一:排序先把数组从小到大排序,取前K个数。时间复杂度为O(nlogn)。如果数组过大,机器内存无法同时容纳整个数组,则需要使用外部排序。以下程序使用的是标准库algorithm中的排序方法----std::sort,代码如下://排序法,算法复杂度O(nlogn)void GetTopK_Sort( int nArray[], in原创 2015-06-30 15:00:21 · 902 阅读 · 0 评论 -
算法练习:产生指定范围的随机数
一、问题描述给出一个整型数组,以及一个区间范围[min,max],写一个函数产生一个在此区间范围内的随机数,并且该随机数不在数组里,假设总能找到该随机数。 二、分析与解答分成两步,即可解答。第一步,生成一个随机数x包含于[min,max];第二步,判断此随机数是否在数组中,是的话重新生成一个随机数再执行第二步,否则返回此随机数。在判断随机数是否在数组中,如果采用顺序查找的方式,原创 2015-06-14 21:19:17 · 1634 阅读 · 0 评论 -
算法练习:数组配对
一、问题描述给定N个整数,N为偶数,是否能找到N/2对,使得每对和能被K整除。注意:每个元素只能出现在一个配对中。 二、观察、解析从每个数被K整除后的余数情况,即可判断出结果。具体过程请看以下代码实现。 三、编程实现////////////////////////////数组配对#include using namespace std; boo原创 2015-06-14 18:44:28 · 1604 阅读 · 0 评论 -
大整数乘法(简单模拟乘法过程)
一、分析整数的数值超过计算机硬件所能表示的最大值时,那么我们只能借助软件的方法来实现大整数的乘法了。 我们可以使用字符串来模拟大整数的乘法,算法的思想就是使用我们在小学时学过的乘法,一位位相乘,最后计算出结果。如下:1 2 3x 1 2------------------------2 4 61 2 3----------------------原创 2015-06-15 17:29:25 · 4839 阅读 · 0 评论 -
奇数魔方矩阵的实现
/**************************************************程序:奇数魔方矩阵的实现完成者:小单完成时间:2013年5月7日***************************************************//******************************************************原创 2014-11-11 10:55:18 · 953 阅读 · 0 评论 -
谈一下ACM的入门书籍及方法
首先说一下,ACM的入门方法多种多样,大部分人还是跟着学校一起参加集训,所以我这里主要是想对那些准备ACM入门的业余的朋友谈的。入门书籍:首先推荐一些ACM的书籍:(以下我都会给出在当当网的页面,方便大家直接购买,以下排名不分先后)1.《程序设计导引及在线实践》http://product.dangdang.com/product.aspx?product_转载 2015-06-12 09:49:54 · 602 阅读 · 0 评论 -
素数算法的优化之路
素数算法的优化之路原创 2015-06-02 12:49:28 · 3105 阅读 · 0 评论 -
算法练习:排列组合之组合和
问题描述给出一组不同的正整数序列和一个目标值,求出所有可能的组合,使得组合里所有元素和为目标值。要求:1)每个组合里的元素按照升序排列。2)输出组合里不含有重复的组合。3)输入序列中的整数可以多次使用。 举例:输入{2,3,4,7},目标值为7输出{7},{2,2,3},{3,4} 问题分析为了让输出元素按升序排列,可对输入序列进行排序。同这里我们使用递原创 2015-07-01 15:00:05 · 1800 阅读 · 1 评论 -
算法练习:排列组合之全排列
问题描述输入一个不含相同数字的序列,输出所有可能的排列。 问题分析与之前的“求解子集合”类似,使用递归方法:典型的在for循环内调用递归函数。不同的是,必须等到所有的数字均在集合里才能输出。为了记录每个数字的使用情况,还需一个辅助数组记录每个数字的使用情况。详见代码部分的FullPermutation函数。 扩展问题如果数列中含有重复的数字,并且输出的结果不含重复原创 2015-07-01 17:28:13 · 1239 阅读 · 0 评论 -
算法练习:两数之和
题目:给定一个整型数组,是否能找出两个数使其和为指定的某个值?注:整型数组中不存在相同的数。原创 2015-06-06 15:22:47 · 3095 阅读 · 2 评论 -
递归与分治策略:Strassen矩阵乘法
辅助函数为了便于代码的编写,以及在函数参数中传二维数组的方便,写了以下三个辅助函数。//数组寻址辅助函数int& GetArrayVal( int* pMatrix, int nCol, int i, int j ){ return *( pMatrix + i * nCol + j);}//创建矩阵void CreateMatrix( int** pMatrix, int原创 2015-06-22 17:54:21 · 7538 阅读 · 0 评论 -
动态规划:矩阵连乘问题
以下只是对此问题的一个代码实现,具体理论部分请参见王晓东《算法设计与分析》第2版3.1节 矩阵连乘问题。#include #include using namespace std;#define MAX_COUNT 20//矩阵属性struct tagMatrixAttribute{ int row; int col;};//矩阵连乘加括号求解void Ma原创 2015-06-29 15:35:48 · 1207 阅读 · 0 评论 -
排序算法:快速排序
#include using namespace std;int Partition( int nArray[], int iLow, int iHigh ){ int pivotKey = nArray[iLow]; while ( iLow < iHigh ) { while( iLow = pivotKey ) --iHigh; nArray[iLow] =原创 2015-06-23 09:38:27 · 410 阅读 · 0 评论 -
排序算法:堆排序
#include using namespace std;//自上而下调整成小顶堆//nArray[iFrom+1,.....,iTo]是一个小顶堆void AdjustHeapFromTopToDown( int nArray[], int iFrom, int iTo ){ if ( iFrom = iTo ) { return; } //数组索引从0开始,左孩子原创 2015-06-23 09:31:08 · 322 阅读 · 0 评论 -
排序算法:归并排序
#include using namespace std;void Merge( int nArray[], int nArrayResult[], int low, int mid, int high ){ int i = low; int j = mid + 1; int k = 0; while( i <= mid && j <= high ) { if ( nAr原创 2015-06-23 11:11:34 · 368 阅读 · 0 评论 -
算法练习:两指针之三色排序
问题描述输入一个整型数组,每个元素在0~2之间,其中0,1,2分别代表红、白、蓝。现要求对数组进行排序,相同颜色的在一起,而且按红白蓝顺序先后排列。要求时间复杂度为O(n)。 问题分析最容易想到的是排序,比如快排,归并,堆排等,但它们的时间复杂度为O(nlogn),与题意不符。第二种想到的是计数排序,扫描一遍过去,分别记录0,1,2的个数,然后再对数组进行赋值。时间复杂度为O(原创 2015-07-03 12:19:48 · 2775 阅读 · 0 评论 -
算法练习:两指针之有序数组去重
问题描述给出一个有序数组,就地移除重复元素,保持每个元素只出现一次,并返回新数组的长度。 问题分析这个比较简单,直接使用两个指针,一个在前,一个在后,扫描一遍数组即可。时间复杂度为O(n^2)。比如数组A = { 1,1, 2, 3, 3 },看下图,思想简单明了。 代码实现#include using namespace std;//去除数组原创 2015-07-02 17:52:06 · 2100 阅读 · 0 评论 -
算法练习:两指针之三数之和为0
问题描述给出一个整型数组,找出所有三个元素的组合,其组合之和等于0。要求在结果集里不含有重复的组合。举例:输入{-2, 1, -1, 2, 1}输出{-2, 1, 1 } 问题分析最容易想到的是穷举法,挑选第一个元素,然后在其后挑选第二个元素,再从除已经挑选出的两个元素之外挑第三个元素,判断三者之和是否为0;第二种想到的是用回溯递归,这两种方法的时间复杂度均为O(n^3原创 2015-07-02 17:32:57 · 2403 阅读 · 1 评论 -
算法练习:排列组合之子集合
问题描述输入一个含有不同数字的序列,输出其所有子集合(含空集)。要求:1)集合里元素有序排列;2)输出结果不含有重复集合 举例输入序列{3,1,2}输出:{},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3} 问题分析可以使用排列组合问题求解的第一种方法:分期摊还。初始化时,结果集合里含有一个空集。当扫描数列时,保留原有集合,同时将当前元素原创 2015-07-01 16:30:44 · 870 阅读 · 0 评论 -
算法练习:排列组合之翻译手机号码
问题描述输入由数字组成的字符串,输出数字代表字母的所有组合。数字代表的字母参见手机9键英文输入键盘。 举例:输入“23”,输出: “ad”,”ae”,”af”,”bd”,”be”,”bf”,”cd”,”ce”,”cf”。 问题分析求解排列组合的问题,其解法固定,且代码统一。通常有两种方法:第一种是类似动态规划的分期摊还的方式,即保存中间结果,依次附上新元素,产生新原创 2015-07-01 12:47:55 · 1334 阅读 · 0 评论 -
算法练习:一维数组旋转
题目描述:求一个一维数组向右旋转K个位置后的结果。比如,一维数组{1, 2, 3, 4, 5},当k = 2时,求得的结果为{4, 5, 1, 2, 3}。要求常数级空间复杂度,允许修改原有数组。 一、使用额外的空间(在不要求常数级空间复杂度的情况下)这样很简单,使用一个额外的空间,保存原有数组的元素,然后可以错位复制原有数组元素,即可达到题目的要求。比如数组{1, 2, 3, 4原创 2015-06-08 20:33:34 · 2596 阅读 · 1 评论 -
求递归算法时间复杂度:递归树
原文出处:http://www.cnblogs.com/wu8685/archive/2010/12/21/1912347.html递归算法时间复杂度的计算方程式一个递归方程: 在引入递归树之前可以考虑一个例子: T(n) = 2T(n/2) + n2 迭代2次可以得: T(n) = n2 + 2(2T(n/4) + (n/2转载 2015-06-16 10:39:01 · 439 阅读 · 0 评论