类型总结之——回溯算法
回溯算法
Mona______
好好学习天天向上 o(≧v≦)o
展开
-
回溯算法总结点睛
一、基本概念1、什么是回溯法?又称回溯搜索法,说白了就是一种搜索方式。其实回溯是递归的副产品,只要有递归就会有回溯。回溯函数也可以称之为递归函数。2、回溯法的效率回溯法本质是穷举,因此并不高效可以通过一些剪枝的操作稍微提高一些效率,但仍是比较低效的算法3、回溯法解决的问题经常用来解决以下 5 种问题:* 1)组合问题:**不强调**元素的顺序,N个数里按照一定的规则找出K个数的集合* 2)排列问题:**强调**元素的顺序,N个数按一定的规则全排列,求有多少排列方式* 3)切割问题:一原创 2021-06-20 23:46:41 · 3803 阅读 · 1 评论 -
leetcode——第79题——单词搜索/典型回溯
题目:给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。class Solution {public: bool exist(vector<vector<char>>& board, string word) {原创 2021-07-08 00:10:44 · 115 阅读 · 0 评论 -
leetcode——第139题——单词拆分
题目:给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。/*本题有两种方法:方法一:回溯法与回溯算法中的 第131题 分割回文串 比较相似,整体思路,枚举分割后的所有子串,判断是否在字典里出现过时间复杂度 O(2^n),因为每个单词有两个状态,切割,或者不切割空间复杂度:O(n),算法递归系统调用栈的空间普通的回溯法 超时了,使用记原创 2021-05-20 21:19:52 · 206 阅读 · 0 评论 -
leetcode——第698题——划分为k个相等的子集
题目:给定一个整数数组 nums 和一个正整数 k,找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。示例 1:输入: nums = [4, 3, 2, 3, 5, 2, 1], k = 4输出: True说明: 有可能将其分成 4 个子集(5),(1,4),(2,3),(2,3)等于总和。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/partition-to-k-equal-sum-subsets著作权归领扣网络所有。商业原创 2021-05-18 22:30:06 · 665 阅读 · 0 评论 -
leetcode——第37题——解数独
题目:编写一个程序,通过填充空格来解决数独问题。数独的解法需 遵循如下规则:数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)数独部分空格内已填入了数字,空白格用 ‘.’ 表示。class Solution {private: bool backtracking(vector<vector<char>>& board) { //原创 2021-05-09 00:43:29 · 103 阅读 · 0 评论 -
leetcode——第51题——N皇后
题目:n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位/*复习一下回溯算法的模板:void backtracking(参数){ if(终止条件) { 存放结果; return } for(选择:本层集合元素(树中节原创 2021-05-08 23:19:47 · 162 阅读 · 0 评论 -
leetcode——第332题——重新安排行程
题目:给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序。所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。class Solution {// 先回忆一下:首先要把给定的的 二维字符串数组,一一映射private: // <出发机场, <到达机场, 航班次数>> unordered_map<string, map<string原创 2021-05-08 21:58:19 · 195 阅读 · 0 评论 -
leedcode——第47题——全排列V2
题目:给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。class Solution {/* 树层去重,需要先对原始数组进行排序,然后再计算if(i > 0 && nums[i] == nums[i-1] && used[i-1] == true)used[i-1] == true 说明同一树枝 nums[i-1] 使用过used[i-1] == false 说明同一树层 nums[i-1] 使用过如果同一树层 nums[原创 2021-05-08 17:31:14 · 43 阅读 · 0 评论 -
leetcode——第46题——全排列
题目:给定一个 没有重复 数字的序列,返回其所有可能的全排列。class Solution {/*与之前不同,for 循环中就不用 startIndex 了,因为排列问题,每一次都要从头开始搜索需要用 used 数组来记录 path 中都放了哪些元素vector 在定义的时候初始化,这个自己也是不太会写的点呢*/private: vector<int> path; vector<vector<int>> result; void原创 2021-05-07 23:08:26 · 163 阅读 · 0 评论 -
leetcode——第491题——递增子序列
题目:给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是 2 。/* 这道题对比前面的题,有两处需要注意的: 1、这题是不能对给定数组排序的,因为是要求找给定数组的顺序找其子序列,既然是子序列那顺序就不能变 2、既然不能排序,那么相同的元素就不一定是挨着的,所以,就不能是相邻元素做比较,就要用哈希映射每个元素是否取过set 的一个没见过的用法 uset.find(nums[i] != uset.end())vector 的一个没见过的用法原创 2021-05-07 21:51:25 · 103 阅读 · 0 评论 -
leetcode——第90题——子集V2
题目:给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。class Solution {private: vector<int> path; // 存储路径上的 vector<vector<int>> result; // 存储最终结果 void backtracking(vector<int>& n原创 2021-05-07 19:05:19 · 96 阅读 · 0 评论 -
leetcode——第78题——子集
题目:给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。class Solution {private: vector<int> path; // 存储路径上的 vector<vector<int>> result; // 存储最终结果 void backtracking(vector<int>& nums, i原创 2021-05-07 18:51:26 · 154 阅读 · 0 评论 -
leetcode——第93题——复原IP地址
题目:给定一个只包含数字的字符串,用以表示一个 IP 地址,返回所有可能从 s 获得的 有效 IP 地址 。你可以按任何顺序返回答案。有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。例如:“0.1.2.201” 和 “192.168.1.1” 是 有效 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效 IP 地址。来源:力扣(LeetCode)链接:h原创 2021-05-07 00:00:42 · 643 阅读 · 0 评论 -
leetcode——第131题——分割回文串
题目:给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。回文串 是正着读和反着读都一样的字符串。class Solution {private: // 涉及到字符串的操作,可以不用 vector 数组,因为string本身就有很多操作,基本可以满足 // 这道题本身就要求了结果的类型,所以path的数据类型就定了 // 我之前的理解有一些偏差,回文串的分割,是前后有关联的,所以之前的理解需要重新整理一下 // 回文原创 2021-05-06 17:43:12 · 275 阅读 · 0 评论 -
leetcode——第40题——组合总和V2
题目:给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。说明:所有数字(包括目标数)都是正整数。解集不能包含重复的组合。class Solution {// private:// vector<vector<int>> result;// vector<int> path;// in原创 2021-05-06 15:27:26 · 88 阅读 · 0 评论 -
leetcode——第39题——组合总和
题目:给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。class Solution {private: int sum; vector<int> path; vector<vector<int>> result; void backtracking(vector<int>原创 2021-05-06 14:28:45 · 99 阅读 · 0 评论 -
leetcode——第17题——电话号码的字母组合
题目:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。class Solution {private: // 这里的path可以不定以为 vector 因为string是可以直接进行 插入和删除操作的 string path; vector<string> result; // 传入的参数中需要有个来记录是哪个数字 // 第一个参数原创 2021-05-06 14:00:17 · 428 阅读 · 0 评论 -
leetcode——第216题——组合问题V3
题目找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。说明:所有数字都是正整数。解集不能包含重复的组合。class Solution {private: int sum; vector<int> path; vector<vector<int>> result; void backtracking(int k, int n, int startIndex)原创 2021-05-06 00:01:47 · 155 阅读 · 0 评论 -
leetcode——第77题——组合
给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。class Solution {private: vector<int> path; vector<vector<int>> result; // 因为每次回溯的起始下标不一样,所以回溯函数的参数加一个起始下标 void backtracking(int n, int k, int startIndex) { // 终止条件原创 2021-05-05 23:18:58 · 112 阅读 · 0 评论