classSolution{ public List<List<Integer>> subsets(int[] nums) { List<List<Integer>> list = new ArrayList<>(); Arrays.sort(nums); backtrack(list, new ArrayList<>(), nums, 0); return list; }
privatevoidbacktrack(List<List<Integer>> list , List<Integer> tempList, int [] nums, int start){ list.add(new ArrayList<>(tempList)); for(int i = start; i < nums.length; i++){ tempList.add(nums[i]); backtrack(list, tempList, nums, i + 1); tempList.remove(tempList.size() - 1); } } }
leetcode 77. 组合
给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
classSolution{ publicstatic List<List<Integer>> combine(int n, int k) { List<List<Integer>> combs = new ArrayList<List<Integer>>(); combine(combs, new ArrayList<Integer>(), 1, n, k); return combs; } publicstaticvoidcombine(List<List<Integer>> combs, List<Integer> comb, int start, int n, int k){ if(k==comb.size()) { combs.add(new ArrayList<Integer>(comb)); return; } for(int i=start;i<=n;i++) { comb.add(i); combine(combs, comb, i+1, n, k); comb.remove(comb.size()-1); } } }
booleanbacktrack(char[][] board, int i, int j){ int m = 9, n = 9; if (j == n) { // 穷举到最后一列的话就换到下一行重新开始。 return backtrack(board, i + 1, 0); } if (i == m) { // 找到一个可行解,触发 base case returntrue; }
if (board[i][j] != '.') { // 如果有预设数字,不用我们穷举 return backtrack(board, i, j + 1); }
for (char ch = '1'; ch <= '9'; ch++) { // 如果遇到不合法的数字,就跳过 if (!isValid(board, i, j, ch)) continue;
classSolution{ public List<String> generateParenthesis(int n){ List<String> res = new ArrayList<String>(); backtrack(n,n,new StringBuilder(),res); return res; }
publicvoidbacktrack(int left, int right, StringBuilder track,List<String> res){
// 若左括号剩下的多,说明不合法 if (right < left) return; // 数量小于 0 肯定是不合法的 if (left < 0 || right < 0) return; // 当所有括号都恰好用完时,得到一个合法的括号组合 if (left == 0 && right == 0) { res.add(track.toString()); return; } // 尝试放一个左括号 track.append('('); // 选择 backtrack(left - 1, right, track, res); track.deleteCharAt(track.length() - 1); // 撤消选择