搜索
Jaster_wisdom
程序员
展开
-
POJ 1011 (经典搜索)
这道题 是 比较经典的 搜索题。题意:给出一堆小木棍的长度,需要把它们拼成几根相同的大棍子,求 这些大棍子的最短长度分析:这道题主要使用,深度搜索+递归,当然这里用到多次剪枝,这对于减小时间复杂度很有效。#include#includeusing namespace std;int stick[64];int used[64];int len;int n;bool原创 2016-02-17 22:35:12 · 1356 阅读 · 0 评论 -
LeetCode39. 组合总和
题目大意:给定一个数组和一个目标值,返回数组内可以使数字和为target的组合,注意数组内的数字可以重复选,但是组合的结果要求不能重复。题目分析:本题采用递归较容易解答。首先,将数组内的元素由小到大排序,然后不断地进行试探,直到和为target。若当前和小于target,则继续往里面加元素;若当前和等于target,就可以将结果保留下来;若当前和已经大于target,那就可以排除掉这种情况,回溯到...原创 2018-06-13 19:31:59 · 3415 阅读 · 3 评论 -
LeetCode37. 解数独
题目分析:本题属于深度遍历DFS的一个经典例子。按照从左往右,从上到下的顺序依次填充空格,用‘1’~‘9’之间的数进行试探,若发现填充的数不满足三条规则中的任意一条,就换一个数进行填充,若都不行,则回溯到上一层(即上一个要填充的空格,更换这个空格的数字)。一旦出现一种正确解,即返回。代码展示:class Solution {public: bool dfs(vector<vecto...原创 2018-07-02 14:50:35 · 587 阅读 · 0 评论 -
LeetCode79. 单词搜索
题目大意:判断一个单词是否存在于一个二维网络中。题目分析:使用DFS,主要就是从各点开始往四个方向进行搜索,一旦找到一种正确解,即返回true。注意已经访问过的点不能再次访问,那么可以将访问过的点替换成特殊字符'.',下次就不会与单词字母匹配。代码展示:class Solution {public: bool search(vector<vector<char>>...原创 2018-07-02 19:52:57 · 844 阅读 · 0 评论 -
LeetCode78. 子集
题目大意:求一个集合的子集题目分析:对于集合中的每一种情况,都有两种可能性,要么取,要么不取。我们可以利用DFS+回溯解决。代码展示:class Solution {public: void dfs(vector<int> nums,int pos,vector<int> path,vector<vector<int>>& resu...原创 2018-07-03 19:28:50 · 278 阅读 · 0 评论 -
LeetCode74. 搜索二维矩阵
题目大意:要求在一个二维矩阵中搜索一个数,要求是时间尽可能少。说明:二维矩阵是从左到右,从上到下依次增大的。题目分析:本题如果用挨个遍历的话,显然没有利用上矩阵中的有序关系。我的做法是:将target的值与每行的最后一个数进行比较,若最后一个数小于target,那么还要往下搜索,将搜索的行边界的上界x设为下一行的下标;反之,将行边界的下界y设为当前行,并退出循环。最后,若x改变了,表示target...原创 2018-07-11 19:52:06 · 768 阅读 · 0 评论 -
LeetCode113. 路径总和 II
给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。说明: 叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ ...原创 2018-07-24 21:23:37 · 557 阅读 · 0 评论 -
LeetCode90. 子集II
题目:给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:输入: [1,2,2]输出:[ [2], [1], [1,2,2], [2,2], [1,2], []]题目分析:首先将nums数组排序,然后使用DFS深度遍历,在同一个for循环中,遇到和之前一样的数字则跳过。代码展示...原创 2018-07-19 18:16:39 · 590 阅读 · 0 评论 -
LeetCode130. 被围绕的区域
给定一个二维的矩阵,包含 'X' 和 'O'(字母 O)。找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。示例:X X X XX O O XX X O XX O X X运行你的函数后,矩阵变为:X X X XX X X XX X X XX O X X解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都...原创 2018-07-29 09:39:50 · 633 阅读 · 0 评论 -
LeetCode200. 求岛屿的个数
给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。示例 1:输入:11110110101100000000输出: 1示例 2:输入:11000110000010000011输出: 3题目分析:用DFS求解,即求图中连通分...原创 2018-08-14 13:16:14 · 1132 阅读 · 0 评论 -
LeetCode207. 课程表
现在你总共有 n 门课需要选,记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]给定课程总量以及它们的先决条件,判断是否可能完成所有课程的学习?示例 1:输入: 2, [[1,0]] 输出: true解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能...原创 2018-08-14 19:37:44 · 605 阅读 · 0 评论 -
LeetCode131. 分割回文串
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。示例:输入: "aab"输出:[ ["aa","b"], ["a","a","b"]]题目分析:DFS+回溯代码展示:class Solution {public: vector<vector<string&原创 2018-08-02 19:04:52 · 1269 阅读 · 0 评论 -
蓝桥杯-九宫重排 (搜索)
问题描述:在九宫格中放置8个数,有一个为空格。给定初始状态九宫格,和目标状态九宫格,问需要多少步可以将初始状态变成目标状态。如果无法达到输出-1,如果可以达到,输出最少的步骤数。问题分析:本题属于搜索算法中的经典题目。可以用很多方法来解答,一般有A*算法和广度搜索BFS。因为广度搜索较容易理解,所以这里就用BFS来解答。已知一个初始状态,如何利用BFS,搜索到最终状态?如下图所示,每一次画出当前可...原创 2018-03-27 08:52:43 · 2056 阅读 · 1 评论 -
A*算法
本篇博客主要介绍A*算法。在介绍A*算法之前,我先介绍一下Best-First Search Strategy 最佳优先搜索策略,它的基本思想是:1.结合深度优先和广度优先于一身2.根据一个评价函数,在目前产生的所有结点中选择具有最小评价函数值的结点进行扩展3.具有全局优化的概念,与之相反的爬山策略仅具有局部优化概念因为Best-First Search是基于全局进行优化,所以一旦得到解,则该解一...原创 2018-03-29 22:14:44 · 2109 阅读 · 0 评论 -
从B树到B+树
最近在看操作系统和数据库系统,当涉及到查找文件和建立数据库索引时书中反复提到使用B+ 树可以实现高效的查找,于是我迫不及待地想研究一下B+ 树的内部结构。首先从二叉查找树开始讲起。二叉搜索树(BinarySearch Tree),别名又叫二叉查找树,二叉排序树。它是一棵空树或者是满足以下条件的二叉树:它的左子树不空,则左子树上所有的结点的值均小于它的根节点的值;若它的右子树不空原创 2016-08-27 11:37:12 · 914 阅读 · 0 评论 -
POJ 1088
看完该题,第一个想法是,找到 数组中 最大的数,然后在其周围找一个仅次于它大小的数,然后这样循环下去,不过这样好像比较麻烦。当某点上下左右四个点 都是一样大时,需要保留四个方向的值。后来采用 动态规划+递归,用len[i][j] 表示从(i,j)点开始的最大深度,动态转移方程: len[i][j] = max(len[i-1][j],len[i+1][j],len[i][j-1],len[i]原创 2016-03-19 10:24:14 · 687 阅读 · 0 评论 -
POJ 1087
这是一个 网络中的最大流问题的 经典问题。题目:有n个插座,m个电器,k种适配器(a,b),表示插座b可以替代插座a问最少有多少个 电器 充不到电?这道题 可以转换为 求最多可以多少个 电器设备可插入? maxflow那么问题的答案就是 m - maxflow下面就是 如何求最大流 maxflow. 增广路算法:每次用BFS找一条最短的增广路径,然后沿着这条路径原创 2016-03-20 10:30:30 · 663 阅读 · 0 评论 -
蒙特卡洛树算法 (MCTS)
实质上可以看成一种增强学习蒙特卡罗树搜索(MCTS)会逐渐的建立一颗不对称的树。可以分为四步并反复迭代:(1)选择从根节点,也就是要做决策的局面R出发向下选择一个最急迫需要被拓展的节点T;局面R是第一个被检查的节点,被检查的节点如果存在一个没有被评价过的招式m,那么被检查的节点在执行m后得到的新局面就是我们所需要展开的T;如果被检查的局面所有可行的招式已经都被评价过了,转载 2016-03-10 11:29:16 · 19679 阅读 · 0 评论 -
POJ 1033
这是一道关于磁盘管理的题目。题目大意:磁盘中有N块簇,F块文件,每个文件分别分布在不同的簇中。默认,顺序查找速度最快。问的是,怎么调整顺序使得各个文件按照簇的逻辑顺序排列。举例:假设原始顺序为: 初始状态是这样的,0表示未占用: 簇号: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17原创 2016-02-25 13:57:32 · 557 阅读 · 0 评论 -
第六届CCF计算机职业资格认证考试题解(第三题)
参加过两三次CCF考试,每次做到第三题,总是拿不到满分,总有情况遗漏掉,这道题我在考试时,得了90分,后来想了好久,没发现有什么情况遗漏掉了。今天再次做了一下,终于A了题目大意:根据输入的条件用‘-’、‘+’、‘|’,和给定的英文字母画一张图,给定m,n表示列数和行数。接下来给一个动作步骤数。动作共有两个形态,画线,开头用0表示,后面的四个数x,y,,u,v表示点(x,y)到(原创 2016-04-04 22:30:16 · 1426 阅读 · 0 评论 -
POJ 1129
题目大意:给定一些点,和它们之间的连通关系,要求相邻的点之间信号不同,求出最少需要多少信号?这道题其实是染色问题,可以参照 图论里面的 四色定理(即只要四种颜色就可以将一幅地图染色,要求是相邻的各块面积颜色不同)所以这道题最大值就是4因为此题最多也就26个点,所以暴力搜索dfs,也可以accept#include#include#includeusing namespac原创 2016-02-27 15:54:26 · 662 阅读 · 0 评论 -
POJ 2049
题目大意,在迷宫中找一条出口,题目的本质其实是 BFS+ 队列实现,不懂网上为什么说是 优先队列,我觉得符合条件的才入队,不符合的就不入队,哪来优先级之说。还有,这道题在 构建图的模型中,对于xa,ya,在输入样例初始化的时候,我始终认为是 当d==1时,初始化xa . 可看了网上许多AC的代码,都是反过来的,好奇怪。#include#includeusing namespace st原创 2016-02-28 14:59:33 · 1094 阅读 · 0 评论 -
图的广度遍历 (算法导论 345页)
最近,做了几道关于图的题目,略感生疏。准备看看算法导论复习一下。说到基本的图算法,那就必然会提高图算法的核心-搜索,经典的 广度搜索BFS 和 深度搜索DFS形象点说,前者就是 水面上泛起的 涟漪,一层一层注重广度;而后者 就是 打洞,往深里去,打完一个洞,再打另一个洞。 算法导论,第22章基本图算法,广度遍历,我看了下书里面的例子,觉得挺好,下面自己实现了一下,写的简单了些,大神勿喷。原创 2016-03-28 20:38:04 · 460 阅读 · 0 评论 -
网络延时 201503-4
问题描述 给定一个公司的网络,由n台交换机和m台终端电脑组成,交换机与交换机、交换机与电脑之间使用网络连接。交换机按层级设置,编号为1的交换机为根交换机,层级为1。其他的交换机都连接到一台比自己上一层的交换机上,其层级为对应交换机的层级加1。所有的终端电脑都直接连接到交换机上。 当信息在电脑、交换机之间传递时,每一步只能通过自己传递到自己所连接的另一台电脑或交换机。请问,电脑与电脑原创 2016-04-21 12:08:26 · 504 阅读 · 0 评论 -
九度OJ 1012 畅通工程 (深度遍历求强连通分量个数)
题目描述: 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?输入: 测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( 注意:两个城市之原创 2016-06-19 11:16:00 · 1112 阅读 · 0 评论 -
九度OJ 1009 二叉搜索树
题目描述:判断两序列是否为同一二叉搜索树序列输入:开始一个数n,(1接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。输出:如果序列相同则输出YES,否则输出NO样例输入:2原创 2016-06-22 22:49:36 · 769 阅读 · 0 评论 -
LeetCode216. 组合总和 III
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。说明:所有数字都是正整数。 解集不能包含重复的组合。 示例 1:输入: k = 3, n = 7输出: [[1,2,4]]示例 2:输入: k = 3, n = 9输出: [[1,2,6], [1,3,5], [2,3,4]]题目分析:DFS,为...原创 2018-08-21 11:28:20 · 770 阅读 · 1 评论