Algorithm
Summit_Yue
Make the change
展开
-
优先队列
优先队列优秀队列是一种数据结构,用数组保存元素并按照一定条件排序,以高效地(对数级别)实现删除最大元素和插入元素的操作。适用于输入量可能巨大,甚至被认为输入是无限的时候。堆数据结构二叉堆能够很好地实现优先队列地基本操作。优先队列由一个基于堆的完全二叉树表示。 当一棵二叉树地每个结点都大于等于它地两个子结点时,它被称为堆有序。 插入元素:我们将新元素加到数组末尾,增加堆地大小让这个新元素上浮到合适原创 2017-10-27 19:50:57 · 152 阅读 · 0 评论 -
Dijkstra算法学习
Dijkstra算法Dijkstra算法是求解有向图最短路径的经典算法,计算从一个指定的初始结点到其他各个结点最短路径。它的理论基础就是一条最短路径的子路径也一定是最短的。实现如下:将所有结点分为两个集合,一个命名为S集,一个命名为U集。S集中的点是我们已知其最短路径的点,U集中的点是我们还未知其最短路径的点。因此初始时刻,S集中只有一个我们选定的起始点,U集中是除了起始点意外的所有点;而最终时刻原创 2017-04-19 23:19:07 · 537 阅读 · 0 评论 -
C++实现堆排序
堆排序C++实现的堆排序,分为三个函数实现:堆调整函数:保持最大/最小堆堆构建函数:利用堆调整函数创建一个最大/最小堆堆排序函数:每次取堆顶元素交换至数组最后,并将size减一,然后调整堆顶保持最大/最小堆堆调整函数://调整堆为数组a,需要调整的结点序号为i,堆大小为sizevoid HeapAdjust(int* a, int i, int size){ int left =原创 2016-10-06 00:10:12 · 583 阅读 · 0 评论 -
剑指Offer-替换空格
剑指Offer-替换空格题目: 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路: 双指针法(此处是记录索引),首先遍历数组获取空格个数,每一个空格都要被替换成“%20”,则一个空格代表数组长度加2,首先计算数组需要增加的长度为2*空格个数。 一个索引p1指向数组尾部,另外一个p2为p原创 2017-10-26 15:42:05 · 140 阅读 · 0 评论 -
剑指Offer-栈
剑指Offer-栈此处两道题为《剑指Offer》中举例让抽象问题具体化的21和22题,记录一下实现思路。题1,包含min函数的栈:定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数思路:除了正常存入数据的普通栈外,定义一个辅助栈,辅助栈中每次压入当前最小值。例如压入3、4、2、1,首先普通栈压入3,当前最小值为3,压入辅助栈;普通栈压入4,当前最小值还为3,压入辅助栈;普通栈压入2原创 2017-10-26 15:43:55 · 178 阅读 · 0 评论 -
重新构建树
重新构建树题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路: 首先要知道树的前序、中序和后序遍历,前中后都是对于根结点来说的。前序遍历:先访问根结点,再访问左子树,最后访问右子树中序遍历:先访问左子原创 2017-10-26 15:42:27 · 409 阅读 · 0 评论 -
剑指Offer--二维数组的查找
剑指Offer–二维数组的查找题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思路: 题目给定二维数组按行递增,按列递增。 1. (错误)有一种很自然的想法就是分别按行和列定位,细想一下这是不行的:例如按行定位时,目标元素大于第5行行首元素,小于第6行行首元素,仅仅原创 2017-10-26 15:42:50 · 165 阅读 · 0 评论 -
剑指Offer-斐波那契数列以及跳台阶问题
剑指Offer-斐波那契数列以及跳台阶问题斐波那契数列:1,1,2,3,5…… 规律:f(n) = f(n-1) + f(n-2) 题目描述: 输入一个整数n,请你输出斐波那契数列的第n项。 n<=39分析:题目很简答,递归也行非递归也行,代码如下:#include<iostream>#include<algorithm>using namespace std;/*int Fibonacc原创 2017-10-26 15:43:11 · 208 阅读 · 0 评论 -
快速排序
快速排序最常用的排序算法,时间复杂度最好为O(nlogn),最差为平方级。具体的原理不再此介绍。此处记录一下代码实现以及提升快排性能的方法。切换插入排序对于小数组来说,插入排序速度很快,因此可以根据数组大小选择排序算法,长度小于定值时选择插入排序,大于时选择快排。if(hi<lo+M) {Insertion.sort(a,lo,hi); return;}三取样切分当数组中重复元素较多时,实际上进行了原创 2017-10-26 15:48:43 · 222 阅读 · 0 评论 -
判断n以内所有素数
判断n以内所有素数偶尔会碰到跟素数相关的题目,需要我们快速找到n以内的所有素数,这里记录一种效率比较高的方法。 所有大于2的偶数都不是素数,因此我们从3开始找,每次步进2。 判断一个数是否为素数的方法是:判断是否存在小于等于根号n的数能整除n,存在则不是素数,不存在则确定是素数。代码如下:#include<iostream>#include<vector>#include<cmath>us原创 2017-10-26 15:49:29 · 948 阅读 · 0 评论 -
基础排序算法
基础排序算法本章学习并介绍三种基础排序算法,选择排序、插入排序以及希尔排序选择排序选择排序的思想很简单,首先从数组的第一个数开始,将第一个数与其后的所有数字比较,找到最小的一个数,放到第一个位置。然后再从数组的第二个数开始,与其后所有数字比较,找到最小的一个,放到第二个位置,以此类推…… 代码如下:void selectSort(int r[],int n) //选择排序{ for原创 2017-04-21 00:07:51 · 248 阅读 · 0 评论 -
JavaScript作用域与作用域链
变量作用域一个变量的作用域是变量被定义的这个区域。全局变量具有全局作用域,在JavaScript代码中的任何地方都是有定义的。在函数内部定义的变量具有局部作用域,,同名的局部变量比全局变量具有更高的优先级。var scope = "global";function checkscope() { var scope = "local"; return scope;}console.原创 2017-10-31 09:40:49 · 353 阅读 · 0 评论 -
C++邻接表与无向图
C++邻接表与无向图参考《算法》,采用邻接表实现图结构,实现DFS以及BFS等算法。具体原理参考书本,此处给出C++版本实现。#include<iostream>#include<queue>#include<algorithm>#include<map>using namespace std;/* 顶点 中间节点 VNode ENode 0 | A --> 2(C)原创 2017-10-27 19:52:13 · 2529 阅读 · 1 评论 -
C++邻接表与有向图
C++邻接表与有向图参照《算法》实现了C++邻接表表示的有向图,实现了书中有向图的各种算法,包括判断有向图可达性,寻找有向图中的环,顶点的先序、后序和逆后序排列以及Kosaraju算法寻找强连通域。具体算法不再记录,直接参考《算法》有向图一章,C++代码及注释如下:#include<iostream>#include<queue>#include<algorithm>#include<map>原创 2017-10-27 19:52:43 · 2756 阅读 · 0 评论 -
堆排序
堆排序C++实现的堆排序,分为三个函数实现:堆调整函数:保持最大/最小堆堆构建函数:利用堆调整函数创建一个最大/最小堆堆排序函数:每次取堆顶元素交换至数组最后,并将size减一,然后调整堆顶保持最大/最小堆堆调整函数://调整堆为数组a,需要调整的结点序号为i,堆大小为sizevoid HeapAdjust(int* a, int i, int size){ int left =原创 2017-10-27 19:54:10 · 163 阅读 · 0 评论 -
自顶向下以及自底向上排序
自顶向下以及自底向上排序具体原理不再介绍,参考《算法》,书上使用Java实现,此处写一下C++版本,代码如下://// main.cpp// algrithom//// Created by 岳wenlong on 2017/6/4.// Copyright © 2017年 岳wenlong. All rights reserved.//#include <iostream>#原创 2017-10-27 19:54:33 · 1207 阅读 · 0 评论 -
C++无向带权图与最小生成树
C++无向带权图与最小生成树参考《算法》一书,C++语言基于邻接表实现了无向带权图以及Prim算法得到图的最小生成树。图的实现在无向图的基础上增加权重即可,可参考《C++邻接表与图》。Prim算法简要说来,可写成如下伪代码:for(int i=0;i<V;i++){ PrimVisit(i); //插入点并更新权重,同时得到更新后距离图最近的点}具体原理不再详述,可参考《算法》的讲解,此处记原创 2017-10-27 19:55:20 · 5262 阅读 · 0 评论 -
C++有向带权图单源最短路径
C++有向带权图单源最短路径参考《算法》最短路径章节编写实现代码,包括无负权边无环的Dijkstra算法,也包括可以处理一般性问题的Bellman-Ford算法。同时采用泛型编程,图节点可以实现任意类型,具体原理参见《算法》最短路径章节,实现代码如下所示:#include<iostream>#include<algorithm>#include<queue>using namespace st原创 2017-10-29 15:07:28 · 2857 阅读 · 0 评论 -
C++ KMP算法
C++ KMP算法差不多把《算法》这本书看完了,最后一章字符串比较常见的重要的东西应该是子串匹配的KMP方法。讲道理书上讲的比较复杂,也可能KMP本来理解就不容易,从网上找了几篇博文介绍的比较清晰,包括配图,可以参考。 http://www.cnblogs.com/c-cloud/p/3224788.html (这篇参考了阮一峰的) http://www.cnblogs.com/c-cloud原创 2017-10-29 15:09:23 · 6935 阅读 · 1 评论 -
TopK---返回第K小(大)的数字
TopK—返回第K小(大)的数字给定一个数组,返回数组中第K小(或者第K大)的数字,比较经典的TopK问题。快排选择基于快排的思想,partition函数每次将切分元素放置到正确位置pos:当我们需要的K>pos时,代表我们需要再从(pos,right]中查找;当K最小(大)堆基于堆排序的思想,当我们需要查找第K小(大)的数字时,我们将数组前K个元素构建成最大(小)堆,则堆顶元素是前K个数字中最大的原创 2017-10-29 15:12:31 · 950 阅读 · 0 评论 -
Java实现二叉搜索树
Java实现二叉搜索树具体细节不再介绍,原理以及性能分析直接参见《算法》,个人感觉精髓之处在于递归返回过程中向上更新结点的步骤。打个比方,要删除一个结点,发现要删的结点小于当前结点,于是需要进入当前结点左子树进行递归删除,删除结束则返回一个新的左子树给当前结点,在修正该结点的子树结点数。代码如下:package main;public class BSTree<Key extends Compar原创 2017-10-31 09:35:33 · 531 阅读 · 0 评论 -
剑指Offer-旋转数组的最小数字
旋转数组的最小数字参见《剑指Offer》P66 题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路: 根据题意,将一个数组旋转之后,变成了两个独立的非降原创 2017-10-26 15:43:28 · 135 阅读 · 0 评论