반복되는 숫자가없는 시퀀스가 주어지면 가능한 모든 순열을 반환합니다.
예 :
입력 : [1,2,3]
출력 : [[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1 , 2], [3,2,1]]
쓰기 : 4ms
는 혼자서 할 수 있습니다.
public class Permutations {
List<List<Integer>> resList = new ArrayList<List<Integer>>();
public List<List<Integer>> permute(int[] nums) {
ArrayList<Integer> list = new ArrayList<>();
HashSet<Integer> set = new HashSet<>();
for (int i = 0; i < nums.length; i++) {
set.add(nums[i]);
list.add(nums[i]);
dfs(nums, list, set, i);
set.remove(nums[i]);
list.remove(list.size() - 1);
}
return resList;
}
public void dfs(int[] nums, List<Integer> list, HashSet<Integer> set, int index) {
if (list.size() == nums.length) {
resList.add(new ArrayList<>(list));
return;
}
if (index >= nums.length || list.size() > nums.length) {
return;
} else {
for (int i = 0; i < nums.length; i++) {
if (i == index) {
continue;
}
if (!set.contains(nums[i])) {
set.add(nums[i]);
list.add(nums[i]);
dfs(nums, list, set, i);
set.remove(nums[i]);
list.remove(list.size() - 1);
}
}
}
}
}
쓰기 방법 2 : 쓰기 방법 1의 개선 된 버전입니다. 2ms
는 불필요한 코드를 많이 제거하고 통합했습니다.
1. 특별한 상황을 고려하여 : 배열의 길이가 0이면 빈 목록이 반환
됩니다 2. 배열 요소의 가중치를 추가하고 처리를 위해 dfs에 추가하고 index로 표시된 아래 첨자를 제거합니다.
코드는 좀 더 간결합니다.
public class Permutations2 {
List<List<Integer>> resList = new ArrayList<List<Integer>>();
public List<List<Integer>> permute(int[] nums) {
if (nums.length == 0) {
return new ArrayList<>();
}
dfs(nums, new ArrayList<>(), new HashSet<>());
return resList;
}
public void dfs(int[] nums, List<Integer> list, HashSet<Integer> set) {
if (list.size() == nums.length) {
resList.add(new ArrayList<>(list));
return;
} else {
for (int i = 0; i < nums.length; i++) {
if (!set.contains(nums[i])) {
set.add(nums[i]);
list.add(nums[i]);
dfs(nums, list, set);
set.remove(nums[i]);
list.remove(list.size() - 1);
}
}
}
}
}
종료.