diff --git a/Problem_1.py b/Problem_1.py new file mode 100644 index 00000000..f562bfdb --- /dev/null +++ b/Problem_1.py @@ -0,0 +1,20 @@ +# https://www.geeksforgeeks.org/dsa/find-the-missing-number-in-a-sorted-array/ +# https://leetcode.com/problems/missing-element-in-sorted-array/description/ + +# Time complexity: O(log n) +# Space complexity: O(1) +# Explanation: Use binary search to find where the difference between two indices changes from 1 to greater than 1 - that's where the number is missing + +class Solution: + def missingElement(self, nums: List[int], k: int) -> int: + n = len(nums) + left, right = 0, n - 1 + + while left < right: + mid = right - (right - left) // 2 + if (nums[mid] - nums[0]) - mid < k: + left = mid + else: + right = mid - 1 + + return nums[0] + k + left diff --git a/Problem_2.py b/Problem_2.py new file mode 100644 index 00000000..8fd57480 --- /dev/null +++ b/Problem_2.py @@ -0,0 +1,65 @@ +# https://www.geeksforgeeks.org/dsa/introduction-to-min-heap-data-structure/ + +class MinHeap: + def __init__(self): + self.heap = [] + + # O(1) + def getMin(self): + if not self.heap: + return None + return self.heap[0] + + # O(log n) + def insert(self, value): + # 1. Add to end + self.heap.append(value) + + # 2. Bubble up + i = len(self.heap) - 1 + + while i > 0: + parent = (i - 1) // 2 + + if self.heap[parent] <= self.heap[i]: + break + + self.heap[parent], self.heap[i] = self.heap[i], self.heap[parent] + i = parent + + # O(log n) + def extractMin(self): + if not self.heap: + return None + + # Only one element + if len(self.heap) == 1: + return self.heap.pop() + + minimum = self.heap[0] + + # Move last element to root + self.heap[0] = self.heap.pop() + + # Bubble down + i = 0 + + while True: + left = 2 * i + 1 + right = 2 * i + 2 + smallest = i + + if left < len(self.heap) and self.heap[left] < self.heap[smallest]: + smallest = left + + if right < len(self.heap) and self.heap[right] < self.heap[smallest]: + smallest = right + + # Heap property satisfied + if smallest == i: + break + + self.heap[i], self.heap[smallest] = self.heap[smallest], self.heap[i] + i = smallest + + return minimum