
算法思想
文章平均质量分 62
丿咫尺天涯
这个作者很懒,什么都没留下…
展开
-
白色粉末
十袋白色粉末,其中有一袋溶于水两分钟以后会变蓝,现在只有四个杯子,无限多的水,要求是在最短的时间内找出这袋特殊的粉末方法一:一二三四号粉末放第1个杯子里,五六七八号粉末放第2个杯子里, 剩下的九十号分别放到剩下的两个杯子里,这样的话,如果刚好是九十号中的一个是特殊粉末,那么只需两分钟就可以鉴别,如果是1号杯子变蓝,只需把水全部倒 掉把一二三四号粉末分别放到1234号杯子里再过两分钟就可以鉴转载 2015-04-20 16:58:55 · 638 阅读 · 0 评论 -
完美洗牌算法
完美洗牌算法 题目详情:有个长度为2n的数组{a1,a2,a3,...,an,b1,b2,b3,...,bn},希望排序后{a1,b1,a2,b2,....,an,bn},请考虑有无时间复杂度o(n),空间复杂度0(1)的解法。 题目来源:此题是去年2013年UC的校招笔试题,看似简单,按照题目所要排序后的字符串蛮力变化即可,但若要完美的达到题目所要求的时空复杂度,则需转载 2015-09-01 20:29:00 · 2815 阅读 · 2 评论 -
Floyd-Warshall 算法 C++实现
Floyd算法思想:动态规划的方法,总共循环O(V3),动态规划的时间,从节点I到节点j的路径,可能经过{1,2,3,4,5,k},分为两种一种是经过k点的最小值,一种是不经过k点的最小值。#include#define M 1000#define N 5using namespace std;int map[5][5]={{0,3,8,M,-4},{M,0,M,1,7},{原创 2015-09-09 16:33:46 · 1054 阅读 · 0 评论 -
Dijstra算法 C++实现
Dijstra算法思想,简化版实现,:从源节点开始调整,相邻节点的最短距离。调整完之后,从距离最短并且没有作为u的节点中选取下一个节点 ,调整后面的节点,时间复杂度O(V*(V+E))。#include#define M 1000using namespace std;int map[5][5]={{0,10,M,5,M},{M,0,1,2,M},{M,M,0,M,6},{M,3原创 2015-09-09 16:23:10 · 2024 阅读 · 0 评论 -
各种排序,白话版原理思想
内部排序:一般来说:存在不相邻交换的排序算法是不稳定的,相邻交换的排序算法是稳定的;对于相邻交换的稳定排序算法,通过控制交换条件可以转换成不稳定排序算法;冒泡、插入、归并和基数排序是稳定的;选择、快速、希尔和堆排序是不稳定的。 一、冒泡排序从数组的头部开始循环,判断相邻的两个元素,如果前一个元素大于后一个元素,那么交换两者,直到这一次过程将待排序部分中的最大值,移到最后。每一次循环原创 2015-07-10 17:08:51 · 411 阅读 · 0 评论 -
二叉树转化为排序的双向链表
问题描述:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 10 / / 6 14 / / / /4 8 12 16 转换成双向链表4=6=8=10=12=14=16。 思路:利用递归的思想求解,分别调整某结点的左右子树,调整完后,将该结点的左指针指向左子树的最大节点,右指针指向原创 2015-09-11 15:16:47 · 599 阅读 · 0 评论 -
编程之美----3.5最短摘要的生成
最短摘要生成题目就是在一个字符串中,找一些目标字符串,找到包含所有目标字符串的最小字符串。题目虽然叫做最短摘要生成,但和实际的搜索snippet的计算还是有比较大的差距的。解法:文献[1]给出了一种比较好的解法,策略还是使用双指针,双指针对于很多算法设计很有价值,算法的思想是采用两个指针,开始两个指针都指向缓冲区的头部,尾指针向后扫描,直到头指针和尾指针中间包含了全部的关键字,原创 2015-09-07 12:43:24 · 561 阅读 · 0 评论 -
动态规划--小结
一、动态规划1. 铁条切割定义:r[n]表示n长的铁条最大收益 p[i]表示i长的铁条收益问题最优子结构:r[j]=max(p[k],r[j-k]),k核心代码:for(int j=1;j { for( int k=1;k { max=p[j]; temp= p[k]+r[j-k];if(max max=temp;}原创 2015-06-23 16:15:50 · 434 阅读 · 0 评论 -
过河问题
过河问题 问题描述:在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过。如果各自单独过桥的话,N人所需要的时间已知;而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间。问题是,如何设计一个方案,让这N人尽快过桥。假设N转载 2015-09-11 20:46:00 · 536 阅读 · 0 评论 -
约瑟夫环问题
约瑟夫环问题 约瑟夫环问题的原来描述为,设有编号为1,2,……,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如此下去,直到所有人全部出圈为止。当任意给定n和m后,设计算法求n个人出圈的次序。 稍微简化一下。 问题描述:n个人(编号0~(n-1原创 2015-09-11 15:26:44 · 475 阅读 · 0 评论 -
堆排序
堆排序的意义并不在于排序本身(图示+代码)(二叉)堆是一种特殊的数据结构.:(二叉)堆数据结构是一种数组对象,它可以被视为一种完全二叉树:树中的每个节点与数组中存放该节点值的那个元素对应。树的每一层都是填满的,最后一层除外.:(二叉)堆的用途很广,例如典型的运用--优先队列|堆排序{速度比快速排序慢,比插入排序块O(nlg(n))}建堆的过程原创 2015-08-20 20:31:42 · 314 阅读 · 0 评论 -
图的割点
【算法】求无向连通 图的割点割点与连通度在无向连通图中,删除一个顶点v及其相连的边后,原图从一个连通分量变成了两个或多个连通分量,则称顶点v为割点,同时也称关节点(Articulation Point)。一个没有关节点的连通图称为重连通图(biconnected graph)。若在连通图上至少删去k 个顶点才能破坏图的连通性,则称此图的连通度为k。关转载 2015-08-30 15:12:44 · 1061 阅读 · 0 评论 -
最大子数组和、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
最大子序列最大子序列是要找出由数组成的一维数组中和最大的连续子序列。比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大;而 {5,-6,4,2}的最大子序列是{4,2},它的和是6。你已经看出来了,找最大子序列的方法很简单,只要前i项的和还没有小于0那么子序列就一直向后扩展,否则丢弃之前的子序列开始新的子序列,同时我们要记下各个子序列的和,最后找到和最大的子序原创 2015-08-11 21:31:03 · 773 阅读 · 0 评论 -
飞机加油问题
某航空公司有一个环球飞行计划,但有下列条件:每家飞机只有一个油箱,飞机之间可以相互加油;一箱油可供一架飞机绕地球飞半圈。为使至少一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架飞机(包括绕地球一周的那架在内)? 注:所有飞机从同一机场起飞,而且必须安全返回,加油时间不计。答案: 3架从一个方向起飞,到1/8路程是的第1架将2,3加满油返回,到1/4地时,2机将转载 2015-09-01 17:30:32 · 1113 阅读 · 0 评论 -
海盗分宝石
题目描述:五个海盗抢到了100颗宝石,每一颗都一样大小和价值连城。他们决定这么分:抽签决定自己的号码(1、2、3、4、5)首先,由1号提出分配方案,然后大家表决,当且仅当超过半数的人同意时,按照他的方案进行分配,否则将被扔进大海喂鲨鱼如果1号死后,再由2号提出分配方案,然后剩下的4人进行表决,当且仅当超过半数的人同意时,按照他的方案进行分配,否则将被扔入大海喂鲨鱼。依此转载 2015-09-01 18:41:27 · 416 阅读 · 0 评论 -
C++算法之——常用算法总结
基本的C++算法分为三类:排序算法、树算法、图算法算法思想有三种:递推、分治、动态规划 以及 贪心算法。本文将简要介绍上面三类算法,介绍时穿插介绍算法思想。一、排序算法1、基本O(n^2)排序算法: (对基本排序算法的时间复杂度分析主要考虑 比较次数、数据交换次数)冒泡排序:针对数组、本地排序、需要交换数据。O(1)额外空间选择排序:一般针对数组、转载 2015-06-23 19:35:08 · 11765 阅读 · 2 评论 -
二叉树基本操作的程序实现
二叉树基本操作的程序实现//Bintree.h#include#includetypedef struct Binnode{//二叉树结点结构体 char data; struct Binnode *lchild; struct Binnode *rchild; };typedef Binnode *Bintree ;typedef st转载 2015-06-23 19:26:51 · 553 阅读 · 0 评论 -
TriedTree----字典树
科普一下字典树(前缀树)= =LeetCode211题Add and Search Word - Data structure designTried树出现的频率太大,在这里暂时先记录一个Tried树的基本操作,字典树,顾名思义,就是建一本树形字典,使得下次查字典中的单词的速度大增。字典树又叫Tried Tree,或者前缀树。字典树有转载 2015-07-08 19:46:24 · 1434 阅读 · 0 评论 -
编程之美----2.21 只考加法的面试题
题目:我们知道:1+2=3; 4+5=9; 2+3+4=9;等式左边都是两个以上连续的自然数相加,那么是不是所有的整数都可以写成这种形式呢?问题1. 写一个程序,对于一个64位正整数,输出它所有可能的连续自然数(两个以上)之和的算式;问题2. 有的数例如32就找不到这样的表达,这样的数字有什么规律?问题转载 2015-06-12 00:33:12 · 445 阅读 · 0 评论 -
编程之美——2.20 程序理解和时间分析
最近在看《编程之美》,为找工作面试做准备。该书中2.20程序理解和时间分析一题没有给出解答,所以简单写一下我自己的答案。题目如下:阅读以下C#代码,回答问题: [csharp] view plaincopyusing System; using System.Collections.Generic; using Syste转载 2015-06-12 00:28:14 · 508 阅读 · 0 评论 -
B树、红黑树简单概念
B树:多路查找树,对于m阶的B树来说:1. 根节点如果不是叶子节点至少有2个关键字,除根节点外的节点,至少含有m/2向上取整个关键字,不多于m-1个关键字。每个节点最多有m个子节点。2. 内部节点含有k个有序的关键字,叶子节点不包含任何信息,指向这些叶子节点的指针都为NULL,且所有叶子节点在同一行。3. n个节点的B树高度是logm/2((n+1)/2)。原创 2015-07-10 20:31:35 · 599 阅读 · 0 评论 -
二叉搜索的算法
四道在旋转数组中找最小值和 特定值的问题。在两个有序数组中找中值的问题,leetcode 4原创 2015-06-25 17:01:54 · 445 阅读 · 0 评论 -
卡特兰数的证明及应用
Catalan数的定义令h(1)=1,Catalan数满足递归式:h(n) = h(1)*h(n-1) +h(2)*h(n-2) + ... + h(n-1)h(1),n>=2该递推关系的解为:h(n) = C(2n-2,n-1)/n,n=1,2,3,...(其中C(2n-2,n-1)表示2n-2个中取n-1个的组合数)问题等价于:n个1和n个0组成一2n位的2进制数,要求从左到右扫描,1的累原创 2015-08-12 09:22:44 · 6424 阅读 · 1 评论 -
数据结构-----线段树(一)
1、概述线段树,也叫区间树,是一个完全二叉树,它在各个节点保存一条线段(即“子数组”),因而常用于解决数列维护问题,它基本能保证每个操作的复杂度为O(lgN)。2、线段树基本操作线段树的基本操作主要包括构造线段树,区间查询和区间修改。(1) 线段树构造首先介绍构造线段树的方法:让根节点表示区间[0,N-1],即所有N个数所组成的一个区间,然后,把区间分成两半,分别由左转载 2015-08-11 09:34:18 · 691 阅读 · 0 评论 -
跳表(Skip List)的介绍以及查找插入删除等操作
今天有同学去面试,被问到了“跳表”这种数据结构,说实话我之前对它了解不多,于是上网查了跳表的资料,并在这里总结一下。什么是跳表?要说清楚这个问题,我们就要先从普通的有序链表说起。一个普通有序列表的结构如下:我们可以看到,上图所示的链表按照由小到大的顺序排列(-1表示最小值,1表示最大值,这是本文的一个约定),如果我们想要查找一个元素x,算法如下:转载 2015-08-29 09:23:18 · 2728 阅读 · 1 评论 -
数据结构---并查集
1、 概述并查集(Disjoint set或者Union-find set)是一种树型的数据结构,常用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。2、 基本操作并查集是一种非常简单的数据结构,它主要涉及两个基本操作,分别为:A. 合并两个不相交集合B. 判断两个元素是否属于同一个集合(1) 合并两个不相交集合(Union(x,y)转载 2015-08-14 15:09:35 · 335 阅读 · 0 评论 -
leetcode---题出现频率
1Two Sum25arraysort setTwo Pointers2Add Two Numbers34linked listTwo Pointers转载 2015-08-14 15:11:02 · 437 阅读 · 0 评论 -
k个最大的m段子数组和
从数组中选择k组长度为m的子数组,要求其和最大问题描述:给定长度为n的数组a[],从中选择k个长度为m的子数组,要求和最大。形式描述为:选择k个子数组[l1, r1], [l2, r2], ..., [lkl1, rk] (1 ≤ l1 ≤r1 ≤l2 ≤ r2 ≤... ≤lk ≤ rk ≤ n; ri−ri+1), 使得∑ki=1∑rij=lipj问题分析:原创 2015-09-13 09:48:18 · 615 阅读 · 0 评论