注:题目转载自leetcode,https://leetcode-cn.com/problems/permutations/
dfs:
package lc.lc46;
import java.util.ArrayList;
import java.util.List;
public class FirstSolution {
public List<List<Integer>> permute(int[] nums) {
if (nums == null) {
return new ArrayList<>();
}
List<List<Integer>> res = new ArrayList<>();
boolean[] visited = new boolean[nums.length];
for (int i = 0; i < nums.length; i++) {
visited[i] = true;
List<Integer> tempList = new ArrayList<>();
tempList.add(nums[i]);
dfs(visited, nums, i, res, tempList);
tempList.remove(tempList.size() - 1);
visited[i] = false;
}
return res;
}
private void dfs(boolean[] visited, int[] nums, int iter, List<List<Integer>> res, List<Integer> tempList) {
if (tempList.size() == nums.length) {
res.add(new ArrayList<>(tempList));
return;
}
for (int i = 0; i < nums.length; i++) {
if (!visited[i]) {
visited[i] = true;
tempList.add(nums[i]);
dfs(visited, nums, i, res, tempList);
tempList.remove(tempList.size() - 1);
visited[i] = false;
}
}
}
public static void main(String[] args) {
int[] nums = {1, 2};
List<List<Integer>> permute = new FirstSolution().permute(nums);
permute.forEach(o -> {
o.forEach(i -> {
System.out.print(i + " ");
});
System.out.println();
});
}
}
package lc.lc46;
import java.util.ArrayList;
import java.util.List;
public class SecondSolution {
public List<List<Integer>> permute(int[] nums) {
if (nums == null) {
return new ArrayList<>();
}
List<List<Integer>> res = new ArrayList<>();
boolean[] visited = new boolean[nums.length];
List<Integer> tempList = new ArrayList<>();
for (int i = 0; i < nums.length; i++) {
dfs(nums, res, visited, tempList, i);
}
return res;
}
public void dfs(int[] nums, List<List<Integer>> res, boolean[] visited, List<Integer> tempList, int iter) {
// add
if (!visited[iter]) {
visited[iter] = true;
tempList.add(nums[iter]);
} else {
return;
}
// judge
if (tempList.size() == nums.length) {
res.add(new ArrayList<>(tempList));
// delete
visited[iter] = false;
tempList.remove(tempList.size() - 1);
return;
}
// compute
for (int i = 0; i < nums.length; i++) {
dfs(nums, res, visited, tempList, i);
}
// delete
visited[iter] = false;
tempList.remove(tempList.size() - 1);
}
public static void main(String[] args) {
int[] nums = {1, 2};
List<List<Integer>> permute = new SecondSolution().permute(nums);
permute.forEach(o -> {
o.forEach(i -> {
System.out.print(i + " ");
});
System.out.println();
});
}
}
另外多提一嘴:
以上的解法是dfs,访问的时候,我们的图用的是邻接矩阵来表示的,对每一个节点,我们都需要找到它的其他个相邻节点,也就是对每个节点访问它的相邻节点的时间复杂度是,那么n个节点的时间复杂度就是