1. 二叉树
/** * 102. BinaryTree的层序遍历(借助辅助队列实现,递归法pass) * @param root * @return */ public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> resList = new ArrayList<>(); if (root == null) { return resList; } // 利用辅助队列暂存节点 Queue<TreeNode> que = new LinkedList<>(); que.offer(root); // que不为空说明还没有遍历完整棵二叉树 while (!que.isEmpty()) { // 存储当前出栈的节点,即遍历的当前节点 List<Integer> itemList = new ArrayList<>(); // 保存每一层的节点数量,用来确保遍历n层的节点数量 int len = que.size(); // 本层是否遍历结束 while (len > 0) { TreeNode tmpNode = que.poll(); itemList.add(tmpNode.val); // 保存当前结点的左子树 if (tmpNode.left != null) { que.offer(tmpNode.left); } // 保存当前节点右子树 if (tmpNode.right != null) { que.offer(tmpNode.right); } len--; } resList.add(itemList); } return resList; }
2. 回溯算法
/** * 40. 组合总和 II * @param candidates * @param target * @return */ public List<List<Integer>> combinationSum2(int[] candidates, int target) { // 为了将重复的数字都放到一起,所以先进行排序 Arrays.sort(candidates); // 加标志数组,用来辅助判断同层节点是否已经遍历 boolean[] used = new boolean[candidates.length]; combinationSum2Backtracking(candidates, target, 0, used); return result; } public void combinationSum2Backtracking(int[] candidates, int target, int startIndex, boolean[] used) { if (target == 0) { result.add(new ArrayList<>(path)); return; } for (int i = startIndex; i < candidates.length; i++) { // 出现重复节点,同层的第一个节点已经被访问过,所以直接跳过 if (i > 0 && candidates[i] == candidates[i - 1] && !used[i - 1]) { continue; } // 剪枝 if (target - candidates[i] < 0 ) { break; } used[i] = true; path.add(candidates[i]); // 每个节点仅能选择一次,所以从下一位开始 combinationSum2Backtracking(candidates, target - candidates[i], i + 1, used); used[i] = false; path.removeLast(); } } /** * 39. 组合总和 * @param candidates * @param target * @return */ public List<List<Integer>> combinationSum(int[] candidates, int target) { // 对candidates便于后面剪枝处理 Arrays.sort(candidates); // 一个集合来求组合的话,就需要startIndex;对个集合取组合,且互不影响,则不需要; combinationSumBacktracking(candidates, target, 0); return result; } public void combinationSumBacktracking(int[] candidates, int target, int index) { if (target == 0) { result.add(new ArrayList<>(path)); return; } for (int i = index; i < candidates.length; i++) { // 剪枝,排过序,当前值不行,则后面所有值必定不行 if (target - candidates[i] < 0) { break; } path.add(candidates[i]); combinationSumBacktracking(candidates, target - candidates[i], i); path.removeLast(); } } /** * 17. 电话号码的字母组合 * @param digits * @return */ public List<String> letterCombinations(String digits) { if (digits != null && digits.length() > 0) { // 初始对应所有的数字,为了直接对应2-9,新增了两个无效的字符串"" String[] numString = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; // 迭代处理 letterCombinationsBacktracking(digits, numString, 0); } return restltString; } // 每次迭代获取一个字符串,所以会设计大量的字符串拼接,所以这里选择更为高效的 StringBuild StringBuilder stringBuilder = new StringBuilder(); public void letterCombinationsBacktracking(String digits, String[] numString, Integer index) { // 遍历全部一次记录一次得到的字符串 if (index == digits.length()) { restltString.add(stringBuilder.toString()); return; } // str 表示当前num对应的字符串 String str = numString[digits.charAt(index) - '0']; for (int i = 0; i < str.length(); i++) { stringBuilder.append(str.charAt(i)); letterCombinationsBacktracking(digits, numString, index + 1); // 回滚 stringBuilder.deleteCharAt(stringBuilder.length() - 1); } }
标签:digits,return,target,Days10,二刷,int,candidates,que,Leetcode From: https://www.cnblogs.com/LinxhzZ/p/17474686.html