mirror of
https://github.com/prdlk/leetcode.git
synced 2026-11-02 13:12:44 +00:00
feat(work): add LeetCode solutions for problems 380, 82, 92
This commit is contained in:
1 parent
f1a952f2bd
commit
40649c7ef6
3 files changed
+229
No files matched your search
@@ -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()
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in new issue
Block a user