diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 207e055..09733f1 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,9 +2,10 @@ - - + + + - + - - - + + + - - - @@ -210,7 +211,8 @@ - + + 1580045439607 @@ -254,7 +256,14 @@ - @@ -267,76 +276,77 @@ - - + - + - + - - - + + + - - - + + + - - - + + + - - - - + + + + - + - - + + - + - - + + - + - - + + - + - + - - + + - + - + - + \ No newline at end of file diff --git a/src/q236/Solution.java b/src/q236/Solution.java index 110b063..e1751ab 100644 --- a/src/q236/Solution.java +++ b/src/q236/Solution.java @@ -1,7 +1,7 @@ package q236; /** - * LCA二叉树的最近公共祖先(递归) + * LCA二叉树的最近公共祖先(递归)o(n) */ class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { diff --git a/src/q46/f1/Solution.java b/src/q46/f1/Solution.java new file mode 100644 index 0000000..d70377e --- /dev/null +++ b/src/q46/f1/Solution.java @@ -0,0 +1,41 @@ +package q46.f1; + +import java.util.ArrayList; +import java.util.List; + +/** + * 插队法 o((n-1)!+(n-2)!+···+2!+1!) + */ +public class Solution { + public List> fc(List> nums, int c) { + List> result = new ArrayList<>(); + for (int i = 0; i < nums.size(); i++) { + for (int j = 0; j <= nums.get(i).size(); j++) { + List temp = new ArrayList<>(nums.get(i)); + temp.add(j, c); + result.add(temp); + } + } + return result; + } + + public List> permute(int[] nums) { + List> result = new ArrayList<>(); + if (nums.length == 0) { + return result; + } + List to = new ArrayList<>(); + to.add(nums[0]); + result.add(to); + for (int i = 1; i < nums.length; i++) { + result = fc(result, nums[i]); + } + System.out.println(result); + return result; + } + + public static void main(String[] args) { + new Solution().permute(new int[]{1, 2, 3}); + //4—>3!+2!+1! + } +} diff --git a/src/q46/f2/Solution.java b/src/q46/f2/Solution.java new file mode 100644 index 0000000..7849f3a --- /dev/null +++ b/src/q46/f2/Solution.java @@ -0,0 +1,52 @@ +package q46.f2; + +import java.util.ArrayList; +import java.util.List; + +/** + * 回溯法(DFS深度优先遍历) o(n*n!) + */ +public class Solution { + + public List> permute(int[] nums) { + int len = nums.length; + + List> res = new ArrayList<>(); + + if (len == 0) { + return res; + } + + boolean[] used = new boolean[len]; + List path = new ArrayList<>(); + + dfs(nums, len, 0, path, used, res); + return res; + } + + private void dfs(int[] nums, int len, int depth, + List path, boolean[] used, + List> res) { + if (depth == len) { + res.add(new ArrayList<>(path)); + return; + } + + for (int i = 0; i < len; i++) { + if (!used[i]) { + path.add(nums[i]); + used[i] = true; + dfs(nums, len, depth + 1, path, used, res); + // 状态重置,是从深层结点回到浅层结点的过程,代码在形式上和递归之前是对称的 + used[i] = false; + path.remove(depth); + } + } + } + + public static void main(String[] args) { + int[] nums = {1, 2, 3}; + Solution solution = new Solution(); + List> lists = solution.permute(nums); + } +}