简单粗暴,记录备战过程,持续更新
回溯算法
适用场景
实战
实战1 51. N 皇后
实战2 46. 全排列
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> ansList = new ArrayList<>();
int[] used = new int[nums.length];
Arrays.fill(used,0);
find(ansList, nums, used, 0, new ArrayList<Integer>());
return ansList;
}
private void find( List<List<Integer>> list , int[] nums , int[] used , int deepth, List<Integer> tmp){
if(deepth == nums.length){
list.add(new ArrayList<>(tmp));
return;
}
for(int i = 0 ; i < used.length ; i++ ){
// 未使用
if(used[i] != 1){
tmp.add(nums[i]);
used[i] = 1;
find(list, nums, used, deepth+1, tmp);
used[i] = 0;
tmp.remove(tmp.size() -1);
}
}
}
}
实战3 22. 括号生成
class Solution {
public List<String> generateParenthesis(int n) {
List<String> list = new ArrayList<>();
int open = 0, close = 0 ;
StringBuilder sb = new StringBuilder();
doGenerateParenthesis(list,open,close,n,sb);
return list;
}
private void doGenerateParenthesis(List<String> list, int open, int close, int max, StringBuilder sb){
// 临界点
if(sb.length() == (max*2)){
list.add(sb.toString());
return;
}
if(open < max){
sb.append("(");
doGenerateParenthesis(list,open + 1,close,max,sb);
sb.deleteCharAt(sb.length() - 1);
}
if(close < open){
sb.append(")");
doGenerateParenthesis(list,open,close + 1,max,sb);
sb.deleteCharAt(sb.length() - 1);
}
}
}
实战4 78. 子集
class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> ans = new ArrayList<>();
doSubsets(nums, ans, 0, new ArrayList<>());
return ans;
}
private void doSubsets(int[] nums, List<List<Integer>> ans, int idx, List<Integer> tmp){
ans.add(new ArrayList<>(tmp));
for(int i = idx ; i < nums.length ; i++){
tmp.add(nums[i]);
doSubsets(nums, ans, i+1, tmp);
tmp.remove(tmp.size() -1);
}
}
}