回溯问题(子集型回溯、组合型回溯、排列型回溯)【零神基础精讲】
来源0x3f:https://space.bilibili.com/206214
回溯分为【子集型回溯】【组合型回溯】【排列型回溯】
文章目录
- 回溯基本概念
- [17. 电话号码的字母组合](https://leetcode.cn/problems/letter-combinations-of-a-phone-number/)
- 子集型回溯(分割问题也可以看作枚举分割点==>子集型)
- [78. 子集](https://leetcode.cn/problems/subsets/)
- 方法一:输入的视角(每个节点可以选择选和不选)
- 方法二:答案的角度(枚举第一个数选谁、第二个数选谁)
- [131. 分割回文串](https://leetcode.cn/problems/palindrome-partitioning/)
- 思路:设每两个相邻字符间有逗号,枚举每个逗号结束位置。这样就变成了[78. 子集]问题
- [784. 字母大小写全排列](https://leetcode.cn/problems/letter-case-permutation/)
- [93. 复原 IP 地址](https://leetcode.cn/problems/restore-ip-addresses/)
- 组合型回溯(剪枝技巧)
- [77. 组合](https://leetcode.cn/problems/combinations/)
- [216. 组合总和 III](https://leetcode.cn/problems/combination-sum-iii/)
- [22. 括号生成](https://leetcode.cn/problems/generate-parentheses/)
- 排列型回溯(棋盘问题也是排列型回溯)
- [46. 全排列](https://leetcode.cn/problems/permutations/)
- [51. N 皇后](https://leetcode.cn/problems/n-queens/)
回溯基本概念
回溯三问:
1、当前操作?
2、子问题?
3、下一个子问题?
void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果}
}
17. 电话号码的字母组合
难度中等2314
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
输入:digits = "23"
输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
输入:digits = ""
输出:[]
示例 3:
输入:digits = "2"
输出:["a","b","c"]
提示:
0 <= digits.length <= 4
digits[i]
是范围['2', '9']
的一个数字。
回溯三问:
1、当前操作? 枚举 path[i] 要填入的字母
2、子问题? 构造字符串>=i 的部分
3、下一个子问题? 构造字符串>= i+1 的部分
class Solution {private static final String[] arr = new String[]{"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};List<String> res = new ArrayList<>();public List<String> letterCombinations(String digits) {if(digits.equals("")) return res;dfs(digits, 0, new StringBuilder());return res;}public void dfs(String digits, int i, StringBuilder sb){if(i == digits.length()){res.add(sb.toString());return;}String str = arr[digits.charAt(i) - '0'];for(int j = 0; j < str.length(); j++){sb.append(str.charAt(j));dfs(digits, i+1, sb);sb.deleteCharAt(sb.length()-1);}}
}
子集型回溯(分割问题也可以看作枚举分割点==>子集型)
子集型回溯:每个元素都可以选和不选
回溯三问:
**1、当前操作?**枚举第 i 个数选/不选
2、子问题? 从下标 >=i 的数字中构造子集
3、下一个子问题? 从下标 >=i+1 的数字中构造子集
78. 子集
难度中等1931
给你一个整数数组 nums
,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入:nums = [0]
输出:[[],[0]]
提示:
1 <= nums.length <= 10
-10 <= nums[i] <= 10
nums
中的所有元素 互不相同
题解:
方法一:输入的视角(每个节点可以选择选和不选)
class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> cur;public List<List<Integer>> subsets(int[] nums) {cur = new ArrayList<>();dfs(nums, 0);return res;}// 每个节点可以选择选和不选public void dfs(int[] nums, int i){if(i == nums.length){res.add(new ArrayList<>(cur));return;}dfs(nums, i+1);cur.add(nums[i]);dfs(nums, i+1);cur.remove(cur.size()-1);}
}
方法二:答案的角度(枚举第一个数选谁、第二个数选谁)
class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> cur;public List<List<Integer>> subsets(int[] nums) {cur = new ArrayList<>();dfs(nums, 0);return res;}// 每个节点可以选择选和不选public void dfs(int[] nums, int i){// 关键在这里, 递归入口每次记录答案res.add(new ArrayList<>(cur));if(i == nums.length){return;}for(int j = i; j < nums.length; j++){cur.add(nums[j]);dfs(nums, j+1);cur.remove(cur.size()-1);}}
}
131. 分割回文串
难度中等1387
给你一个字符串 s
,请你将 s
分割成一些子串,使每个子串都是 回文串 。返回 s
所有可能的分割方案。
回文串 是正着读和反着读都一样的字符串。
示例 1:
输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]
示例 2:
输入:s = "a"
输出:[["a"]]
提示:
1 <= s.length <= 16
s
仅由小写英文字母组成
思路:设每两个相邻字符间有逗号,枚举每个逗号结束位置。这样就变成了[78. 子集]问题
方法二:答案的角度(枚举字串结束位置)
class Solution {List<List<String>> res = new ArrayList<>();List<String> cur;public List<List<String>> partition(String s) {cur = new ArrayList<>();dfs(s, 0);return res;}public void dfs(String s, int i){if(i == s.length()){res.add(new ArrayList<>(cur));return;}//枚举字串结束位置(设以j结尾是否符合要求)for(int j = i; j < s.length(); j++){//判断一下[i, j] 部分是否为回文串String str = s.substring(i, j+1);if(isrev(str)){cur.add(str);dfs(s, j+1);cur.remove(cur.size()-1);}}}public boolean isrev(String str){int left = 0, right = str.length()-1;while(left < right){if(str.charAt(left) != str.charAt(right))return false;left++; right--;}return true;}
}
784. 字母大小写全排列
难度中等515
给定一个字符串 s
,通过将字符串 s
中的每个字母转变大小写,我们可以获得一个新的字符串。
返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。
示例 1:
输入:s = "a1b2"
输出:["a1b2", "a1B2", "A1b2", "A1B2"]
示例 2:
输入: s = "3z4"
输出: ["3z4","3Z4"]
提示:
1 <= s.length <= 12
s
由小写英文字母、大写英文字母和数字组成
题解:
DFS 回溯 看到题目要求组合或者集合,马上想到可以用回溯法:
回溯法本来是说对于每个元素都先考虑放它的情况,再考虑不放它的情况;
放在这道题的背景里就是,对于每个字母,先考虑放它,再考虑放它的另一种大小写形式。
class Solution {List<String> res = new ArrayList<>();public List<String> letterCasePermutation(String s) {dfs(s, 0, new StringBuilder());return res;}public void dfs(String s, int i, StringBuilder sb){if(i == s.length()){res.add(new String(sb.toString()));return;}// 不改sb.append(s.charAt(i));dfs(s, i+1, sb);sb.deleteCharAt(sb.length()-1);//改if(s.charAt(i) >= 'a' && s.charAt(i) <= 'z'){sb.append((char)(s.charAt(i) - 32));dfs(s, i+1, sb);}else if(s.charAt(i) >= 'A' && s.charAt(i) <= 'Z'){sb.append((char)(s.charAt(i) + 32));dfs(s, i+1, sb);}if((s.charAt(i) >= 'a' && s.charAt(i) <= 'z') || (s.charAt(i) >= 'A' && s.charAt(i) <= 'Z'))sb.deleteCharAt(sb.length()-1);}
}
93. 复原 IP 地址
难度中等1146收藏分享切换为英文接收动态反馈
有效 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 地址。
给定一个只包含数字的字符串 s
,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s
中插入 '.'
来形成。你 不能 重新排序或删除 s
中的任何数字。你可以按 任何 顺序返回答案。
示例 1:
输入:s = "25525511135"
输出:["255.255.11.135","255.255.111.35"]
示例 2:
输入:s = "0000"
输出:["0.0.0.0"]
示例 3:
输入:s = "101023"
输出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]
提示:
1 <= s.length <= 20
s
仅由数字组成
class Solution {List<String> res = new ArrayList<>(); List<String> tmp = new ArrayList<>();public List<String> restoreIpAddresses(String s) {dfs(s, 0);return res;}public void dfs(String s, int begin){if(tmp.size() == 4 && begin != s.length()) return;if(tmp.size() == 4 && begin == s.length()){res.add(String.join(".",tmp));return;}//枚举分割点for(int j = begin; j < s.length() && j < begin+3; j++){String str = s.substring(begin, j+1);// 每个整数位于 0 到 255 之间组成if(Integer.parseInt(str) <= 255){// 不能含有前导 0if(str.length() > 1 && str.charAt(0) == '0'){return;}tmp.add(str);dfs(s, j+1);tmp.remove(tmp.size()-1);}else{return;}}}
}
组合型回溯(剪枝技巧)
77. 组合
难度中等1284
给定两个整数 n
和 k
,返回范围 [1, n]
中所有可能的 k
个数的组合。
你可以按 任何顺序 返回答案。
示例 1:
输入:n = 4, k = 2
输出:
[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],
]
示例 2:
输入:n = 1, k = 1
输出:[[1]]
提示:
1 <= n <= 20
1 <= k <= n
class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> cur = new ArrayList<>();int n, k;public List<List<Integer>> combine(int _n, int _k) {n = _n;k = _k;dfs(1);return res;}public void dfs(int i){if(cur.size() == k){ // d == 0res.add(new ArrayList<>(cur));return;}for(int j = i; j <= n - (k - cur.size()) + 1 ; j++){cur.add(j);dfs(j+1);cur.remove(cur.size() - 1);}}
}
相同方式倒着遍历的写法
class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> cur = new ArrayList<>();int n, k;public List<List<Integer>> combine(int _n, int _k) {n = _n; k = _k;dfs(n);return res;}public void dfs(int i){int d = k - cur.size();// 还要选 d 个数if(d == 0){ res.add(new ArrayList<>(cur));return;}for(int j = i; j >= d; j--){cur.add(j);dfs(j-1);cur.remove(cur.size() - 1);}}
}
216. 组合总和 III
难度中等622
找出所有相加之和为 n
的 k
个数的组合,且满足下列条件:
- 只使用数字1到9
- 每个数字 最多使用一次
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
示例 1:
输入: k = 3, n = 7
输出: [[1,2,4]]
解释:
1 + 2 + 4 = 7
没有其他符合的组合了。
示例 2:
输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
解释:
1 + 2 + 6 = 9
1 + 3 + 5 = 9
2 + 3 + 4 = 9
没有其他符合的组合了。
示例 3:
输入: k = 4, n = 1
输出: []
解释: 不存在有效的组合。
在[1,9]范围内使用4个不同的数字,我们可以得到的最小和是1+2+3+4 = 10,因为10 > 1,没有有效的组合。
提示:
2 <= k <= 9
1 <= n <= 60
class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> cur = new ArrayList<>();int k;public List<List<Integer>> combinationSum3(int _k, int n) {k = _k;dfs(9, n);return res;}public void dfs(int i, int target){int d = k - cur.size();// 还要选 d 个数//剪枝// 首项+末项 *项数 /2 仍然比target小,就不用递归了if(target < 0 || target > (i*2 - d + 1) * d / 2)return; // d = 0 , (i*2 - d + 1) * d / 2也是等于0的,就不用判断target = 0 了if(d == 0){ res.add(new ArrayList<>(cur));return;}for(int j = i; j >= d; j--){cur.add(j);dfs(j-1, target-j);cur.remove(cur.size() - 1);}}
}
22. 括号生成
难度中等3091
数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
提示:
1 <= n <= 8
class Solution {int n;char[] path;List<String> res = new ArrayList<>();public List<String> generateParenthesis(int n) {this.n = n;path = new char[n * 2];dfs(0, 0);return res;}public void dfs(int i, int open){if(i == n * 2){res.add(new String(path));}if(open < n){ // 可以填左括号path[i] = '(';dfs(i+1, open+1);}if(i - open < open){ // 不可以填左括号了,只能填右括号}path[i] = ')';dfs(i+1, open);}}
}
排列型回溯(棋盘问题也是排列型回溯)
排列型和组合型的区别:组合中不能有{1,2} {2,1} 同时存在,因为他们是相同的组合
46. 全排列
难度中等2411
给定一个不含重复数字的数组 nums
,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:
输入:nums = [0,1]
输出:[[0,1],[1,0]]
示例 3:
输入:nums = [1]
输出:[[1]]
提示:
1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums
中的所有整数 互不相同
class Solution {List<List<Integer>> res = new ArrayList<>();List<Integer> cur = new ArrayList<>();boolean[] visit;public List<List<Integer>> permute(int[] nums) {visit = new boolean[nums.length];dfs(0, nums);return res;}public void dfs(int i, int[] nums){if(i == nums.length){res.add(new ArrayList<>(cur));return;}for(int k = 0; k < nums.length; k++){if(visit[k] == false){visit[k] = true;cur.add(nums[k]);dfs(i+1, nums);cur.remove(cur.size()-1);visit[k] = false;}}}}
51. N 皇后
难度困难1648
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n
个皇后放置在 n×n
的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n
,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q'
和 '.'
分别代表了皇后和空位。
示例 1:
输入:n = 4
输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
解释:如上图所示,4 皇后问题存在两个不同的解法。
示例 2:
输入:n = 1
输出:[["Q"]]
提示:
1 <= n <= 9
题解:https://leetcode.cn/problems/n-queens/solution/java-c-by-tizzi-i9j0/
class Solution {List<List<String>> ans = new ArrayList<>();int[] row;boolean[] cols, d, ud;int N;public List<List<String>> solveNQueens(int n) {N = n;cols = new boolean[n];d = new boolean[30];ud = new boolean[30];row = new int[n];// 用来保存第几行第几列放置Qdfs(0);return ans;}// col【】数组记录某列已经放过了皇后。col【i】= 1代表第i列已经放了一个皇后。// d【】 数组来记录某正对角线已经放置过了皇后。// ud【】数组来记录某反对角线已经放置过了皇后。public void dfs(int i){if(i == N){char[] arr = new char[N];Arrays.fill(arr, '.');List<String> g = new ArrayList<>();for(int j = 0; j < N; j++){arr[row[j]] = 'Q';g.add(new String(arr));arr[row[j]] = '.';}ans.add(g);return;}// 选择一个位置进行放置for(int j = 0; j < N; j++){// 列,对角线、反对角线判断if (!cols[j] && !d[i + j] && !ud[N - i + j]){cols[j] = d[i+j] = ud[N-i+j] = true;row[i] = j;dfs(i+1);cols[j] = d[i+j] = ud[N-i+j] = false;}}}
}
相关文章:

回溯问题(子集型回溯、组合型回溯、排列型回溯)【零神基础精讲】
来源0x3f:https://space.bilibili.com/206214 回溯分为【子集型回溯】【组合型回溯】【排列型回溯】 文章目录回溯基本概念[17. 电话号码的字母组合](https://leetcode.cn/problems/letter-combinations-of-a-phone-number/)子集型回溯(分割问题也可以看…...

源代码配置安装Apache
源代码配置安装Apache 📒博客主页: 微笑的段嘉许博客主页 💻微信公众号:微笑的段嘉许 🎉欢迎关注🔎点赞👍收藏⭐留言📝 📌本文由微笑的段嘉许原创! …...

css水平垂直居中各种方法实现方式
不定宽高水平垂直居中? 面试题回答方式: 通过display:flex;justify-content:center; align-items:center;就可以让子元素不定宽高水平垂直居中 也可以父display:flex;,子设置一个margin&#…...

PowerShell Install java 13
java 前言 Java具有大部分编程语言所共有的一些特征,被特意设计用于互联网的分布式环境。Java具有类似于C语言的形式和感觉,但它要比C语言更易于使用,而且在编程时彻底采用了一种以对象为导向的方式。 java download javadownloadPowersh…...

Python的PyQt框架的使用(汇总)
Python的PyQt框架的使用一、前言二、安装PyQt三、使用第三方开发工具四 、创建主窗体五、常用控件篇1.QLineEdit 文本框2.QPushButton按钮控件3.QRadioButton 单选按钮六、布局管理篇1.通过布局管理器布局2.绝对布局七、信号与槽的关联1.编辑信号/槽2.信号/槽编辑器八、资源文件…...

力扣热题100Day05:15.三数之和,17. 电话号码的字母组合,19. 删除链表的倒数第 N 个结点
15.三数之和 题目链接:15. 三数之和 - 力扣(Leetcode) 思路: (1)双指针,在外层for循环里加入两个指针,left和right (2)排序:为了更好地进行去…...

探索开源:获取完整的 GitHub 社区数据集
本篇文章聊聊 GitHub 开放数据集的获取和整理,分享一些数据整理的细节技巧,以及一些相对粗浅的数据背后的事情。 写在前面 分析 GitHub 上的项目和开发者获取是深入、真实的了解开源世界演进的方法之一。 在 GHArchive 项目中,我们能够看到…...

github ssh密钥配置,克隆远程仓库
GitHub的SSH配置 在往github上push项目的时候,如果走https的方式,每次都需要输入账号密码,非常麻烦。而采用ssh的方式,就不再需要输入,只需要在github自己账号下配置一个ssh key即可! 很多朋友在用github管…...

突破年薪百万难关!吃透这套Java真题合集
前言我相信大多 Java 开发的程序员或多或少经历过BAT一些大厂的面试,也清楚一线互联网大厂 Java 面试是有一定难度的,小编经历过多次面试,有满意的也有备受打击的。因此呢小编想把自己这么多次面试经历以及近期的面试真题来个汇总分析&#x…...

[黑马程序员SSM框架教程] Spring-11-setter注入
思考:向一个类中传递数据要几种? set方法构造方法 思考:依赖注入描述了在容器中建立bean与bean之间依赖关系的过程,如果bean运行需要数字或字符呢 引用类型简单类型(基本数据类型和字符串) 注入方式&#x…...

Java多线程(一)--多线程基础知识
1. 为什么要使用并发编程提升多核CPU的利用率:一般来说一台主机上的会有多个CPU核心,我们可以创建多个线程,理论上讲操作系统可以将多个线程分配给不同的CPU去执行,每个CPU执行一个线程,这样就提高了CPU的使用效率&…...

AutoDock, AutoDock-vina等对接工具安装
AutoDock, AutoDock-vina等对接工具安装 AutoDock-GPU安装 下载地址: https://autodock.scripps.edu/downloads/ 将压缩包传送至安装目录中,并解压到当前路径 unzip AutoDock-GPU-develop.zip 找到服务器的cuda的路径,cuda的路径一般默认…...

MySQL常见面试题(2023年最新)
目录1.char和varchar的区别2.数据库的三大范式3.索引是什么4.索引的优点和缺点5.索引怎么设计(优化)6.索引的类型7.索引的数据类型8.索引为什么使用树结构9.二叉查找树、B树、B树10.为什么使用B树不用B树11.最左匹配原则12.MylSAM和InnoDB的区别13.什么是事务14.事务的四大特性…...

C# 泛型详解
C# 泛型详解1、泛型概述2、定义泛型3、泛型的特性4、泛型委托5、泛型的优点在 C# 中,泛型(Generic)是一种规范,它允许我们使用占位符来定义类和方法,编译器会在编译时将这些占位符替换为指定的类型,利用泛型…...

数据仓库相关术语
数据仓库数据集市事实维度级别数据清洗数据采集数据转换联机分析处理(OLAP OnlineAnalytical Processing )切片切块星型模式雪花模式粒度度量度量值口径指标 原子指标:派生指标衍生指标标签自然键持久键代理键退化维度下钻上卷T0与T1数据挖掘数据科学家总线架构总线…...

【IDEA】常用快捷键
代码补全 快捷键说明sout快速输出System.out.println();psvm快速输出public static void main(String[] args) {}Ctrl Alt Space代码补全 编辑类 快捷键说明Shift Enter向下键入一行,并将光标移到下一行的开头Ctrl Alt Enter当前行上方生成空行,并…...

【调试】sysRq按键使用方法
SysRq键简介 SysRq键是一个魔术案件,只要在内核没有完全卡死的情况下,内核都会相应SysRq 键的输入,使用这些组合键都可以搜集包括系统内存使用、CPU任务处理、进程运行状态等系统运行信息。 配置 内核配置选项中要使能CONFIG_MAGIC_SYSRQ选…...

Jenkins Pipeline 语法
官网 ## https://www.jenkins.io/doc/book/pipeline/ 参考文章 ## https://www.jianshu.com/p/215584419f3d 根据Jenkins官网Pipeline给出的解释, 流水线语法分为两种, 一种是声明式流水线(Declarative Pipeline)另一种是脚本…...

rust语言实现超级简单的杀毒软件,通过哈希扫描病毒。
以下是一个简单的rust语言程序,用于扫描病毒文件并使用哈希表进行比较。该程序可以扫描指定目录中的所有文件,并查找其中是否包含特定的病毒文件。程序可以通过计算文件哈希值并将其与已知的病毒哈希值进行比较来确定文件是否是病毒。注意,这…...

Git仓库中的常用命令
1.第一次使用Git软件前,告诉Git你是谁 git config --global user.name "自定义用户名" git config --global user.email "用户邮箱" 2.查看配置列表 git config --list 3.初始化一个Git仓库,用来管理当前项目 git i…...

arduino和stm32和51和TSM32的区别,树莓派和jetson nano的区别
本科时段接触过很多嵌入式的微处理器和微控制器,但对其使用场景和区别一直没有一个总结,这次收集了一些信息在这总结一下。 Arduino、STM32、51、TMS320和树莓派和jetson nano都是不同的嵌入式系统,它们之间有以下的区别: 开发难度…...

如何进行nginx的负载配置
示例://多机负载策略:加权轮询(适用于服务器无状态,并且服务器硬件配置不均衡的场景)upstream setServ { server 47.100.110.58:80 weight1; server 47.100.110.59:8080 weight4; }location / {//转发到负载服务上proxy_pass http://setServ;}注意&#…...

从功能测试进阶自动化测试,熬夜7天整理出这一份3000字超全学习指南
一、为什么要学习自动化测试? 如果在前两年,可能10个测试员有6个都是做的功能测试,但随着测试技术的发展以及测试工作的深入,传统的手工测试已经无法满足多模块的测试需求,所以为了提高测试效率和测试质量,…...

[NOIP2011 提高组] 铺地毯
[NOIP2011 提高组] 铺地毯 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有 n 张地毯,编号从 1 到 n。现在将这些地毯按照编号从小到大的顺序平行于…...

mac下ElasticSearch 集群搭建,使用Kibana配置和管理集群
Elasticsearch如果做集群的话Master节点至少三台服务器或者三个Master实例加入相同集群,三个Master节点最多只能故障一台Master节点,如果故障两个Master节点,Elasticsearch将无法组成集群.会报错,Kibana也无法启动,因为…...

【软件测试】自动化测试的追求,水土不服?看看资深测试咋说的......
目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 大部分测试初学者入…...

Mac mini 外接移动硬盘无法显示,磁盘工具装载报错显示 com apple diskmanagement disenter
使用“启动安全性实用工具”可确保 Mac 始终从您指定的启动磁盘以及合法的受信任操作系统启动。 如果您使用的是配备 Apple T2 安全芯片的 Mac,则“启动安全性实用工具”提供以下三项功能来帮助保护您的 Mac 免受未经授权的访问:固件密码保护、安全启动…...

【图像处理OpenCV(C++版)】——4.6 限制对比度的自适应直方图均衡化
前言: 😊😊😊欢迎来到本博客😊😊😊 🌟🌟🌟 本专栏主要结合OpenCV和C来实现一些基本的图像处理算法并详细解释各参数含义,适用于平时学习、工作快…...

设计模式--工厂模式
这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。 工厂模式主要使用了C的多态特性。将存在继承关系的类&a…...

算法笔记(十三)—— 树形DP及Morris遍历
树形DP: Question1: 以X为头结点的树,最大距离: 1. X不参与,在左子树上的最大距离 2. X不参与,在右子树上的最大距离 3. X参与,左树上最远的结点通过X到右树最远的结点 最后的结果一定是三种情况的最大…...