All my solutions are written in Python3 & Golang. This discussion will be updated gradually as I progress through the list.
The complete list of all Blind 75 problems on LeetCode.
Time Complexity: O(n)
Space Complexity: O(n)
#Python3
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
table = {}
for i, elem in enumerate(nums):
diff = target-elem
if elem in table:
return [table[elem], i]
else:
table[diff] = i
//Go
func twoSum(nums []int, target int) []int {
table := make(map[int]int)
for i, elem := range nums {
if idx, ok := table[elem]; ok {
return []int{idx, i}
} else {
table[target-elem] = i
}
}
return []int{}
}#Python3
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
p2, p1 = 0, 0
maxi_len = 0
seen = {}
while p2 < len(s):
if s[p2] in seen and seen[s[p2]] == True:
maxi_len = max(maxi_len, p2-p1)
while p1 < p2 and s[p1] != s[p2]:
seen[s[p1]] = False
p1+=1
p1+=1
else:
seen[s[p2]] = True
p2+=1
return max(maxi_len, p2-p1)//Go
func lengthOfLongestSubstring(s string) int {
seen := make(map[byte]bool)
maxi_len := 0
p2, p1 := 0,0
for p2 < len(s) {
if val, ok := seen[s[p2]]; ok && val == true {
maxi_len = max(maxi_len, p2 - p1)
for p1 < p2 && s[p1] != s[p2]{
seen[s[p1]] = false
p1++
}
p1++
} else {
seen[s[p2]] = true
}
p2++
}
return max(maxi_len, p2 - p1)
}#Python3
class Solution:
def longestPalindrome(self, s: str) -> str:
longest_palindrome = s[0]
maxi_len = 1
n = len(s)
#Even length palindromes
for i in range(0, n-1):
j = 0
while i-j >= 0 and i+j+1 < n and s[i-j] == s[i+j+1]:
if 2*(j+1) > maxi_len:
longest_palindrome = s[i-j:i+j+2]
maxi_len = 2*(j+1)
j+=1
#Odd length palindromes
for i in range(0, n-1): #Center idx
j = 1
while i-j >= 0 and i+j < n and s[i-j] == s[i+j]: #See which corner we hit first, left or right
if 2*j + 1 > maxi_len:
longest_palindrome = s[i-j:i+j+1]
maxi_len = 2*j + 1
j+=1
return longest_palindrome#Python3
class Solution:
def maxArea(self, height: List[int]) -> int:
left, right = 0, len(height) - 1
max_area = 0
while left < right:
h = min(height[left], height[right])
w = right - left
if height[left] > height[right]:
right -= 1
else:
left += 1
max_area = max(max_area, h*w)
return max_area//Go
func maxArea(height []int) int {
left, right := 0, len(height) - 1
maxArea := 0
for left < right {
h := min(height[right], height[left])
w := right - left
if height[right] > height[left] {
left++
} else {
right--
}
maxArea = max(maxArea, h*w)
}
return maxArea
}#Python3
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort() # Sort the array to handle duplicates and simplify the solution
res = []
for i in range(len(nums) - 2):
if i > 0 and nums[i] == nums[i - 1]: # Skip duplicates
continue
left = i + 1
right = len(nums) - 1
while left < right:
total = nums[i] + nums[left] + nums[right]
if total == 0:
res.append([nums[i], nums[left], nums[right]])
# Skip duplicates
while left < right and nums[left] == nums[left + 1]:
left += 1
while left < right and nums[right] == nums[right - 1]:
right -= 1
left += 1
right -= 1
elif total < 0:
left += 1
else:
right -= 1
return resRemove Nth Node From End of List
#Python3
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
dummy = ListNode(0)
dummy.next = head
p1 = p2 = dummy
for _ in range(n + 1):
p2 = p2.next
while p2:
p1 = p1.next
p2 = p2.next
p1.next = p1.next.next
return dummy.next//Go
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func removeNthFromEnd(head *ListNode, n int) *ListNode {
dummy := &ListNode{Val: 0, Next: head}
p1, p2 := dummy, dummy
for i := 0; i < n+1; i++ {
p2 = p2.Next
}
for p2 != nil {
p2 = p2.Next
p1 = p1.Next
}
p1.Next = p1.Next.Next
return dummy.Next
}#Python3
class Solution:
def isValid(self, s: str) -> bool:
mapping = {'{': '}', '[': ']', '(': ')'}
queue = deque()
for bracket in s:
if bracket in mapping:
queue.append(bracket)
elif len(queue) == 0 or mapping[queue.pop()] != bracket:
return False
return True if len(queue) == 0 else False//Go
func isValid(s string) bool {
mapping := map[rune]rune{
'(': ')',
'{': '}',
'[': ']',
}
stack := make([]rune, 0)
for _, bracket := range s {
switch bracket {
case '(', '{', '[':
stack = append(stack, bracket)
case ')', '}', ']':
if len(stack) == 0 || mapping[stack[len(stack)-1]] != bracket {
return false
}
stack = stack[:len(stack)-1]
default:
// Ignore non-bracket characters
}
}
return len(stack) == 0
}
Time Complexity: O(n)
Space Complexity: O(1)
#Python3
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
curr = list3 = ListNode()
while list1 and list2:
if list1.val <= list2.val:
curr.next = list1
list1 = list1.next
else:
curr.next = list2
list2 = list2.next
curr = curr.next
if list1 or list2:
curr.next = list1 if list1 else list2
return list3.next//Go
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
list3 := new(ListNode)
curr := list3
for list1 != nil && list2 != nil {
if list1.Val < list2.Val {
curr.Next = list1
list1 = list1.Next
} else {
curr.Next = list2
list2 = list2.Next
}
curr = curr.Next
}
if list1 != nil {
curr.Next = list1
} else if list2 != nil {
curr.Next = list2
}
return list3.Next
}#Python3
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
def merge(left, right):
if not left: return right
if not right: return left
dummy = curr = ListNode()
while left and right:
if left.val < right.val:
curr.next = left
left = left.next
else:
curr.next = right
right = right.next
curr = curr.next
curr.next = left if left else right
return dummy.next
if len(lists) == 1: return lists[0]
if len(lists) == 0: return None
mid = len(lists) // 2
left = self.mergeKLists(lists[:mid])
right = self.mergeKLists(lists[mid:])
return merge(left, right)Search in Rotated Sorted Array
Note: The Python3 solution is a more intuitive solution that more or less displays how the Golang solution functions
#Python3
class Solution:
def search(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) - 1
pivot = 0
if len(nums) == 1:
return 0 if nums[0] == target else -1
while left <= right:
mid = left + (right - left) // 2
if nums[mid] < nums[mid-1]:
pivot = mid
break
elif nums[left] < nums[left-1]:
pivot = left
break
elif nums[right] < nums[right-1]:
pivot = right
break
if nums[mid] >= nums[left]: #Pivot idx is to the right
left = mid + 1
else: #Pivot idx is to the left
right = mid - 1
left, right = 0, pivot - 1
while left <= right:
mid = left + (right-left) // 2
if nums[mid] == target:
return mid
elif nums[mid] > target:
right = mid - 1
else:
left = mid + 1
left, right = pivot, len(nums) - 1
while left <= right:
mid = left + (right-left)//2
if nums[mid] == target:
return mid
elif nums[mid] > target:
right = mid -1
else:
left = mid + 1
return -1//Go
func search(nums []int, target int) int {
left, right := 0, len(nums) - 1
for left <= right {
mid := left + int((right - left) / 2)
if nums[mid] == target {
return mid
}
if nums[mid] > nums[right] {
if nums[left] <= target && target < nums[mid] {
right = mid - 1
} else {
left = mid + 1
}
} else {
if nums[mid] < target && target <= nums[right] {
left = mid + 1
} else {
right = mid - 1
}
}
}
return -1
}#Python3
class Solution:
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
def backtrack(start, target, path):
if target == 0:
result.append(path)
return
if target < 0:
return
for i in range(start, len(candidates)):
backtrack(i, target - candidates[i], path + [candidates[i]])
result = []
candidates.sort()
backtrack(0, target, [])
return result#Python3
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
#Transpose
n = len(matrix)
for i in range(n):
for j in range(i):
matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
#Swap columns
for i in range(n):
matrix[i] = matrix[i][::-1]//Go
func reverse(array []int) []int {
m := len(array)
for i := 0; i < m/2; i++ {
array[i], array[m-i-1] = array[m-i-1], array[i]
}
return array
}
func rotate(matrix [][]int) {
n := len(matrix)
for i := 0; i < n; i++ {
for j := 0; j < i; j++ {
matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
}
}
for i := 0; i < n; i++ {
matrix[i] = reverse(matrix[i])
}
}#Python3
class Solution:
def groupAnagrams(self, strs: List[str]) -> List[List[str]]:
mapper = {}
for string in strs:
sorted_str = str(sorted(string))
if sorted_str in mapper:
mapper[sorted_str].append(string)
else:
mapper[sorted_str] = [string]
return list(mapper.values())