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

+72
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

+11
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

+23
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

+9
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

+33
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

+18
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
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
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

+21
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

+21
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

arithmetic-slices.py

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
class Solution:
2+
def numSlicesEndingHere(self, nums, i, n):
3+
if i in self.cache:
4+
return self.cache[i]
5+
if i < 2:
6+
return 0
7+
if i == 2:
8+
if nums[2] - nums[1] == nums[1] - nums[0]:
9+
self.cache[i] = 1
10+
return 1
11+
self.cache[i] = 0
12+
return 0
13+
if nums[i] - nums[i - 1] == nums[i - 1] - nums[i - 2]:
14+
val = 1 + self.numSlicesEndingHere(nums, i - 1, n)
15+
self.cache[i] = val
16+
return val
17+
self.cache[i] = 0
18+
return 0
19+
20+
def numberOfArithmeticSlices(self, nums: List[int]) -> int:
21+
n = len(nums)
22+
self.cache = {}
23+
ctr = 0
24+
for i in range(n):
25+
ctr += self.numSlicesEndingHere(nums, i, n)
26+
return ctr

asteroid-collision.py

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution:
2+
def asteroidCollision(self, asteroids: List[int]) -> List[int]:
3+
while True:
4+
n = len(asteroids)
5+
stack = []
6+
op = []
7+
for i in range(n):
8+
if asteroids[i] > 0:
9+
stack.append(i)
10+
else:
11+
while len(stack) > 0 and abs(asteroids[stack[-1]]) < abs(asteroids[i]):
12+
stack.pop()
13+
if len(stack) > 0:
14+
if abs(asteroids[stack[-1]]) <= abs(asteroids[i]):
15+
stack.pop()
16+
else:
17+
op.append(i)
18+
op = sorted(stack + op)
19+
op = [asteroids[i] for i in op]
20+
if asteroids == op:
21+
return op
22+
else:
23+
asteroids = op

baseball-game.py

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Solution:
2+
def calPoints(self, ops: List[str]) -> int:
3+
score = [0]
4+
for op in ops:
5+
if op == "+":
6+
score.append(score[-1] + score[-2])
7+
elif op == "C":
8+
score.pop()
9+
elif op == "D":
10+
score.append(score[-1] << 1)
11+
else:
12+
score.append(int(op))
13+
return sum(score)

beautiful-array.py

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
class Solution:
2+
def beautifulArray(self, N):
3+
memo = {1: [1]}
4+
def f(N):
5+
if N not in memo:
6+
odds = f((N+1)//2)
7+
evens = f(N//2)
8+
memo[N] = [2*x-1 for x in odds] + [2*x for x in evens]
9+
return memo[N]
10+
return f(N)

binary-search.py

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Solution:
2+
def search(self, nums: List[int], target: int) -> int:
3+
n = len(nums)
4+
beg = 0
5+
end = n - 1
6+
while beg <= end:
7+
mid = (beg + end) // 2
8+
if nums[mid] == target:
9+
return mid
10+
elif beg == end:
11+
break
12+
elif nums[mid] > target:
13+
end = mid
14+
else:
15+
beg = mid + 1
16+
return -1

binary-tree-maximum-path-sum.py

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
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 pathsum(self, root):
9+
if root:
10+
l = self.pathsum(root.left)
11+
r = self.pathsum(root.right)
12+
self.msum = max(self.msum, root.val, l + root.val, root.val + r, l + root.val + r)
13+
return max(root.val, root.val + l, root.val + r)
14+
return float('-inf')
15+
16+
def maxPathSum(self, root: Optional[TreeNode]) -> int:
17+
self.msum = float('-inf')
18+
self.pathsum(root)
19+
return self.msum

0 commit comments

Comments
 (0)