backtracing
5月10日
1 37 Sudoku Slover
public void solveSudoku(char[][] board) { if(board == null || board.length == 0) return; slove(board); } public boolean slove(char[][] board){ for (int i = 0; i < board.length; i++) { for (int j = 0; j < board[0].length; j++) { if (board[i][j] == '.') { for (char c = '1'; c <= '9'; c++) { if (isValue(board, i, j, c)) { board[i][j] = c; if (slove(board)) return true; else board[i][j] = '.'; } } return false; } } } return true; } public boolean isValue(char[][] board, int row, int col, char c) { for (int i = 0; i < 9; i++) { if (board[i][col] != '.' && board[i][col] == c) return false; if (board[row][i] != '.' && board[row][i] == c) return false; if (board[3 * (row/3) + i/3][3 *(col/3) + i % 3] != '.' && board[3 * (row/3) + i/3][3 *(col/3) + i % 3] == c) return false; } return true; }
2 51 N-Queens
public List<List<String>> solveNQueens(int n) { List<List<String>> res = new ArrayList<>(); help(n, 0, new int[n], res); return res; } public void help(int n, int row, int[] colforrow, List<List<String>> res) { if (row == n) { ArrayList<String> item = new ArrayList<>(); for (int i = 0; i < n; i++) { StringBuilder sb = new StringBuilder(); for (int j = 0; j < n; j++) { if (colforrow[i] == j) sb.append('Q'); else sb.append('.'); } item.add(sb.toString()); } res.add(item); return; } for (int i = 0; i < n; i++) { colforrow[row] = i; if (check(row, colforrow)) { help(n, row + 1, colforrow, res); } } }
3 52 N-Queens II
public int totalNQueens(int n) { ArrayList<Integer> res = new ArrayList<>(); res.add(0); help(n, 0, new int[n], res); return res.get(0); } private void help(int n, int row, int[] columnForRow, ArrayList<Integer> res) { if(row==n) { res.set(0,res.get(0)+1); return; } for(int i=0;i<n;i++) { columnForRow[row]=i; if(check(row,columnForRow)) { help(n,row+1,columnForRow,res); } } } private boolean check(int row, int[] columnForRow) { for(int i=0;i<row;i++) { if(columnForRow[i]==columnForRow[row] || Math.abs(columnForRow[row]-columnForRow[i])==row-i) return false; } return true; }
4 77 combinations 分子问题
public List<List<Integer>> combine(int n, int k) { List<List<Integer>> res = new ArrayList<>(); if (n <= 0 || n < k) return res; help(n, k, 1, new ArrayList<Integer>(), res); return res; } public void help(int n, int k, int start, ArrayList<Integer> item, List<List<Integer>> res) { if (item.size() == k) { res.add(new ArrayList<Integer>(item)); return; } for (int i = start; i <= n; i++) { item.add(i); help(n, k, i + 1, item, res); item.remove(item.size() - 1); } }
5 89 Gray Code
public List<Integer> grayCode(int n) { List<Integer> res = new ArrayList<>(); res.add(0); for (int i = 0; i < n; i++) { int size = res.size(); for (int k = size - 1; k >= 0; k--) { res.add(res.get(k)|1<<i); } } return res; }
6 211 Add and search Word
public class WordDictionary { public class TrieNode{ public TrieNode[] children = new TrieNode[26]; public String item = ""; } private TrieNode root = new TrieNode(); /** Initialize your data structure here. */ public WordDictionary() { } /** Adds a word into the data structure. */ public void addWord(String word) { TrieNode node = root; for (char c : word.toCharArray()) { if (node.children[c - 'a'] == null) { node.children[c - 'a'] = new TrieNode(); } node = node.children[c - 'a']; } node.item = word; } /** Returns if the word is in the data structure. A word could contain the dot character '.' to represent any one letter. */ public boolean search(String word) { return match(word.toCharArray(), 0, root); } private boolean match(char[] chs, int k, TrieNode node) { if (k == chs.length) return !node.item.equals(""); if (chs[k] != '.') { return node.children[chs[k] - 'a'] != null && match(chs, k + 1, node.children[chs[k]-'a']); } else { for (int i = 0; i < node.children.length; i++) { if (node.children[i] != null) { if (match(chs, k + 1, node.children[i])) return true; } } } return false; } }
7 212 Word Search II
Set<String> res = new HashSet<>(); public List<String> findWords(char[][] board, String[] words) { Trie trie = new Trie(); for (String str : words) { trie.insert(str); } int m = board.length, n = board[0].length; boolean[][] visited = new boolean[m][n]; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { dfs(board, visited, "", i, j, trie); } } return new ArrayList<String>(res); } public void dfs(char[][] board, boolean[][] visited, int i, int j, String item, Trie trie) { if (x < 0 || x >= board.length || y < 0 || y >= board[0].length) return; if (visited[i][j]) return; item += board[i][j]; if (!trie.startsWith(item)) return; if (trie.search(item)) res.add(item); visited[i][j] = true; dfs(board, visited, i, j - 1, item, trie); dfs(board, visited, i, j + 1, item, trie); dfs(board, visited, i + 1, j, item, trie); dfs(board, visited, i - 1, j, item, trie); visited[i][j] = false; }