diff --git a/hashset.py b/hashset.py new file mode 100644 index 00000000..8f81572a --- /dev/null +++ b/hashset.py @@ -0,0 +1,48 @@ +# Uses linked lists to handle hash collisions across 1000 buckets. +# Each bucket has a dummy head node; add/remove/contains traverse the chain at key % 1000. + +# Time Complexity: average per operation O(1) +# Space Complexity: O(n + k) + +""" +@author: chinmayprajapati +""" + +class ListNode: + def __init__(self, key = -1, next = None): + self.key = key + self.next = next + +class MyHashSet: + + def __init__(self): + self.map = [ListNode() for i in range(1000)] + + def hash(self, key): + return key % len(self.map) + + def add(self, key: int) -> None: + current = self.map[self.hash(key)] + while current.next: + if current.next.key == key: + return + current = current.next + current.next = ListNode(key) + + + def remove(self, key: int) -> None: + current = self.map[self.hash(key)] + while current.next: + if current.next.key == key: + current.next = current.next.next + return + current = current.next + + + def contains(self, key: int) -> bool: + current = self.map[self.hash(key)].next + while current: + if current.key == key: + return True + current = current.next + return False diff --git a/minstack.py b/minstack.py new file mode 100644 index 00000000..ddcbaf63 --- /dev/null +++ b/minstack.py @@ -0,0 +1,32 @@ +# Time Complexity: O(1) +# Space Complexity: O(n) +# Two stacks: one for values, one tracking the running min at each push + +""" +@author: chinmayprajapati +""" + +class MinStack: + + def __init__(self): + self.minstack = list() + self.stack = list() + + def push(self, val: int) -> None: + self.stack.append(val) + if not self.minstack: + self.minstack.append(val) + else: + self.minstack.append(min(self.minstack[-1],val)) + + def pop(self) -> None: + self.stack.pop() + self.minstack.pop() + + def top(self) -> int: + return self.stack[-1] + + def getMin(self) -> int: + if self.minstack: + return self.minstack[-1] + \ No newline at end of file