List<List<Integer>> dp = new ArrayList<>();
List<Integer> path = new ArrayList<>();
Set<List<Integer>> set = new HashSet<>();
public void dfs(int[] nums, int index) {
if(path.size()>1) {
set.add(new ArrayList<>(path));
}
if(index>=nums.length) {
return ;
}
int[] used = new int[201];
for(int i=index;i<nums.length;i++) {
if(path.size()!=0&&path.get(path.size()-1)>nums[i]||used[nums[i]+100]==1) {
continue;
}
used[nums[i]+100]=1;
path.add(nums[i]);
dfs(nums,i+1);
path.remove(path.size()-1);
}
}
public List<List<Integer>> findSubsequences(int[] nums) {
if(nums.length==0) return dp;
dfs(nums,0);
dp.addAll(set);
return dp;
}
LeetCode46.全排列
List<List<Integer>> dp = new ArrayList<>();
List<Integer> path = new ArrayList<>();
boolean[] used = new boolean[7];
public void dfs(int[]nums) {
if(path.size()>=nums.length) {
dp.add(new ArrayList<>(path));
return;
}
for(int i=0;i<nums.length;i++) {
if(used[i]) continue;
used[i]=true;
path.add(nums[i]);
dfs(nums);
path.remove(path.size()-1);
used[i]=false;
}
}
public List<List<Integer>> permute(int[] nums) {
if(nums.length==0) return dp;
dfs(nums);
return dp;
}
LeetCode47.全排列 II
List<List<Integer>> dp = new ArrayList<>();
List<Integer> path = new ArrayList<>();
boolean[] used = new boolean[8];
public void dfs(int[] nums) {
if(path.size()==nums.length) {
dp.add(new ArrayList<>(path));
return;
}
for(int i=0;i<nums.length;i++) {
if(used[i]) continue;
if(i>0&&nums[i-1]==nums[i]&& used[i - 1] == false) continue;
used[i]=true;
path.add(nums[i]);
dfs(nums);
path.remove(path.size()-1);
used[i]=false;
}
}
public List<List<Integer>> permuteUnique(int[] nums) {
if(nums.length==0) return dp;
Arrays.sort(nums);
dfs(nums);
return dp;
}
Leetcode51.N皇后
List<List<String>> dp = new ArrayList<>();
public void dfs(char[][]chessboard,int n,int row) {
if(row>=n) {
//放置n皇后方法
dp.add(Array2List(chessboard));
return;
}
for(int i=0;i<n;i++) {
if(isValid(chessboard,n,row,i)) {
chessboard[row][i]='Q';
dfs(chessboard,n,row+1);
chessboard[row][i]='.';
}
}
}
public List<String> Array2List(char[][] chessboard) {
List<String> list = new ArrayList<>();
for (char[] c : chessboard) {
list.add(String.copyValueOf(c));
}
return list;
}
public boolean isValid(char[][] chessboard,int n,int row,int i) {
//本行中是否有其他皇后
for(int k=0;k<n;k++) {
if(k==i)continue;
if(chessboard[row][k]=='Q') return false;
}
//本列中是否有其他皇后
for(int k=0;k<n;k++) {
if(k==row)continue;
if(chessboard[k][i]=='Q') return false;
}
//左上到右下对角线
int k=row+1,q=i+1;
while(k<n&&q<n) {
if(chessboard[k][q]=='Q') return false;
k++;
q++;
}
k=row-1;
q=i-1;
while(k>=0&&q>=0) {
if(chessboard[k][q]=='Q') return false;
k--;
q--;
}
//右上到左下对角线
k=row-1;
q=i+1;
while(k>=0&&q<n) {
if(chessboard[k][q]=='Q') return false;
k--;
q++;
}
k=row+1;
q=i-1;
while(k<n&&q>=0) {
if(chessboard[k][q]=='Q') return false;
k++;
q--;
}
return true;
}
public List<List<String>> solveNQueens(int n) {
if(n==0) return dp;
char[][] chessboard = new char[n][n];
for (char[] c : chessboard) {
Arrays.fill(c, '.');
}
dfs(chessboard,n,0);
return dp;
}