![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
搜索算法
RainyD4y
NULL
展开
-
POJ 3279 Filptile 题解 状态压缩枚举
题目大意给定一个M*N的网格,上面有黑白块,然后每次可以反转某个块及其上下左右的块,求整个网格全部变为白色的最少反转次数,如果没有办法反转成功就输出IMPOSSIBLE。分析解决这道问题的关键是,如何分析各个块之间的依赖关系,如果直观地来看各个相邻的块似乎是互相依赖的,因为两个相邻格子可以通过反转的方式互相修改对方的颜色,这种两变量互相影响的问题我们可以通过数学里边的主元法来思考问题。...原创 2020-01-11 20:24:08 · 178 阅读 · 0 评论 -
LeetCode 149 直线上最多的点数 题解
题目大意这道题给定n个点,然后求最多有多少个点可以共线。分析我用了比较朴素的算法,枚举两个不重合的点来计算一条直线,然后判断所有的点有多少会在这条直线上,进而求出最大值,为了避免直线不存在的情况,我这里使用的两点式方程求直线。注意一种极端情况,就是所有的点都是同一个点,那么不存在直线,直接返回n即可。代码public int maxPoints(int[][] point...原创 2019-12-28 22:35:19 · 262 阅读 · 0 评论 -
LeetCode 17 电话号码的字母组合 题解
题目大意给定一个字符串,由2-9几个字符组成,然后每个字符按照手机键盘的规则对应到几个字母,然后依次将字母转换,求出所有可能的组合。分析一个比较容易想到的做法是使用深搜,搜索树上每个状态就是选择一个当前数字可以添加的字母加到当前字符串中,如果长度达到输入字符串长度的时候,就认为是一个可行解,最后求出所有可行解即可。代码map<char, string> getSt...原创 2019-11-14 20:17:36 · 369 阅读 · 0 评论 -
LeetCode 16 最接近的三数之和 题解
题目大意给定一个数组与target,然后从数组中选三个数使它们的和与target最接近。分析其实思路与第十五题比较相似,只是在双指针移动的时候要用三数之和与target做差来决定指针移动,比如大于零,那么说明三数之和比较大,需要将right向左移动。注意,首先要排序,然后可以剪枝。比如第五行,我们需要让nums[i]与左边的nums[i-1]相等,才能对这种情况剪枝,不能通过num...原创 2019-11-09 19:03:33 · 118 阅读 · 0 评论 -
LeetCode 513 找树左下角的值 题解
题目大意给定一个二叉树,求最深一层的最左节点值。分析首先我们需要先进行一轮DFS去求解这个二叉树的最大深度,然后再进行深搜,按照先左后右的顺序,当搜索到第一个处于最大深度处的节点时返回答案。代码int max_depth, ans;bool isVis;void check_depth(int depth, TreeNode* root) { //计算最大深度 ...原创 2019-11-08 20:34:04 · 149 阅读 · 0 评论 -
LeetCode 39 组合总和 题解
题目大意给定一个包含无重复元素的数组candidates和一个目标数target,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。分析一个很直接的想法是使用深度优先搜索,因为每一个元素可以放入无限多次,所以我们在进行下一轮搜索的时候需要将当前元素继续考虑进去,而结束当前这个状态搜索的边界条件是target<0或...原创 2019-11-08 08:45:33 · 172 阅读 · 0 评论 -
LeetCode 47 全排列 II 题解
题目大意给定一个包含重复元素的数组,求全排列。分析为了做这道题,首先要理清求全排列的本质,实际上求全排列就是固定前面的数,然后对后面的数进行选择,比如一开始的时候选择第一个数,然后对剩下的数进行全排列,这样相当于转换为一个子问题,递归求解。那么对于这个问题,假设我们有1,1,3,4四个数,那么对于第一个位置,首先把1放置到这个位置,然后对剩余三个数进行全排列,接下来考虑第二个1时,没有必要...原创 2019-11-06 20:41:36 · 153 阅读 · 0 评论