Skip to content

Commit 2e4207f

Browse files
committed
week 3
1 parent ce9b46e commit 2e4207f

5 files changed

Lines changed: 143 additions & 0 deletions
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution {
2+
public TreeNode buildTree(int[] preorder, int[] inorder) {
3+
return helper(0, 0, inorder.length - 1, preorder, inorder);
4+
}
5+
6+
private TreeNode helper(int preStart, int inStart, int inEnd, int[] preorder, int[] inorder) {
7+
if (preStart > preorder.length - 1 || inStart > inEnd) {
8+
return null;
9+
}
10+
TreeNode root = new TreeNode(preorder[preStart]);
11+
int inIndex = 0;
12+
for (int i = inStart; i <= inEnd; i++) {
13+
if (inorder[i] == root.val) {
14+
inIndex = i;
15+
}
16+
}
17+
root.left = helper(preStart + 1, inStart, inIndex - 1, preorder, inorder);
18+
root.right = helper(preStart + inIndex - inStart + 1, inIndex + 1, inEnd, preorder, inorder);
19+
return root;
20+
}
21+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
class Solution {
2+
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
3+
// Stack for tree traversal
4+
Deque<TreeNode> stack = new ArrayDeque<>();
5+
stack.push(root);
6+
7+
// HashMap for parent pointers
8+
Map<TreeNode, TreeNode> parents = new HashMap<>();
9+
parents.put(root, null);
10+
11+
// interate until both p and q are found
12+
while (!parents.containsKey(p) || !parents.containsKey(q)) {
13+
TreeNode curr = stack.pop();
14+
if (curr.left != null) {
15+
parents.put(curr.left, curr);
16+
stack.push(curr.left);
17+
}
18+
if (curr.right != null) {
19+
parents.put(curr.right, curr);
20+
stack.push(curr.right);
21+
}
22+
}
23+
24+
// ancestors set for p
25+
Set<TreeNode> ancestors = new HashSet<>();
26+
27+
// traverse all ancestors (upwards) for p using parent pointers
28+
while (p != null) {
29+
ancestors.add(p);
30+
p = parents.get(p);
31+
}
32+
33+
// the first ancestor of q which appears in p's ancestor set is their LCA
34+
while (!ancestors.contains(q)) {
35+
q = parents.get(q);
36+
}
37+
return q;
38+
}
39+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution {
2+
public List<List<Integer>> permute(int[] nums) {
3+
List<List<Integer>> res = new ArrayList<>();
4+
if (nums == null || nums.length == 0) {
5+
return res;
6+
}
7+
helper(res, new ArrayList<>(), nums, 0);
8+
return res;
9+
}
10+
11+
private void helper(List<List<Integer>> res, ArrayList<Integer> list, int[] nums, int pos) {
12+
if (pos == nums.length) {
13+
res.add(new ArrayList(list));
14+
}
15+
for (int i = pos; i < nums.length; i++) {
16+
list.add(nums[i]);
17+
helper(res, list, nums, pos + 1);
18+
list.remove(list.size() - 1);
19+
}
20+
}
21+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
class Solution {
2+
public List<List<Integer>> permuteUnique(int[] nums) {
3+
List<List<Integer>> res = new ArrayList<>();
4+
if (nums == null || nums.length == 0) return res;
5+
Arrays.sort(nums);
6+
helper(res, nums, 0);
7+
return res;
8+
}
9+
public void helper(List<List<Integer>> res, int[] nums, int start) {
10+
if (start == nums.length) {
11+
List<Integer> list = new ArrayList<>();
12+
for (int num : nums) {
13+
list.add(num);
14+
}
15+
res.add(list);
16+
return;
17+
}
18+
19+
for (int i = start; i < nums.length; i++) {
20+
if (isUsed(nums, start, i)) continue;
21+
swap(nums, start, i);
22+
helper(res, nums, start+1);
23+
swap(nums, start, i);
24+
}
25+
}
26+
27+
public void swap(int[] nums, int i, int j) {
28+
int temp = nums[i];
29+
nums[i] = nums[j];
30+
nums[j] = temp;
31+
}
32+
33+
public boolean isUsed(int[] nums, int left, int right) {
34+
for (int i = left; i < right; i++) {
35+
if (nums[i] == nums[right]) {
36+
return true;
37+
}
38+
}
39+
return false;
40+
}
41+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution {
2+
public List<List<Integer>> combine(int n, int k) {
3+
List<List<Integer>> res = new ArrayList<>();
4+
if (n < k || n <= 0 || k <= 0) {
5+
return res;
6+
}
7+
helper(n, k, res, new ArrayList<>(), 1);
8+
return res;
9+
}
10+
11+
private void helper(int n, int k, List<List<Integer>> res, ArrayList<Integer> list, int pos) {
12+
if (list.size() == k) {
13+
res.add(new ArrayList<>(list));
14+
}
15+
for (int i = pos; i <= n; i++) {
16+
list.add(i);
17+
helper(n, k, res, list, i+1);
18+
list.remove(list.size() - 1);
19+
}
20+
}
21+
}

0 commit comments

Comments
 (0)