46. 全排列(中等)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200913161658685.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTc2MzUzNg==,size_16,color_FFFFFF,t_70#pic_center)
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
if(nums == null || nums.length == 0){
return list;
}
Deque<Integer> path = new ArrayDeque<>();
boolean[] visited = new boolean[nums.length];
dfs(nums, visited, list, path);
return list;
}
public void dfs(int[] nums, boolean[] visited, List<List<Integer>> list, Deque<Integer> path){
if(path.size() == nums.length){
list.add(new ArrayList<Integer>(path));
return;
}
for(int i=0; i<nums.length; i++){
if( !visited[i] ){
path.add(nums[i]);
visited[i] = true;
dfs(nums, visited, list, path);
path.removeLast();
visited[i] = false;
}
}
}
}
47. 全排列 II(中等)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200913161827435.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTc2MzUzNg==,size_16,color_FFFFFF,t_70#pic_center)
class Solution {
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
if(nums == null || nums.length == 0){
return list;
}
Deque<Integer> path = new ArrayDeque<>();
boolean[] visited = new boolean[nums.length];
Arrays.sort(nums);
dfs(nums, visited, list, path);
return list;
}
public void dfs(int[] nums, boolean[] visited, List<List<Integer>> list, Deque<Integer> path){
if(path.size() == nums.length){
list.add(new ArrayList<Integer>(path));
return;
}
for(int i=0; i<nums.length; i++){
if( !visited[i] ){
if (i > 0 && nums[i] == nums[i - 1] && !visited[i - 1]) {
continue;
}
path.add(nums[i]);
visited[i] = true;
dfs(nums, visited, list, path);
path.removeLast();
visited[i] = false;
}
}
}
}
39. 组合总和(中等)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200913162004826.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTc2MzUzNg==,size_16,color_FFFFFF,t_70#pic_center)
class Solution {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> list = new ArrayList<>();
ArrayDeque<Integer> queue = new ArrayDeque<>();
Arrays.sort(candidates);
traceBack(list, target, queue, 0, candidates);
return list;
}
public void traceBack(List<List<Integer>> list, int target, ArrayDeque<Integer> queue, int start, int[] candidates){
if(target == 0){
list.add(new ArrayList<>(queue));
return;
}
for(int i=start; i<candidates.length; i++){
if(target - candidates[i]< 0){
break;
}
queue.offer(candidates[i]);
traceBack(list, target-candidates[i], queue, i, candidates);
queue.removeLast();
}
}
}
40. 组合总和 II(中等)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200913162239966.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTc2MzUzNg==,size_16,color_FFFFFF,t_70#pic_center)
class Solution {
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
List<List<Integer>> list = new ArrayList<>();
ArrayDeque<Integer> queue = new ArrayDeque<>();
Arrays.sort(candidates);
traceBack(list, target, queue, 0, candidates);
return list;
}
public void traceBack(List<List<Integer>> list, int target, ArrayDeque<Integer> queue, int start, int[] candidates){
if(target == 0){
list.add(new ArrayList<>(queue));
return;
}
for(int i=start; i<candidates.length; i++){
if(target - candidates[i]< 0){
break;
}
if(i>start && candidates[i] == candidates[i-1]){
continue;
}
queue.offer(candidates[i]);
traceBack(list, target-candidates[i], queue, i+1, candidates);
queue.removeLast();
}
}
}
77. 组合(中等)
![在这里插入图片描述](https://img-blog.csdnimg.cn/202009131627010.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTc2MzUzNg==,size_16,color_FFFFFF,t_70#pic_center)
class Solution {
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> list = new ArrayList<>();
if(k < 0 || k > n){
return list;
}
Deque<Integer> path = new ArrayDeque<>();
dfs(n, k, 1, path, list);
return list;
}
public void dfs(int n, int k, int start, Deque<Integer> path, List<List<Integer>> list){
if(path.size() == k){
list.add(new ArrayList<>(path));
return ;
}
for(int i=start; i<=n-(k-path.size())+1; i++){
path.offer(i);
dfs(n,k,i+1,path,list);
path.removeLast();
}
}
}
78. 子集(中等)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200913163014693.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTc2MzUzNg==,size_16,color_FFFFFF,t_70#pic_center)
class Solution {
public List<List<Integer>> subsets(int[] nums) {
int n = nums.length;
List<List<Integer>> output = new ArrayList();
for (int k = 0; k < n + 1; ++k) {
backtrack(0, new ArrayDeque<Integer>(), nums, k, output);
}
return output;
}
public void backtrack(int first, ArrayDeque<Integer> curr, int[] nums, int k, List<List<Integer>> output) {
if (curr.size() == k){
output.add(new ArrayList(curr));
}
for (int i = first; i<nums.length; ++i) {
curr.offer(nums[i]);
backtrack(i + 1, curr, nums, k, output);
curr.removeLast();
}
}
}
90. 子集 II(中等)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200913163148540.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTc2MzUzNg==,size_16,color_FFFFFF,t_70#pic_center)
class Solution {
public List<List<Integer>> subsetsWithDup(int[] nums) {
int n = nums.length;
List<List<Integer>> output = new ArrayList();
Arrays.sort(nums);
for (int k = 0; k < n + 1; ++k) {
backtrack(0, new ArrayDeque<Integer>(), nums, k, output);
}
return output;
}
public void backtrack(int first, ArrayDeque<Integer> curr, int[] nums, int k, List<List<Integer>> output) {
if (curr.size() == k){
output.add(new ArrayList(curr));
}
for (int i = first; i<nums.length; ++i) {
if(i>first && nums[i]==nums[i-1]){
continue;
}
curr.offer(nums[i]);
backtrack(i + 1, curr, nums, k, output);
curr.removeLast();
}
}
}