Skip to content

Commit 9dad54f

Browse files
committed
Leetcode submissions
1 parent 42df9d6 commit 9dad54f

File tree

239 files changed

+4823
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

239 files changed

+4823
-0
lines changed

132-pattern.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
class Solution:
2+
def find132pattern(self, nums: List[int]) -> bool:
3+
n = len(nums)
4+
if n < 3:
5+
return False
6+
stack = []
7+
k = -1
8+
for i in range(n - 1, -1, -1):
9+
if k > -1 and nums[k] > nums[i]:
10+
return True
11+
while len(stack) > 0 and nums[i] > nums[stack[-1]]:
12+
k = stack.pop()
13+
stack.append(i)
14+
return False
15+
16+
# class Solution:
17+
# def makeSeg(self, arr, i, j):
18+
# seg = self.seg
19+
# if (i, j) in seg:
20+
# return seg[(i, j)]
21+
# if i == j:
22+
# seg[(i, j)] = arr[i]
23+
# return arr[i]
24+
# mid = (i + j) // 2
25+
# curr = max(self.makeSeg(arr, i, mid), self.makeSeg(arr, mid + 1, j))
26+
# seg[(i, j)] = curr
27+
# return curr
28+
29+
# def getMax(self, arr, i, j, ni, nj):
30+
# seg = self.seg
31+
# if ni >= i and nj <= j:
32+
# return seg[(ni, nj)]
33+
# if (ni < i and nj < i) or (ni > j and nj > j):
34+
# return float('-inf')
35+
# mid = (ni + nj) // 2
36+
# return max(self.getMax(arr, i, j, ni, mid), self.getMax(arr, i, j, mid + 1, nj))
37+
38+
# def find132pattern(self, nums: List[int]) -> bool:
39+
# n = len(nums)
40+
# self.seg = {}
41+
# self.makeSeg(nums, 0, n - 1)
42+
# for i in range(n):
43+
# for j in range(i + 2, n):
44+
# if nums[j] > nums[i] and self.getMax(nums, i, j, 0, n - 1) > nums[j]:
45+
# return True
46+
# return False
47+
48+
# class Solution:
49+
# def find132pattern(self, nums: List[int]) -> bool:
50+
# n = len(nums)
51+
# next_lowest = [n for i in range(n)]
52+
# stack = []
53+
# for i in range(n):
54+
# while len(stack) > 0 and nums[i] < nums[stack[-1]]:
55+
# curr = stack.pop()
56+
# next_lowest[curr] = i
57+
# for j in range(curr):
58+
# if nums[j] < nums[i]:
59+
# return True
60+
# stack.append(i)
61+
# return False
62+
63+
# class Solution:
64+
# def find132pattern(self, nums: List[int]) -> bool:
65+
# currMin = float('inf')
66+
# currMax = float('-inf')
67+
# for num in nums:
68+
# currMin = min(currMin, num)
69+
# currMax = max(currMax, num)
70+
# if num > currMin and num < currMax:
71+
# return True
72+
# return False

2-keys-keyboard.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
class Solution:
2+
def minSteps(self, n: int, k = 1, clipboard = 0) -> int:
3+
if k == n:
4+
return 0
5+
if k > n:
6+
return float('inf')
7+
a = float('inf')
8+
if clipboard > 0:
9+
a = 1 + self.minSteps(n, k + clipboard, clipboard)
10+
b = 2 + self.minSteps(n, 2 * k, k)
11+
return min(a, b)

3sum-closest.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution:
2+
def threeSumClosest(self, nums: List[int], target: int) -> int:
3+
n = len(nums)
4+
if n < 3:
5+
return []
6+
nums = [3 * num - target for num in nums]
7+
nums.sort()
8+
closest = float('inf')
9+
for i in range(n - 2):
10+
a = nums[i]
11+
start = i + 1
12+
end = n - 1
13+
while start < end:
14+
b = nums[start]
15+
c = nums[end]
16+
total = a + b + c
17+
if abs(total) < abs(closest):
18+
closest = total
19+
if total > 0:
20+
end -= 1
21+
else:
22+
start += 1
23+
return target + closest // 3

3sum-with-multiplicity.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class Solution:
2+
def threeSumMulti(self, arr: List[int], target: int) -> int:
3+
d = [0] * 300
4+
res = 0
5+
for i, el in enumerate(arr):
6+
res += d[target - el] if target - el >= 0 else 0
7+
for j in range(i):
8+
d[el + arr[j]] += 1
9+
return res % (10 ** 9 + 7)

add-two-numbers-ii.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# Definition for singly-linked list.
2+
# class ListNode:
3+
# def __init__(self, val=0, next=None):
4+
# self.val = val
5+
# self.next = next
6+
class Solution:
7+
def add(self, l1, l2, carry = 0):
8+
if l1 or l2:
9+
l1val = l1.val if l1 else 0
10+
l2val = l2.val if l2 else 0
11+
currval = l1val + l2val + carry
12+
curr = ListNode(val = currval % 10)
13+
curr.next = self.add(l1.next if l1 else None, l2.next if l2 else None, carry = currval // 10)
14+
return curr
15+
else:
16+
if carry > 0:
17+
return ListNode(val = carry)
18+
return None
19+
20+
def reverse(self, head):
21+
curr = head
22+
prev = None
23+
while curr:
24+
nxt = curr.next
25+
curr.next = prev
26+
prev = curr
27+
curr = nxt
28+
return prev
29+
30+
def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
31+
l1 = self.reverse(l1)
32+
l2 = self.reverse(l2)
33+
return self.reverse(self.add(l1, l2, carry = 0))

add-two-numbers.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Definition for singly-linked list.
2+
# class ListNode:
3+
# def __init__(self, val=0, next=None):
4+
# self.val = val
5+
# self.next = next
6+
class Solution:
7+
def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode], carry=0) -> Optional[ListNode]:
8+
if l1 or l2:
9+
l1val = l1.val if l1 else 0
10+
l2val = l2.val if l2 else 0
11+
currval = l1val + l2val + carry
12+
curr = ListNode(val = currval % 10)
13+
curr.next = self.addTwoNumbers(l1.next if l1 else None, l2.next if l2 else None, carry = currval // 10)
14+
return curr
15+
else:
16+
if carry > 0:
17+
return ListNode(val = carry)
18+
return None
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import bisect
2+
3+
class Solution:
4+
def alertNames(self, keyName: List[str], keyTime: List[str]) -> List[str]:
5+
n = len(keyName)
6+
checkins = {}
7+
for i in range(n):
8+
name = keyName[i]
9+
time = keyTime[i]
10+
time = tuple(int(k) for k in time.split(":"))
11+
if name in checkins:
12+
bisect.insort(checkins[name], time)
13+
else:
14+
checkins[name] = [time]
15+
op = []
16+
for name in sorted(checkins.keys()):
17+
m = len(checkins[name])
18+
alert = False
19+
for i in range(m):
20+
curr = checkins[name][i]
21+
j = bisect.bisect_right(checkins[name], (curr[0] + 1, curr[1]))
22+
if j - i >= 3:
23+
alert = True
24+
break
25+
if alert:
26+
op.append(name)
27+
return op
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution:
2+
def getAncestors(self, n: int, edges: List[List[int]]) -> List[List[int]]:
3+
graph = {}
4+
for a, b in edges:
5+
graph[b] = graph.get(b, []) + [a]
6+
op = [[] for i in range(n)]
7+
for a in graph:
8+
visited = set()
9+
paths = [a]
10+
while len(paths) > 0:
11+
curr = paths.pop()
12+
for b in graph.get(curr, []):
13+
if b not in visited:
14+
visited.add(b)
15+
paths.append(b)
16+
op[a] = sorted(visited)
17+
return op

all-possible-full-binary-trees.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode:
3+
# def __init__(self, val=0, left=None, right=None):
4+
# self.val = val
5+
# self.left = left
6+
# self.right = right
7+
class Solution:
8+
def allPossibleFBT(self, n: int) -> List[Optional[TreeNode]]:
9+
trees = []
10+
if n == 1:
11+
return [TreeNode()]
12+
for i in range(1, n, 2):
13+
lefts = self.allPossibleFBT(i)
14+
rights = self.allPossibleFBT(n - i - 1)
15+
for left in lefts:
16+
for right in rights:
17+
root = TreeNode()
18+
root.left = left
19+
root.right = right
20+
trees.append(root)
21+
return trees

append-k-integers-with-minimal-sum.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution:
2+
def minimalKSum(self, nums: List[int], k: int) -> int:
3+
nums.sort()
4+
nums.insert(0, 0)
5+
nums.append(float('inf'))
6+
print(nums)
7+
total = 0
8+
n = len(nums)
9+
for i in range(n - 1):
10+
if k >= nums[i + 1] - nums[i] - 1:
11+
if nums[i + 1] - nums[i] > 1:
12+
total += nums[i + 1] * (nums[i + 1] - 1) // 2
13+
total -= nums[i] * (nums[i] + 1) // 2
14+
k -= nums[i + 1] - nums[i] - 1
15+
else:
16+
end = nums[i] + k
17+
beg = nums[i]
18+
total += end * (end + 1) // 2
19+
total -= beg * (beg + 1) // 2
20+
break
21+
return total

0 commit comments

Comments
 (0)