Skip to content

Commit 0201c6a

Browse files
authored
Leetcode Submissions
1 parent d6207e7 commit 0201c6a

File tree

215 files changed

+9904
-4798
lines changed

Some content is hidden

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

215 files changed

+9904
-4798
lines changed

advantage-shuffle.py

+18-13
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
11
class Solution:
22
def advantageCount(self, nums1: List[int], nums2: List[int]) -> List[int]:
33
n = len(nums1)
4-
seq = sorted(range(n), key = lambda x: nums2[x])
5-
res = [-1] * n
6-
nums1.sort()
7-
i = 0
8-
unused = []
9-
for j in seq:
10-
while i < n and nums1[i] <= nums2[j]:
11-
unused.append(nums1[i])
12-
i += 1
13-
if i < n:
14-
res[j] = nums1[i]
15-
i += 1
4+
a = sorted([(nums1[i], i) for i in range(n)])
5+
b = sorted([(nums2[i], i) for i in range(n)])
6+
beg = 1
7+
end = n
8+
while beg <= end:
9+
mid = (beg + end) // 2
10+
pos = True
11+
for i in range(mid):
12+
if a[-mid + i][0] <= b[i][0]:
13+
pos = False
14+
break
15+
if pos:
16+
beg = mid + 1
1617
else:
17-
res[j] = unused.pop()
18+
end = mid - 1
19+
l = beg - 1
20+
res = [0] * n
21+
for i in range(n):
22+
res[b[i][1]] = a[-l+i][0]
1823
return res

alien-dictionary.py

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
class Solution:
2+
def alienOrder(self, words: List[str]) -> str:
3+
indegree = Counter()
4+
for s in words:
5+
for c in s:
6+
indegree[c] = 0
7+
graph = defaultdict(set)
8+
for i in range(len(words) - 1):
9+
j = 0
10+
while j < len(words[i]) and j < len(words[i + 1]) and words[i][j] == words[i + 1][j]:
11+
j += 1
12+
if j < len(words[i]):
13+
if j == len(words[i + 1]):
14+
return ""
15+
graph[words[i][j]].add(words[i + 1][j])
16+
for a in graph:
17+
for b in graph[a]:
18+
indegree[b] += 1
19+
q = deque()
20+
for c in indegree:
21+
if indegree[c] == 0:
22+
q.appendleft(c)
23+
res = []
24+
while q:
25+
i = q.pop()
26+
res.append(i)
27+
for j in graph[i]:
28+
indegree[j] -= 1
29+
if indegree[j] == 0:
30+
q.appendleft(j)
31+
if len(res) < len(indegree):
32+
return ""
33+
return "".join(res)

allocate-mailboxes.py

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
class Solution:
2+
def minDistance(self, houses: List[int], k: int) -> int:
3+
n = len(houses)
4+
houses.sort()
5+
@lru_cache(maxsize = None)
6+
def dp(i, rem):
7+
if rem < 0:
8+
return float('inf')
9+
if i >= n:
10+
return 0
11+
res = float('inf')
12+
median = i
13+
sv = 2 * houses[i]
14+
lv = 2
15+
s = 0
16+
for j in range(i, n):
17+
lv -= 1
18+
sv -= houses[j]
19+
while median < (i + j) // 2:
20+
median += 1
21+
sv += 2 * houses[median]
22+
lv += 2
23+
cost = houses[median] * lv - sv
24+
res = min(res, cost + dp(j + 1, rem - 1))
25+
return res
26+
return dp(0, k)

best-meeting-point.py

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class Solution:
2+
def minTotalDistance(self, grid: List[List[int]]) -> int:
3+
m = len(grid)
4+
n = len(grid[0])
5+
x = []
6+
y = []
7+
for i in range(m):
8+
for j in range(n):
9+
if grid[i][j] == 1:
10+
x.append(i)
11+
y.append(j)
12+
x.sort()
13+
y.sort()
14+
res = 0
15+
for el in x:
16+
res += abs(el - x[len(x) // 2])
17+
for el in y:
18+
res += abs(el - y[len(y) // 2])
19+
return res

binary-search.py

+10-12
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
class Solution:
2-
def search(self, nums: List[int], target: int) -> int:
2+
def search(self, nums, target):
33
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-
if nums[mid] <= target:
11-
beg = mid + 1
12-
else:
13-
end = mid - 1
14-
return -1
4+
res = -1
5+
for p in range(20, -1, -1):
6+
pw = 1 << p
7+
if res + pw < n and nums[res + pw] < target:
8+
res += pw
9+
res += 1
10+
if res >= n or nums[res] != target:
11+
return -1
12+
return res

binary-subarrays-with-sum.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
class Solution:
22
def numSubarraysWithSum(self, nums: List[int], goal: int) -> int:
3+
n = len(nums)
34
def count(x):
45
res = 0
5-
i = s = 0
6-
for j in range(len(nums)):
6+
i = 0
7+
s = 0
8+
for j in range(n):
79
s += nums[j]
810
while i <= j and s > x:
911
s -= nums[i]
1012
i += 1
11-
res += j - i + 1
13+
res += j - i
1214
return res
1315
return count(goal) - count(goal - 1)

binary-tree-postorder-traversal.py

-6
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,3 @@
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
71
class Solution:
82
def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
93
if not root:
+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
class Solution:
2+
# s[i : j + 1] is palindrome if P[i + j + 2] >= j - i + 1
3+
def manachers(self, s):
4+
T = '#'.join('^{}$'.format(s))
5+
n = len(T)
6+
P = [0] * n
7+
C = R = 0
8+
for i in range(1, n - 1):
9+
if R > i:
10+
P[i] = min(R - i, P[2 * C - i])
11+
while T[i + 1 + P[i]] == T[i - 1 - P[i]]:
12+
P[i] += 1
13+
if i + P[i] > R:
14+
C, R = i, i + P[i]
15+
return P
16+
17+
def findAnswer(self, parent: List[int], s: str) -> List[bool]:
18+
n = len(parent)
19+
graph = [[] for _ in range(n)]
20+
for i in range(1, n):
21+
graph[parent[i]].append(i)
22+
ctr = [0] * n
23+
pos = [0] * n
24+
v = []
25+
def dfs(i):
26+
ctr[i] += 1
27+
for j in sorted(graph[i]):
28+
dfs(j)
29+
ctr[i] += ctr[j]
30+
v.append(s[i])
31+
pos[i] = len(v) - 1
32+
dfs(0)
33+
pal = self.manachers("".join(v))
34+
return [pal[2*pos[i]-ctr[i]+3]>=ctr[i] for i in range(n)]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
class Solution:
2+
def checkTwoChessboards(self, coordinate1: str, coordinate2: str) -> bool:
3+
s = lambda p: (ord(p[0]) - ord('a') + int(p[1]) - 1) % 2
4+
return s(coordinate1) == s(coordinate2)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
class DSU:
2+
def __init__(self, n):
3+
self.parent = list(range(n))
4+
self.size = [1] * n
5+
6+
def find(self, a):
7+
if a == self.parent[a]:
8+
return a
9+
self.parent[a] = self.find(self.parent[a])
10+
return self.parent[a]
11+
12+
def union(self, a, b):
13+
parent_a = self.find(a)
14+
parent_b = self.find(b)
15+
if parent_a != parent_b:
16+
if self.size[parent_a] < self.size[parent_b]:
17+
parent_a, parent_b = parent_b, parent_a
18+
self.parent[parent_b] = parent_a
19+
self.size[parent_a] += self.size[parent_b]
20+
21+
class DistanceLimitedPathsExist:
22+
def __init__(self, n: int, edgeList: List[List[int]]):
23+
graph = [[] for _ in range(n)]
24+
edgeList.sort(key = lambda p: p[2])
25+
dsu = DSU(n)
26+
for u, v, w in edgeList:
27+
if dsu.find(u) != dsu.find(v):
28+
graph[u].append((v, w))
29+
graph[v].append((u, w))
30+
dsu.union(u, v)
31+
LOG = 2
32+
p = 1
33+
while p <= n:
34+
LOG += 1
35+
p *= 2
36+
depth = [0] * n
37+
parent = [[i] * LOG for i in range(n)]
38+
mxedge = [[float('-inf')] * LOG for i in range(n)]
39+
v = [False] * n
40+
for src in range(n):
41+
if v[src]:
42+
continue
43+
stack = [(src, 0, -1)]
44+
while stack:
45+
i, d, p = stack.pop()
46+
depth[i] = d
47+
v[i] = True
48+
for j, w in graph[i]:
49+
if j != p:
50+
parent[j][0] = i
51+
mxedge[j][0] = w
52+
stack.append((j, d + 1, i))
53+
for jump in range(1, LOG):
54+
for i in range(n):
55+
mxedge[i][jump] = max(mxedge[i][jump - 1], mxedge[parent[i][jump - 1]][jump - 1])
56+
parent[i][jump] = parent[parent[i][jump - 1]][jump - 1]
57+
self.dsu = dsu
58+
self.parent = parent
59+
self.mxedge = mxedge
60+
self.depth = depth
61+
self.LOG = LOG
62+
63+
def query(self, p: int, q: int, limit: int) -> bool:
64+
if self.dsu.find(p) != self.dsu.find(q):
65+
return False
66+
bigedge = float('-inf')
67+
if self.depth[p] > self.depth[q]:
68+
p, q = q, p
69+
diff = self.depth[q] - self.depth[p]
70+
jump = 0
71+
while diff:
72+
if diff & 1:
73+
bigedge = max(bigedge, self.mxedge[q][jump])
74+
q = self.parent[q][jump]
75+
diff //= 2
76+
jump += 1
77+
for jump in range(self.LOG - 1, -1, -1):
78+
if self.parent[p][jump] != self.parent[q][jump]:
79+
bigedge = max(bigedge, self.mxedge[p][jump], self.mxedge[q][jump])
80+
p = self.parent[p][jump]
81+
q = self.parent[q][jump]
82+
if p != q:
83+
bigedge = max(bigedge, self.mxedge[p][0], self.mxedge[q][0])
84+
return bigedge < limit

closest-node-to-path-in-tree.py

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
class Solution:
2+
def closestNode(self, n: int, edges: List[List[int]], query: List[List[int]]) -> List[int]:
3+
graph = [[] for _ in range(n)]
4+
for u, v in edges:
5+
graph[u].append(v)
6+
graph[v].append(u)
7+
parent = [-1] * n
8+
depth = [0] * n
9+
stack = [(0, 0, -1)]
10+
while stack:
11+
i, d, p = stack.pop()
12+
parent[i] = p
13+
depth[i] = d
14+
for j in graph[i]:
15+
if j != p:
16+
stack.append((j, d + 1, i))
17+
res = []
18+
for u, v, target in query:
19+
q = deque()
20+
vs = set()
21+
while u != -1 and v != -1 and u != v:
22+
if depth[u] < depth[v]:
23+
u, v = v, u
24+
q.appendleft((u, u))
25+
vs.add(u)
26+
u = parent[u]
27+
if u == v and u != -1:
28+
if u not in vs:
29+
vs.add(u)
30+
q.appendleft((u, u))
31+
while q:
32+
src, i = q.pop()
33+
if i == target:
34+
res.append(src)
35+
break
36+
for j in graph[i]:
37+
if j not in vs:
38+
vs.add(j)
39+
q.appendleft((src, j))
40+
return res
+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class Solution:
2+
def minBitwiseArray(self, nums: List[int]) -> List[int]:
3+
for i in range(len(nums)):
4+
x = nums[i]
5+
b = 0
6+
while nums[i] & (1 << b):
7+
b += 1
8+
if b:
9+
x &= ~(1 << (b - 1))
10+
if x | (x + 1) == nums[i]:
11+
nums[i] = x
12+
else:
13+
nums[i] = -1
14+
return nums
+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class Solution:
2+
def minBitwiseArray(self, nums: List[int]) -> List[int]:
3+
for i in range(len(nums)):
4+
x = nums[i]
5+
b = 0
6+
while nums[i] & (1 << b):
7+
b += 1
8+
if b:
9+
x &= ~(1 << (b - 1))
10+
if x | (x + 1) == nums[i]:
11+
nums[i] = x
12+
else:
13+
nums[i] = -1
14+
return nums

convert-date-to-binary.py

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class Solution:
2+
def convertDateToBinary(self, date: str) -> str:
3+
y, m, d = map(int, date.split("-"))
4+
b = lambda x: "{:0b}".format(x)
5+
return f"{b(y)}-{b(m)}-{b(d)}"

count-and-say.py

+16-6
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)