File tree

6 files changed

+212
-0
lines changed

6 files changed

+212
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
class Solution:
2+
def threeSum(self, nums: List[int]) -> List[List[int]]:
3+
if len(nums) < 3: return []
4+
5+
triplets = []
6+
nums.sort()
7+
8+
for i in range(len(nums)):
9+
if i > 0 and nums[i] == nums[i-1]:
10+
continue
11+
self.twoSum(nums, i+1, -nums[i], triplets)
12+
13+
return triplets
14+
15+
def twoSum(self, nums, l, target, triplets):
16+
r = len(nums) - 1
17+
18+
while l < r:
19+
cur_sum = nums[l] + nums[r]
20+
21+
if cur_sum == target:
22+
triplets.append([-target, nums[l], nums[r]])
23+
l += 1
24+
r -= 1
25+
while l < r and nums[l] == nums[l-1]:
26+
l += 1
27+
while l < r and nums[r] == nums[r+1]:
28+
r -= 1
29+
elif cur_sum > target:
30+
r -= 1
31+
else:
32+
l += 1
33+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
class Solution:
2+
def setZeroes(self, matrix: List[List[int]]) -> None:
3+
"""
4+
Do not return anything, modify matrix in-place instead.
5+
"""
6+
ROWS = len(matrix)
7+
COLS = len(matrix[0])
8+
9+
first_row_zero = False
10+
for col in range(COLS):
11+
if matrix[0][col] == 0:
12+
first_row_zero = True
13+
14+
for row in range(ROWS):
15+
for col in range(COLS):
16+
if matrix[row][col] == 0:
17+
matrix[0][col] = 0
18+
19+
for row in range(1, ROWS):
20+
row_has_zero = False
21+
for col in range(COLS):
22+
if matrix[row][col] == 0:
23+
row_has_zero = True
24+
break
25+
for col in range(COLS):
26+
if row_has_zero or matrix[0][col] == 0:
27+
matrix[row][col] = 0
28+
29+
if first_row_zero:
30+
for col in range(COLS):
31+
matrix[0][col] = 0
32+
33+
class Solution2:
34+
def setZeroes(self, matrix: List[List[int]]) -> None:
35+
"""
36+
Do not return anything, modify matrix in-place instead.
37+
"""
38+
col_has_zero = False
39+
R = len(matrix)
40+
C = len(matrix[0])
41+
42+
for i in range(R):
43+
if matrix[i][0] == 0:
44+
col_has_zero = True
45+
for j in range(1, C):
46+
if matrix[i][j] == 0:
47+
matrix[0][j] = 0
48+
matrix[i][0] = 0
49+
50+
for i in range(1, R):
51+
for j in range(1, C):
52+
if not matrix[i][0] or not matrix[0][j]:
53+
matrix[i][j] = 0
54+
55+
if matrix[0][0] == 0:
56+
for j in range(C):
57+
matrix[0][j] = 0
58+
59+
if col_has_zero:
60+
for i in range(R):
61+
matrix[i][0] = 0
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from collections import defaultdict
2+
3+
class Solution:
4+
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
5+
groups = defaultdict(list)
6+
7+
for word in strs:
8+
key = ''.join(sorted(word))
9+
groups[key].append(word)
10+
11+
return groups.values()
12+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
class Solution:
2+
def lengthOfLongestSubstring(self, s: str) -> int:
3+
char_idx = {}
4+
max_len = 0
5+
l = 0
6+
7+
for r in range(len(s)):
8+
char = s[r]
9+
10+
if char in char_idx:
11+
l = max(l, char_idx[char] + 1)
12+
13+
char_idx[char] = r
14+
max_len = max(max_len, r - l + 1)
15+
16+
return max_len
17+
18+
class Solution2:
19+
def lengthOfLongestSubstring(self, s: str) -> int:
20+
if len(s) == 0: return 0
21+
22+
seen = {}
23+
l = max_len = 0
24+
25+
for r,val in enumerate(s):
26+
if val in seen and l <= seen[val]:
27+
l = seen[val] + 1
28+
else:
29+
max_len = max(max_len, r - l + 1)
30+
31+
seen[val] = r
32+
33+
return max_len
34+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
class Solution:
2+
def longestPalindrome(self, s: str) -> str:
3+
n = len(s)
4+
l, r = 0, 0 # start and end index of current longest substring
5+
dp = [[False] * n for _ in range(n)]
6+
7+
# set all 1 letter strings to True
8+
for i in range(n):
9+
dp[i][i] = True
10+
11+
# set 2 letter palindromes
12+
for i in range(n - 1):
13+
if s[i] == s[i + 1]:
14+
dp[i][i + 1] = True
15+
if l == 0 and r == 0:
16+
l, r = i, i + 1
17+
18+
# set 3+ letter palindromes
19+
for i in range(2, n):
20+
for j in range(n - 2):
21+
k = i + j
22+
# dp matrix boundary check
23+
if k == n:
24+
break
25+
# check if substring is palindrome
26+
# cond 1: first and last letter is same
27+
# cond 2: substring (dp[j + 1][k - 1]) is a palindrome
28+
if s[j] == s[k] and dp[j + 1][k - 1]:
29+
dp[j][k] = True
30+
# set longest substring
31+
# length of substring(j, k) > length of substring(l, r)
32+
if k - j > r - l:
33+
l, r = j, k
34+
35+
return s[l:r + 1]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
class Solution:
2+
def increasingTriplet(self, nums: List[int]) -> bool:
3+
n = len(nums)
4+
5+
left_min = [float('inf')] * n
6+
left_min[0] = nums[0]
7+
right_max = [float('-inf')] * n
8+
right_max[-1] = nums[-1]
9+
10+
for i in range(1, n):
11+
left_min[i] = min(left_min[i-1], nums[i])
12+
13+
for i in range(n-2, -1, -1):
14+
right_max[i] = max(right_max[i+1], nums[i])
15+
16+
for i in range(n):
17+
if left_min[i] < nums[i] < right_max[i]:
18+
return True
19+
20+
return False
21+
22+
class Solution2:
23+
def increasingTriplet(self, nums: List[int]) -> bool:
24+
if len(nums) < 3: return False
25+
26+
first = float('inf')
27+
second = float('inf')
28+
29+
for num in nums:
30+
if num <= first:
31+
first = num
32+
elif num <= second:
33+
second = num
34+
else:
35+
return True
36+
37+
return False

0 commit comments

Comments
 (0)