diff --git a/work/1/Medium/Array/380.insert-delete-getrandom-o1.py b/work/1/Medium/Array/380.insert-delete-getrandom-o1.py new file mode 100644 index 0000000..ecbf060 --- /dev/null +++ b/work/1/Medium/Array/380.insert-delete-getrandom-o1.py @@ -0,0 +1,98 @@ +""" +380. Insert Delete GetRandom O(1) +Difficulty: Medium +https://leetcode.com/problems/insert-delete-getrandom-o1/ + +────────────────────────────────────────────────── + +Implement the RandomizedSet class: + + • RandomizedSet() Initializes the RandomizedSet object. + +• bool insert(int val) Inserts an item val into the set if not +present. Returns true if the item was not present, false otherwise. + +• bool remove(int val) Removes an item val from the set if present. +Returns true if the item was present, false otherwise. + +• int getRandom() Returns a random element from the current set of +elements (it's guaranteed that at least one element exists when this +method is called). Each element must have the same probability of +being returned. + +You must implement the functions of the class such that each function +works in average O(1) time complexity. + + + +Example 1: + +Input +["RandomizedSet", "insert", "remove", "insert", "getRandom", +"remove", "insert", "getRandom"] +[[], [1], [2], [2], [], [1], [2], []] +Output +[null, true, false, true, 2, true, false, 2] + +Explanation +RandomizedSet randomizedSet = new RandomizedSet(); +randomizedSet.insert(1); // Inserts 1 to the set. Returns true as 1 +was inserted successfully. +randomizedSet.remove(2); // Returns false as 2 does not exist in the +set. +randomizedSet.insert(2); // Inserts 2 to the set, returns true. Set +now contains [1,2]. +randomizedSet.getRandom(); // getRandom() should return either 1 or 2 +randomly. +randomizedSet.remove(1); // Removes 1 from the set, returns true. Set +now contains [2]. +randomizedSet.insert(2); // 2 was already in the set, so return false. +randomizedSet.getRandom(); // Since 2 is the only number in the set, +getRandom() will always return 2. + + + +Constraints: + + • -2^31 <= val <= 2^31 - 1 + +• At most 2 * 10^5 calls will be made to insert, remove, and +getRandom. + +• There will be at least one element in the data structure when +getRandom is called. +""" + +from random import choice + + +class RandomizedSet: + def __init__(self): + self.list = [] + self.dict = {} + + def insert(self, val: int) -> bool: + if val in self.dict: + return False + self.dict[val] = len(self.list) + self.list.append(val) + return True + + def remove(self, val: int) -> bool: + if val in self.dict: + last, idx = self.list[-1], self.dict[val] + self.list[idx], self.dict[last] = last, idx + self.list.pop() + del self.dict[val] + return True + return False + + def getRandom(self) -> int: + return choice(self.list) + + +# Your RandomizedSet object will be instantiated and called as such: +# obj = RandomizedSet() +# param_1 = obj.insert(val) +# param_2 = obj.remove(val) +# param_3 = obj.getRandom() diff --git a/work/1/Medium/Linked List/82.remove-duplicates-from-sorted-list-ii.py b/work/1/Medium/Linked List/82.remove-duplicates-from-sorted-list-ii.py new file mode 100644 index 0000000..5c79b7c --- /dev/null +++ b/work/1/Medium/Linked List/82.remove-duplicates-from-sorted-list-ii.py @@ -0,0 +1,60 @@ +""" +82. Remove Duplicates from Sorted List II +Difficulty: Medium +https://leetcode.com/problems/remove-duplicates-from-sorted-list-ii/ + +────────────────────────────────────────────────── + +You are given the head of a sorted linked list. + +Delete all nodes that have duplicate numbers, leaving only distinct +numbers from the original list. + +Return the linked list sorted as well. + + + +Example 1: + +Input: head = [1,2,3,3,4,4,5] +Output: [1,2,5] + +Example 2: + +Input: head = [1,1,1,2,3] +Output: [2,3] + + + +Constraints: + + • The number of nodes in the list is in the range [0, 300]. + + • -100 <= Node.val <= 100 + + • The list is guaranteed to be sorted in ascending order. +""" + + +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, val=0, next=None): +# self.val = val +# self.next = next +class Solution: + def deleteDuplicates(self, head: ListNode | None) -> ListNode | None: + sentinel = ListNode(0, head) + pred = sentinel + + while head: + if head.next and head.val == head.next.val: + while head.next and head.val == head.next.val: + head = head.next + + pred.next = head.next + else: + pred = pred.next + + head = head.next + + return sentinel.next diff --git a/work/1/Medium/Linked List/92.reverse-linked-list-ii.py b/work/1/Medium/Linked List/92.reverse-linked-list-ii.py new file mode 100644 index 0000000..40484b2 --- /dev/null +++ b/work/1/Medium/Linked List/92.reverse-linked-list-ii.py @@ -0,0 +1,71 @@ +""" +92. Reverse Linked List II +Difficulty: Medium +https://leetcode.com/problems/reverse-linked-list-ii/ + +────────────────────────────────────────────────── + +Given the head of a singly linked list and two integers left and +right where left <= right, reverse the nodes of the list from position +left to position right, and return the reversed list. + + + +Example 1: + +Input: head = [1,2,3,4,5], left = 2, right = 4 +Output: [1,4,3,2,5] + +Example 2: + +Input: head = [5], left = 1, right = 1 +Output: [5] + + + +Constraints: + + • The number of nodes in the list is n. + + • 1 <= n <= 500 + + • -500 <= Node.val <= 500 + + • 1 <= left <= right <= n + + + +Follow up: Could you do it in one pass? +""" + + +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, val=0, next=None): +# self.val = val +# self.next = next +class Solution: + def reverseBetween( + self, head: ListNode | None, left: int, right: int + ) -> ListNode | None: + cur, prev = head, None + while left > 1: + prev = cur + cur = cur.next + left, right = left - 1, right - 1 + + tail, con = cur, prev + while right: + third = cur.next + cur.next = prev + prev = cur + cur = third + right -= 1 + + if con: + con.next = prev + else: + head = prev + + tail.next = cur + return head