(0918) 集合的所有子集
题目描述
现在有一个没有重复元素的整数集合S,求S的所有子集
注意: - 你给出的子集中的元素必须按升序排列 - 给出的解集中不能出现重复的元素 - 例如:如果S=[1,2,3], 给出的解集应为: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], []]
解法: - 递归,集合每增加一个新元素,先前所有非空子集 + 这些非空子集加入新元素生成的新子集 + 该元素本身形成的集合 - 边界条件:空集合需要包含一个空子集 - 注意:递归时非空子集的运算屏蔽空子集 (continue) ,但每次返回时增加一个空子集。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| import java.util.*;
public class NowCoder_subsets { public static ArrayList<ArrayList<Integer>> subsets(int[] S) { if (S.length == 0) { ArrayList<Integer> empty = new ArrayList<>(); ArrayList<ArrayList<Integer>> result = new ArrayList<>(); result.add(empty); return result; }
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>(); int[] S_m1 = Arrays.copyOfRange(S, 0, S.length - 1); ArrayList<ArrayList<Integer>> result_m1 = subsets(S_m1); for (ArrayList<Integer> subset_m1 : result_m1) { if (subset_m1.size() == 0) continue; result.add(subset_m1); ArrayList<Integer> subset = (ArrayList<Integer>) subset_m1.clone(); subset.add(S[S.length - 1]); Collections.sort(subset); result.add(subset); } ArrayList<Integer> lastDigit = new ArrayList<>(); lastDigit.add(S[S.length - 1]); result.add(lastDigit); ArrayList<Integer> empty = new ArrayList<>(); result.add(empty); return result; }
public static void main(String[] args) { int[] S = { 1 }; ArrayList<ArrayList<Integer>> subset = subsets(S); for (ArrayList<Integer> i : subset) System.out.println(Arrays.toString(i.toArray()));
} }
|
(0919) 二叉树层序遍历
题目描述 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)例如:给定的二叉树是{3,9,20,#,#,15,7},该二叉树层序遍历的结果是
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| import java.util.*;
public class NowCoder_LevelOrder {
public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root) { ArrayList<Integer> width = new ArrayList<>(); ArrayList<ArrayList<Integer>> result = new ArrayList<>(); if (root == null) { return result; } if (root.left == null && root.right == null) { width.add(root.val); result.add(width); return result; } int depth = treeDepth(root); for (int i = 0; i < depth; i++) { result.add(ithlevel(root, i)); } return result; }
public static int treeDepth(TreeNode root) { if (root == null) return 0; return Math.max(treeDepth(root.left), treeDepth(root.right)) + 1; }
public static ArrayList<Integer> ithlevel(TreeNode root, int i) { ArrayList<Integer> width = new ArrayList<>(); if (root == null) return width; if (i == 0) { width.add(root.val); return width; } else { ArrayList<Integer> leftwidth = ithlevel(root.left, i - 1); ArrayList<Integer> rightwidth = ithlevel(root.right, i - 1); for (int val : rightwidth) { leftwidth.add(val); } return leftwidth; } } }
|