什么是深度优先搜索?
面试题:
- 全排列
题目:
图示:
代码:
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
if (nums == null) {
return result;
}
if (nums.length == 0) {
result.add(new ArrayList<Integer>());
return result;
}
List<Integer> list = new ArrayList<>();
helper(result, nums, list);
return result;
}
public void helper(List<List<Integer>> result, int[] nums, List<Integer> list) {
if (list.size() == nums.length) {
result.add(new ArrayList<Integer>(list));
return;
}
for (int i = 0; i < nums.length; i++) {
if (list.contains(nums[i])) {
continue;
}
list.add(nums[i]);
helper(result, nums, list);
list.remove(list.size() - 1);
}
}
}
- 子集
题目:给定一组不同的整数,返回所有可能的子集
示例1:
input:[0]
output: [
[],
[0]
]
示例2:
input:[1,2,3]
output
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
图示:
代码:
public class Solution {
/**
* @param nums: A set of numbers
* @return: A list of lists
*/
public List<List<Integer>> subsets(int[] nums) {
// write your code here
List<List<Integer>> result = new ArrayList<List<Integer>>();
if (nums == null || nums.length == 0) {
result.add(new ArrayList<>());
return result;
}
List<Integer> list = new ArrayList<>();
Arrays.sort(nums);
dfs(nums, result, list, 0);
return result;
}
public void dfs(int[] nums, List<List<Integer>> result, List<Integer> list, int pos) {
/*
[]
1
1, 2
1, 2, 3
1, 3
2
2, 3
3
*/
result.add(new ArrayList<Integer>(list));
for (int i = pos; i < nums.length; i++) {
list.add(nums[i]);
dfs(nums, result, list, i + 1);
list.remove(list.size() - 1);
}
}
}
- n皇后
题目:
图示:
代码:
import java.util.ArrayList;
import java.util.List;
public class NQueens {
public static void main(String[] args) {
List<List<String>> chessboard = new NQueens().solveNQueens(4);
for (List<String> list: chessboard) {
for (String s: list) {
System.out.println(s + " ");
}
System.out.println();
}
}
List<List<String>> solveNQueens(int n) {
List<List<String>> results = new ArrayList<>();
if (n <= 0) {
return results;
}
//....
search(results, new ArrayList<Integer>(), n);
return results;
}
//cols.get(0,1).... 0,1 就是colIndex
public void search(List<List<String>> results, List<Integer> cols, int n) {
if (cols.size() == n) {
results.add(drawChessboard(cols));
return;
}
for (int colIndex = 0; colIndex < n; colIndex++) {
if (!isValid(cols, colIndex)) {
continue;
}
cols.add(colIndex);
search(results, cols, n);
cols.remove(cols.size() - 1);
}
}
private boolean isValid(List<Integer> cols, int column) {
int row = cols.size();
for (int rowIndex = 0; rowIndex < cols.size(); rowIndex++) {
//ͬ
if (cols.get(rowIndex) == column) {
return false;
}
//
if (rowIndex - cols.get(rowIndex) == row - column) {
return false;
}
//
if (rowIndex + cols.get(rowIndex) == row + column) {
return false;
}
}
return true;
}
public List<String> drawChessboard(List<Integer> cols) {
List<String> chessboard = new ArrayList<>();
for (int i = 0; i < cols.size(); i++) {
StringBuilder sb = new StringBuilder();
for (int j = 0; j < cols.size(); j++) {
sb.append(j == cols.get(i) ? 'Q' : '.');
}
chessboard.add(sb.toString());
}
return chessboard;
}
}