自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

大闲人柴毛毛

博观而约取,厚积而薄发

  • 博客(13)
  • 资源 (2)
  • 问答 (2)
  • 收藏
  • 关注

原创 回溯法(一)——n皇后问题

问题描述 在一个n*n的棋盘上放置皇后,要求:一个皇后的同一行、同一列、同一条对角线上不允许出现其他皇后。请给出所有的放置方案。算法思路思路很简单,由于每行每列不能出现两个皇后,因此每行只能放一个皇后,那么第i行中皇后究竟应该放哪儿呢?我们可以从第i行第一列开始依次向后逐格判断,看看若放在当前位置是否会冲突,若不冲突,则继续考虑下一行,若冲突,则继续向后移动一格,再判断。 若i行所有的位置都

2017-04-12 14:33:24 3859 1

原创 图的遍历(BFS+DFS)

图的遍历与树的遍历基本类似,但要注意两个不同: 1. 图中可能有环路,因此可能会导致死循环; 2. 一个图可能由多个独立的子图构成,因此一条路径走到头后要重新选择尚未遍历的起点。 图的邻接表数据结构请参见:图的邻接表示法Java版宽度优先遍历思路选择一个尚未访问的起点,依次访问它的相邻结点;若相邻结点还有相邻结点的话,再依次访问尚未访问的相邻结点;直到以该结点为起点的这条路径上所有的结

2017-04-12 11:06:25 3178

原创 图的邻接表示法Java版

边节点 一个边节点有一条边 和 一个终止节点组成。/** * 边节点(由一条边和一个终止节点构成) */class ENode{ int id;// 终止节点的编号 int weight;// 边的权重}图的邻接表示图用一个Map< String,List>表示,其中String表示节点的编号,List中存储以该节点为起点的所有边节点。 Map<String,List<E

2017-04-12 11:02:57 1368 1

原创 动态规划法(五)——多段图问题

问题描述 给定一个多段图,求出多段图中的最短路径和最短路径长度。什么是多段图?多段图是一个有向、无环、带权 图。有且仅有一个起始结点(原点source) 和 一个终止结点(汇点target)。它有n个阶段,每个阶段由特定的几个结点构成。每个结点的所有结点都只能指向下一个相邻的阶段,阶段之间不能越界。 数据结构cost数组: 该数组用于记录以某个结点为起点,到终点t的最短路径长度值。

2017-04-11 14:36:35 12617

原创 动态规划法(四)——0/1背包问题

问题描述 有n个物体,重量分别是w0~wn-1,每个物体放入背包后可获得的收益分别为p0~pn-1,背包载重为M,且所有物体要么放要么不放,不能只放一部分。求如何放物体可以得到最高的收益。问题分析设f(i,m)表示第i步背包的总收益,其中i表示当前进行到了第i步,m为当前背包载重,则当前第i步只有两种选择:将第i个物体放入背包 此时背包总收益就变成f(i-1,m-wi)+wi。第i个物体

2017-04-08 23:35:50 2646 1

原创 动态规划法(三)——最长公共子序列

问题描述 给定两个序列,求出它们的最长公共子序列。 如:序列X={a,b,c,b,d,a,b},Y={b,d,c,a,b,a},则X和Y的最长公共子序列为{b,c,b,a}子序列:子序列为原序列的一个子集,并不要求连续,但要求子序列中元素的顺序和原序列元素的顺序一致。定理 设两个序列分别是X={x1,x2……,xm},Y={y1,y2……,yn},它们的最长公共子序列为Z={z1,z

2017-04-08 22:36:13 6533 10

原创 动态规划法(二)——弗洛伊德算法

问题描述 给定一个带权有向图,计算任意两结点间的最短路径。迪杰斯特拉算法可以计算指定起点到所有结点的最短路径长度,因此分别对每个结点使用一次迪杰斯特拉算法即可求的任意两结点间的最短路径。迪杰斯特拉算法的时间复杂度为O(n^2),因此采用这种方法的时间复杂度为O(n^3)。 但是,迪杰斯特拉算法不允许权值为负数,因此需要使用弗洛伊德算法。 弗洛伊德算法允许权值为负数的边,但不允许回路的路径长

2017-04-08 17:18:02 6146

原创 动态规划法(一)——概述

什么是动态规划法动态规划法也是用于求解最优化问题,也采用分步决策的策略,将一个大问题划分成若干个较小的同类子问题,根据子问题的解,自底向上,得出整个问题的解。与贪心法的异同相同都是用于求解最优化问题;都采用分步决策,计算出每一步的最优解。不同贪心法的每一步决策依赖于『最优量度标准』,不依赖于子问题的解和尚未作出的选择;动态规划法每一步决策依赖于子问题的解,无需最优量度标准。与分治法的异同

2017-04-08 16:15:05 1486

原创 贪心算法(五)——迪杰斯特拉算法

问题描述 给一个有向无环带权图,并给一个起点,求出该原点到所有顶点的最短路径。数据结构dis:Map<String,Integer> dis;存储原点s到指定节点的最短路径长度。 key表示节点编号,value表示s到该终止节点的最短路径长度。path:Map<String,String> path;存储以指定结点为终点的最短路径中,该终点的上一个结点的编号。 key表示终点编号,va

2017-04-08 13:19:14 3457 2

原创 贪心算法(四)——最小代价生成树

问题描述 n个村庄间架设通信线路,每个村庄间的距离不同,如何架设最节省开销?这个问题中,村庄可以抽象成节点,村庄之间的距离抽象成带权值的边,要求最节约的架设方案其实就是求如何使用最少的边、最小的权值和将图中所有的节点连接起来。 这就是一个最小代价生成树的问题,可以用Prim算法或kruskal算法解决。PS1:无向连通图的生成树是一个极小连通子图。PS2:生成树是图的一个子图,包括所有的

2017-04-07 22:56:51 10695 4

原创 贪心算法(三)——最佳合并模式

问题描述 给定n个有序文件,每个文件的记录数分别为w1~wn,请给出一种两两合并的方案,使得总合并次数最少。注意: 1. 外排序算法是将多个有序文件合并成一个有序文件的过程。 2. 在一次合并的过程中,两个文件中的所有记录都需要先从文件中读入内存,再在内存中排序,最后将排序的结果写入文件中。 3. 假设两个待排序文件记录数分别为n、m,那么将这两个文件合并成一个有序的文件需要进行n+m次

2017-04-05 23:00:16 9929 1

原创 贪心算法(二)——一般背包问题

题目 有一个背包,最多放M kg的物体(物体大小不限); 有n个物体,每个物体的重量为Wi,每个物体完全放入背包后可获得收益Pi。问:如何放置能获得最大的收益?注:背包问题分为两种,若每个物体不可分割,则称为0/1背包问题,这种问题无法用贪心法求的最优解,只能求的近似解。而若每个物体可以切分,则称为一般背包问题,可以使用贪心法求的最优解。下面讨论的就是一般背包问题。结果集一般背包问题中,

2017-04-05 21:19:48 39470 3

原创 贪心算法(一)——概述

贪心法用于求解最优化问题,即求解某一问题的最优解。 既然能用贪心法求解的问题是一个最优化问题,那么我们首先来了解下最优化问题的几个基本概念。最优化问题的几个基本概念目标函数 解决一个最优化问题,首先要将问题抽象成一个数学函数,这也就是一个数学建模的过程,这个能够描述问题的函数就称为『目标函数』,这个函数的最大/小值就是我们要求的最优值。约束条件 任何函数都有它的取值范围,所有取值范围的集合

2017-04-05 16:56:37 3555

剑指offer算法实现java版——面试题19二叉树的镜像

分析:所谓“镜像”就是从镜子里看到的样子。我们可以画一棵二叉树,然后画出该二叉树的镜像。画完图之后我们会发现,所谓“二叉树的镜像”就是把二叉树中所有子树的左孩子和右孩子进行交换。因此需要遍历二叉树所有的结点,在遍历的同时交换非叶子结点的左右子树。遍历我们可以使用先序遍历,首先判断当前根结点是否为叶子结点,若非叶子结点,则交换左右孩子,然后再分别对左右孩子进行相同的操作。

2016-03-14

剑指offer算法实现java版——面试题21包含min函数的栈

实现一个栈,要求使用O(1)时间获取栈中最小值,O(1)执行pop、push操作。

2016-03-14

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除