diff --git a/MinStack.java b/MinStack.java new file mode 100644 index 00000000..82ce0789 --- /dev/null +++ b/MinStack.java @@ -0,0 +1,38 @@ +// O(1) time complexity for all operations +// O(n) space complexity + +import java.util.Stack; + +class MinStack { + Stack minStack; + int min; + + public MinStack() { + minStack = new Stack<>(); + min = Integer.MAX_VALUE; + } + + public void push(int val) { + if (val <= min) { + minStack.push(min); // push min + min = val; + } + minStack.push(val); // push val as it tracks curr min + } + + public void pop() { + int popped = minStack.pop(); + if (popped == min) { + min = minStack.pop(); + } + } + + public int top() { + return minStack.peek(); + } + + public int getMin() { + return min; + } +} + diff --git a/MyHashSet.java b/MyHashSet.java new file mode 100644 index 00000000..e1cbd79b --- /dev/null +++ b/MyHashSet.java @@ -0,0 +1,54 @@ +// O(1) time, O(1) space + +class MyHashSet { + + boolean[][] storage; + int primaryBuckets; + int secondaryBuckets; + + public MyHashSet() { + primaryBuckets = 1000; + secondaryBuckets = 1000; + storage = new boolean[primaryBuckets][]; + } + + private int getPrimaryHash(int key) { + return key % primaryBuckets; + } + + private int getSecondaryHash(int key) { + return key / secondaryBuckets; + } + + public void add(int key) { + int primaryHash = getPrimaryHash(key); + if (storage[primaryHash] == null) { + if (primaryHash == 0) { + storage[primaryHash] = new boolean[secondaryBuckets + 1]; + } + else { + storage[primaryHash] = new boolean[secondaryBuckets]; + } + } + int secondaryHash = getSecondaryHash(key); + storage[primaryHash][secondaryHash] = true; + } + + public void remove(int key) { + int primaryHash = getPrimaryHash(key); + if (storage[primaryHash] == null) { + return; + } + int secondaryHash = getSecondaryHash(key); + storage[primaryHash][secondaryHash] = false; + } + + public boolean contains(int key) { + int primaryHash = getPrimaryHash(key); + if (storage[primaryHash] == null) { + return false; + } + int secondaryHash = getSecondaryHash(key); + return storage[primaryHash][secondaryHash]; + } +}