
小算法
漠漠兔八哥
一只傻不拉几的兔纸
展开
-
Dijkstra算法的一个例子
<br /> Dijkstra算法的输入包含了一个有权重的有向图G,以及G中的一个来源顶点S。 我们以V表示G中所有顶点的集合。 每一个图中的边,都是两个顶点所形成的有序元素对。(u,v)表示从顶点u到v有路径相连。 我们以E所有边的集合,而边的权重则由权重函数w: E → [0, ∞]定义。 因此,w(u,v)就是从顶点u到顶点v的非负花费值(cost)。 边的花费可以想像成两个顶点之间的距离。任两点间路径的花费值,就是该路径上所有边的花费值总和。 已知有V中有顶点s及t转载 2010-12-06 22:59:00 · 11038 阅读 · 2 评论 -
一道中兴笔试题
题目:输入两个整数n和m,从数列1,2,3...n中随意取几个数,使其和等于m,要求列出所有的组合。#include #include using namespace std;list list1;void find_factor(int sum,int n){ //递归出口 if(n<=0||sum<=0) return; //输出找到的数 if(sum==n) {原创 2012-05-08 21:18:52 · 2211 阅读 · 1 评论 -
n个数找三个数,和等于c
先排序,复杂度o(nlgn),再处理。可以做到O(n2),不知道还有没有更好的方法。#include #include using namespace std;//O(n3)void help1(int a[],int length,int value){ for(int i=0;i<length-2;i++) for(int j=i+1;j<length-1;j++)原创 2012-05-09 22:39:47 · 1451 阅读 · 0 评论 -
反转一个句子
题目:给定一个字符串,按单词将该字符串逆序,比如给定"This is a sentence",则输出是"sentence a is This",为了简化问题,字符串中不包含标点符号。分两步1 先按单词逆序得到"sihT si a ecnetnes"2 再整个句子逆序得到"sentence a is This"对于步骤一,关键是如何确定单词,这里以空格为单词的分界原创 2012-05-10 15:29:50 · 3805 阅读 · 0 评论 -
数字串前第一小比它小的数
一个数字串,某一位前面的第一小的数。比如1 3 2 4 对应的就是0 1 1 2#include #include using namespace std;void find(int a[],int b[],int length){ memset(b,0,length); for(int i=1;i<length;i++) { if(a[i]>a[i-1]) b原创 2012-05-12 09:22:09 · 724 阅读 · 0 评论 -
两个子串的和的最大值
题目:POJ 2593题意:两个子串的和的最大值,两个子串可以相邻,但是不能重叠。 状态:left[i]:表示左边前i个数的最大子段和;right[i]:表示右边后i个数的最大子段和。转移方程:result = max(left[i]+right[i+1]); i 属于[0,n-1)#include using n原创 2012-05-12 10:21:33 · 789 阅读 · 0 评论 -
字符串中找连续最长的数字串
题目:字符串中找连续最长的数字串,并把这个串的长度返回。#include #include using namespace std;//findMaxLen abcd12345ed123ss123456789int findMaxLen(char *input, char *output){ char *in=input,*out=output; char *temp,*fi原创 2012-05-10 15:26:07 · 1562 阅读 · 0 评论 -
最长不重复子串
题目描述:求最长不重复子串,如abcdefgegcsgcasse,最长不重复子串为abcdefg,长度为7#include #include using namespace std;//思路:用一个数组保存字符出现的次数。用i和j进行遍历整个字符串。//当某个字符没有出现过,次数+1;出现字符已经出现过,次数+1,找到这个字符前面出现的位置的下一个位置,设为i//并将之前的原创 2012-05-11 10:16:07 · 2482 阅读 · 0 评论 -
最大二维子矩阵
题:求一个矩阵中最大的二维子矩阵(元素和最大).如: 1 2 0 3 4 2 3 4 5 1 1 1 5 3 0 中最大的是: 4 5 5 3 要求:(1)写出算法;(2)分析时间复杂度;(3)用C写出关键代码参考解法:htt原创 2012-11-27 18:48:33 · 790 阅读 · 0 评论 -
洗牌程序
题目:给出洗牌的一个算法,并将洗好的牌存储在一个整形数组里。思路:54张牌用0-53表示,放在数组中,数组下标表示牌所在的位置。遍历数组,产生随机数,交换以随机数为下标的数和当前数组元素。复杂度为O(n)。void shuffle(int boke[]){ int i,r,t; srand((unsigned)time(NULL)); //random number seed原创 2012-11-27 19:21:05 · 661 阅读 · 0 评论 -
最长等差数列
题目:求随机数构成的数组中找到长度大于=3的最长的等差数列,输出等差数列由小到大:,如果没有符合条件的就输出[0,0]格式:输入[1,3,0,5,-1,6]输出[-1,1,3,5]要求时间复杂度,空间复杂度尽量小还没有好的思路。我觉得如果使用红黑树这些数据结构的话,本身查找的复杂度O(nlgn)也要算进去的。这里参考一下花心龟的思路:原创 2012-11-29 09:51:16 · 1278 阅读 · 0 评论 -
单链表常见面试题
一、单链表结点的删除0、删除单链表p指向的那个元素,(时间和空间复杂度尽量小)二、单链表的存取1、找出单链表的倒数第K个元素,(仅允许遍历一遍链表)2、找出单链表的中间元素,(仅允许遍历一遍链表)三、单链表与环的问题3、判断单链表是否有环(6形状)?4、如何找到环的入口?5、如何知道环的长度?6、带环链表的长度是多少?四、单链表与相交、环转载 2012-11-25 19:05:11 · 1652 阅读 · 0 评论 -
大于一个数的最小回文数
如果直接对数n后面的每一个数进行判断,那复杂度有可能很大。解题思路还是从回文数的构造出发。分类讨论如下:A.该数的长度是奇数(特殊情况,只有1位的,除9外直接加1,9的话输出11),取该数的前半截(包括中间数), 1.若该数是回文数,则用前半截数值加1,之后再构造新的回文数; 2.若不是回文数,从中间往两边找到第一个不相等的数,若前面的小于后面的,则按1处理;原创 2012-11-23 18:46:49 · 5759 阅读 · 0 评论 -
删除字符串空格
#include #include using namespace std;//删除所有的空格void strTrim(char* pStr){ char *pTmp=pStr; while(*pTmp!='\0') { if(*pTmp!=' ') *pStr++=*pTmp; ++pTmp; } *pStr='\0';}//删除右边的空格void s原创 2012-05-08 22:43:14 · 883 阅读 · 0 评论 -
快速排序的一种写法
一、快速排序的基本特性时间复杂度:O(n*lgn)最坏:O(n^2)空间复杂度:O(n*lgn)不稳定。快速排序时基于分治模式处理的,对一个典型子数组A[p...r]排序的分治过程为三个步骤:1.分解:A[p..r]被划分为两个(可能空)的子数组A[p ..q-1]和A[q+1 ..r],使得A[p ..q-1] 2.解决:通过递归调用快速排序,对子数组A[p ..q-1]原创 2011-11-20 18:42:56 · 1303 阅读 · 0 评论 -
ACM里的一些缩写
Received : The judge system has received your solution, usually you just need to wait a minute and your solution will be judged.Accepted (AC) : OK! Your program is correct!Presentation Error (原创 2011-11-29 18:38:51 · 1390 阅读 · 0 评论 -
求递归算法时间复杂度:递归树
递归算法时间复杂度的计算方程式一个递归方程: 在引入递归树之前可以考虑一个例子: T(n) = 2T(n/2) + n2 迭代2次可以得: T(n) = n2 + 2(2T(n/4) + (n/2) 2) 还可以继续迭代,将其完全展开可得: T(n) = n2 + 2((n/2) 2 + 2((n/22)2 + 2((n/23转载 2011-11-09 16:01:30 · 689 阅读 · 0 评论 -
平衡二叉查找树[AVL]
平衡二叉树的定义 (AVL—— 发明者为Adel'son-Vel'skii 和 Landis) 平衡二叉查找树,又称 AVL树。 它除了具备二叉查找树的基本特征之外,还具有一个非常重要的特点:它 的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值(平衡因子 ) 不超过1。 也就是说AVL树每个节点的平衡因子只可能是-1、0和1(左子树高度减去右子树高度)。转载 2011-12-18 15:03:42 · 10212 阅读 · 1 评论 -
爬台阶问题
跳台阶问题:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有多少总跳法,并分析算法的时间复杂度。在这个跳楼梯的题目中,每次可以跳1个台阶或者2个台阶。我们考虑,我们是如何跳到N这个台阶的,一共有两种方式,一种是从N-1台阶跳一个台阶,另外一种是从 N-2跳2个台阶,所以:F(n) = F(n-1) + F(n-2) 并且 F(1)=1, F(2) = 2 。容易看出,原创 2011-12-13 20:46:07 · 3901 阅读 · 0 评论 -
逆序数问题
给我们一个序列, 让我们求其逆序数:如3 2 1 4逆序数为: 2+1+0+0=3 我们这样定义一个序列的逆序数: 序列a1 a2 a3 a2 ...an这个序列的逆序数C, 等于a1,a2...的逆序数的和.即 C=sum(Ci)Ci为满足ai > aj (j > i)的数的总的个数, 即Ci = sum(ai > aj) (j >i).转载 2011-12-15 22:33:42 · 1212 阅读 · 0 评论 -
约瑟夫问题
问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。我们知道第一个人(编号一定是m%n-1) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m%n的人开始): k k+1 k+2 ... n-2, n-1, 0, 1, 2, ... k-2并且从k开始报0。现在我们把他们的编号转载 2012-02-18 21:45:54 · 891 阅读 · 2 评论 -
兄弟节点
bool isbrother(string src,string des){ if(src.length()!=des.length()) return false; int i; bool flag=true; int countsrc[100]={0}; int countdes[100]={0}; for(i=0;i<src.length();i++) { count原创 2012-04-16 16:15:30 · 847 阅读 · 0 评论 -
编程之美2.14 子数组之和的最大值 扩展问题(首尾相连)
思路:问题的解可以分为两种情况:1)解没有跨过A[n-1]到A[0],即普通的求子数组和的最大值2)解跨过A[n-1]到A[0]对第二种情况,只要找到从A[0]开始和最大的一段(A[0],...,A[j])(0M_2=A[i]+...A[n-1]+A[0]+...+A[j]如果iM_2=A[0]+...+A[n-1] - 子数组和为负的最小值(数组元素全为正则返回0转载 2012-05-07 16:02:13 · 1808 阅读 · 0 评论 -
编程之美2.20 程序理解和时间分析
这是《编程之美》的2.20题目,给出一段C#代码,要求不用电脑,理解程序并回答问题。下面是从C#代码中改写成的C++代码:#include #include using namespace std;int main() { int rg[] = {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19, 20,21,22,2转载 2012-05-07 13:16:26 · 4073 阅读 · 2 评论 -
编程之美2.16 求数组中最长递增子序列
#include #include using namespace std;//复杂度为O(N2 + N) = O(N2)int MaxLength(int arr[], int length){ int *res = new int[length]; for (int i = 0; i<length; i++) { res[i] = 1; //初始化默认的长度 for (转载 2012-05-07 14:56:06 · 1425 阅读 · 1 评论 -
编程之美2.18 数组分割
来自《编程之美》中的一道题:有一个没有排序、元素个数为2n的正整数数组,要求:把这个数组分割为元素个数为n的两个数组,并使两个数组的和最接近。-------------------------------------------------------------------------------------------------------------------------------转载 2012-05-07 14:34:12 · 2069 阅读 · 0 评论 -
打靶问题 一个射击运动员打靶,靶一共有10环,连开10枪打中90环的可能行有多少种?
心动网络一道编程题:一个射击运动员打靶,靶一共有10环,连开10枪打中90环的情况有多少种?需要考虑10枪的先后关系,比如9环10环同10环9环是不同的。递归起!int sum;int store[10];void Output() //打印{ for(int i=9;i>=0;i--) { cout<<store[i]<<" "; } cout原创 2012-11-24 16:37:02 · 10813 阅读 · 0 评论