文章目录
- [一. 力扣 [46. 全排列](https://leetcode.cn/problems/permutations/description/)](#一. 力扣 46. 全排列)
-
- [1. 题目解析](#1. 题目解析)
- [2. 算法原理](#2. 算法原理)
- [3. 代码](#3. 代码)
- [二. 力扣 [78. 子集](https://leetcode.cn/problems/subsets/description/)](#二. 力扣 78. 子集)
-
- [1. 题目解析](#1. 题目解析)
- [2. 算法原理](#2. 算法原理)
-
- [(1) 解法一](#(1) 解法一)
- [(2) 解法二](#(2) 解法二)
- [3. 代码](#3. 代码)
-
- [(1) 解法一代码](#(1) 解法一代码)
- [(2) 解法二代码](#(2) 解法二代码)
一. 力扣 46. 全排列
1. 题目解析
题目为高中学习过的全排列, 注意这里每个数字都是不重复的
2. 算法原理
3. 代码
java
class Solution {
boolean[] check;
List<List<Integer>> ret;
List<Integer> path;
int n;
public List<List<Integer>> permute(int[] nums) {
n = nums.length;
check = new boolean[n];
ret = new ArrayList<>();
path = new ArrayList<>();
dfs(nums);
return ret;
}
void dfs(int[] nums) {
if (path.size() == n) {
ret.add(new ArrayList(path));
return;
}
for (int i = 0; i < n; i++) {
if (!check[i]) {
path.add(nums[i]);
check[i] = true;
dfs(nums);
// 递归完成, 说明已经到达最后一个数,开始回溯
path.remove(path.size() - 1);
check[i] = false;
}
}
}
}
二. 力扣 78. 子集
1. 题目解析
子集本身就是一个集合, 空集是所有集合的子集, 这里所有元素是无序的
2. 算法原理
(1) 解法一
(2) 解法二
3. 代码
(1) 解法一代码
java
class Solution {
List<List<Integer>> ret;
List<Integer> path;
public List<List<Integer>> subsets(int[] nums) {
ret = new ArrayList<>();
path = new ArrayList<>();
dfs(nums, 0);
return ret;
}
void dfs(int[] nums, int i) {
if (i == nums.length) {
ret.add(new ArrayList(path));
return;
}
// 不选择
dfs(nums, i + 1);
// 选择
path.add(nums[i]);
dfs(nums, i + 1);
path.remove(path.size() - 1);
}
}
(2) 解法二代码
java
class Solution {
List<List<Integer>> ret;
List<Integer> path;
public List<List<Integer>> subsets(int[] nums) {
ret = new ArrayList<>();
path = new ArrayList<>();
dfs(nums, 0);
return ret;
}
void dfs(int[] nums, int pos) {
ret.add(new ArrayList(path));
for (int i = pos; i < nums.length; i++) {
path.add(nums[i]);
dfs(nums, i + 1);
path.remove(path.size() - 1);
}
}
}




