2022-1-19DFSday1
题1:
给定一个不含重复数字的数组 nums
,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1:
输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:
输入:nums = [0,1] 输出:[[0,1],[1,0]]
示例 3:
输入:nums = [1] 输出:[[1]]
提示:
1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums
中的所有整数 互不相同
1 class Solution { 2 List<List<Integer>> ans; 3 int n; 4 public List<List<Integer>> permute(int[] nums) { 5 n=nums.length; 6 boolean[] visit=new boolean[n]; 7 ans=new ArrayList<>(); 8 for (int i=0;i<n;i++){ 9 List<Integer> list=new ArrayList<Integer>(); 10 list.add(nums[i]); 11 visit[i]=true; 12 dfs(nums,visit,1,list); 13 visit[i]=false; 14 } 15 return ans; 16 } 17 18 19 public void dfs(int[] num,boolean[] visit,int len,List<Integer> list){ 20 if (len==n) { 21 ans.add(new ArrayList<>(list)); 22 return; 23 } 24 for (int i=0;i<n;i++) { 25 if (!visit[i]){ 26 visit[i]=true; 27 list.add(num[i]); 28 dfs(num,visit,len+1,list); 29 visit[i]=false; 30 list.remove(list.size()-1); 31 } 32 33 } 34 } 35 }
思路:暴力搜索。遍历排列的第一个字母,将所有可能的排列加入到答案中。注意,加入答案的时候要深拷贝,否则会出错。ans.add(new ArrayList<>(list));
题2:
n 皇后问题 研究的是如何将 n
个皇后放置在 n×n
的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n
,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q'
和 '.'
分别代表了皇后和空位。
示例 1:
输入:n = 4 输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]] 解释:如上图所示,4 皇后问题存在两个不同的解法。
示例 2:
输入:n = 1 输出:[["Q"]]
提示:
1 <= n <= 9
1 class Solution { 2 List<List<String>> ans; 3 List<int[]> pos; 4 char[][] chess; 5 public List<List<String>> solveNQueens(int n) { 6 chess=new char[n][n]; 7 ans=new ArrayList<>(); 8 pos=new ArrayList<>(); 9 for (int i=0;i<n;i++) Arrays.fill(chess[i],'.'); 10 dfs(0,n); 11 return ans; 12 } 13 14 public void dfs(int num,int n){ 15 if (num==n){ 16 //记录答案 17 List<String> list=new ArrayList<>(); 18 for (int i=0;i<n;i++){ 19 StringBuffer sb=new StringBuffer(); 20 for (int j=0;j<n;j++){ 21 sb.append(chess[i][j]); 22 } 23 list.add(sb.toString()); 24 } 25 ans.add(list); 26 return; 27 } 28 for (int i=0;i<n;i++){ 29 if (check(num,i)){ 30 pos.add(new int[]{num,i}); 31 chess[num][i]='Q'; 32 dfs(num+1,n); 33 chess[num][i]='.'; 34 pos.remove(pos.size()-1); 35 } 36 } 37 } 38 39 public boolean check(int x,int y){ 40 for (int i=0;i<pos.size();i++){ 41 int dx=pos.get(i)[0],dy=pos.get(i)[1]; 42 if (dx==x||dy==y) return false; //同一行或者同一列 43 if (Math.abs(dx-x)==Math.abs(dy-y)) return false;//对角线 44 } 45 return true; 46 } 47 }
思路:一行一行填王后,利用pos列表记录已经填的位置,check判断当前行的位置能否填。