题目 全排列I
题目链接 给定一个 没有重复 数字的序列,返回其所有可能的全排列。 示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
实现思路
经典回溯问题,dfs深度遍历 图片来源leetcode题解
代码
class Solution {
public List
<List
<Integer>> permute(int[] nums
) {
List
<List
<Integer>> answers
= new ArrayList<>();
List
<Integer> lists
= new ArrayList<>();
int[] visited
= new int[nums
.length
];
if (nums
.length
== 0 || nums
== null
) {
return answers
;
}
backtracking(nums
, visited
, lists
, answers
);
return answers
;
}
public void backtracking(int[] nums
, int[] visited
, List
<Integer> lists
, List
<List
<Integer>> answers
) {
if (lists
.size() == nums
.length
) {
answers
.add(new ArrayList<>(lists
));
return;
}
for (int i
= 0; i
< nums
.length
; i
++) {
if (visited
[i
] == 1) {
continue;
}
visited
[i
] = 1;
lists
.add(nums
[i
]);
backtracking(nums
, visited
,lists
, answers
);
visited
[i
] = 0;
lists
.remove(lists
.size() - 1);
}
}
}
题目 全排列II
题目链接 给定一个可包含重复数字的序列,返回所有不重复的全排列。 示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
实现思路
在原全排列的基础上 进行去重 利用HashSet即可 虽然不优化
代码
class Solution {
public List
<List
<Integer>> permuteUnique(int[] nums
) {
Set
<List
<Integer>> answers
= new HashSet<>();
List
<Integer> lists
= new ArrayList<>();
int[] isvisited
= new int[nums
.length
];
if (nums
== null
|| nums
.length
== 0) {
return new ArrayList<>(answers
);
}
backtracking(nums
, isvisited
, lists
, answers
);
List
<List
<Integer>> res
=new ArrayList<>(answers
);
return res
;
}
public void backtracking(int[] nums
, int[] isvisited
, List
<Integer> lists
, Set
<List
<Integer>> answers
) {
if (lists
.size() == nums
.length
) {
answers
.add(new ArrayList<>(lists
));
return;
}
for (int i
= 0; i
< nums
.length
; i
++) {
if (isvisited
[i
] == 1) {
continue;
}
isvisited
[i
] = 1;
lists
.add(nums
[i
]);
backtracking(nums
, isvisited
,lists
, answers
);
isvisited
[i
] = 0;
lists
.remove(lists
.size() - 1);
}
}
}