16 June 2022

Amazon-Tagged Leetcode Questions

In this blog, I will share Amazon-tagged Leetcode questions and my solutions to them. These questions should be a practical guide to understanding what you need to know for an Amazon interview.

Most importantly, we should never memorize the code, but, rather, we should be able to identify patterns that can help us solve all similar problems.

Below are some Amazon-Tagged Leetcode questions for you to familiarize yourself with. Happy coding!😄


• Array & Map

https://leetcode.com/problems/reorder-data-in-log-files/

class Solution:
  def reorderLogFiles(self, logs: List[str]) -> List[str]:
      letter = []
      digit = []
      
      for log in logs:
          idf, content = log.split(" ", 1)
          
          if content[0].isdigit():
              digit.append(log)
          else:
              letter.append(log)
              
      letter.sort(key = lambda x: (x.split(" ", 1)[1], x.split(" ", 1)[0]))
      
      return letter + digit

https://leetcode.com/problems/longest-palindrome/

class Solution:
  def longestPalindrome(self, s: str) -> int:
      lookup = {}
      ans = 0
      for ele in s:
          lookup[ele] = lookup.get(ele, 0) + 1

      for k, v in lookup.items():
          ans += (v - v % 2)
      
      return ans + 1 if ans < len(s) else ans

https://leetcode.com/problems/distribute-candies/

class Solution:
  def distributeCandies(self, candyType: List[int]) -> int:
      s = set()
      
      for x in candyType:
          s.add(x)
              
      return min(len(s), len(candyType) // 2)

https://leetcode.com/problems/minimum-subsequence-in-non-increasing-order/

class Solution:
  def minSubsequence(self, nums: List[int]) -> List[int]:
      ans = []
      t = sum(nums)
      curSum = 0
      
      nums.sort()
      
      for i in range(len(nums) - 1, -1, -1):
          curSum += nums[i]
          
          if curSum > t - curSum:
              for j in range(len(nums) - 1, i - 1, -1):
                  ans.append(nums[j])
              return ans
          
      return ans

https://leetcode.com/problems/number-of-equivalent-domino-pairs/

class Solution:
  def numEquivDominoPairs(self, dominoes: List[List[int]]) -> int:
      ans = 0
      d = {}
      
      for x in dominoes:
          if (x[0], x[1]) in d: 
              ans += d[(x[0], x[1])]
              
          if x[0] != x[1] and (x[1], x[0]) in d:
              ans += d[(x[1], x[0])]
              
          d[(x[0], x[1])] = d.get((x[0], x[1]), 0) + 1
      
      return ans

https://leetcode.com/problems/longest-harmonious-subsequence/

class Solution:
  def findLHS(self, nums: List[int]) -> int:
      d = {}
      
      for num in nums:
          d[num] = d.get(num, 0) + 1
          
      maxN = 0
      
      for k in d.keys():
          if k + 1 in d:
              maxN = max(maxN, d[k] + d[k + 1])
              
      return maxN

https://leetcode.com/problems/count-good-triplets/

class Solution:
  def countGoodTriplets(self, arr: List[int], a: int, b: int, c: int) -> int:
      ans = 0
      n = len(arr)
      for i in range(n):
          for j in range(i + 1, n):
              if abs(arr[i] - arr[j]) > a:
                  continue
              for k in range(j + 1, n):
                  if abs(arr[j] - arr[k]) > b or abs(arr[i] - arr[k]) > c:
                      continue
                  ans += 1
                      
      return ans

https://leetcode.com/problems/maximum-product-of-two-elements-in-an-array/

class Solution:
  def maxProduct(self, nums: List[int]) -> int:
      max1 = 0
      max2 = 0
      
      for num in nums:
          if num >= max1:
              max2 = max1
              max1 = num
          elif num < max1 and num > max2:
              max2 = num
              
      return (max1 - 1) * (max2 - 1)

https://leetcode.com/problems/find-n-unique-integers-sum-up-to-zero/

class Solution:
  def sumZero(self, n: int) -> List[int]:
      ans = [0] * n
      
      for i in range(n // 2):
          ans[i] = i + 1
          ans[n - i - 1] = - (i + 1)
          
      return ans

https://leetcode.com/problems/verifying-an-alien-dictionary/

class Solution:
  def isAlienSorted(self, words: List[str], order: str) -> bool:
      d = {}
      for i in range(26):
          d[order[i]] = i
      
      l = []
      
      for word in words:
          t = list(word)
          for i in range(len(t)):
              t[i] = d[t[i]]
          l.append(t)
          
      for i in range(1, len(l)):
          if l[i - 1] > l[i]:
              return False
          
      return True

https://leetcode.com/problems/path-crossing/

class Solution:
  def isPathCrossing(self, path: str) -> bool:
      x = 0
      y = 0
      vis = {(x, y): 1}

      for c in path:
          if c == 'N':
              x -= 1
          elif c == 'S':
              x += 1
          elif c == 'W':
              y -= 1
          else:
              y += 1
              
          if (x, y) in vis:
              return True
          else:
              vis[(x, y)] = 1
          
      return False

https://leetcode.com/problems/maximum-average-subarray-i/

class Solution:
  def findMaxAverage(self, nums: List[int], k: int) -> float:
      avg = float("-inf")
      total = 0
      l = 0
      
      for r in range(len(nums)):
          total += nums[r]
          
          if (r - l + 1) > k:
              total -= nums[l]
              l += 1
              
          if (r - l + 1) == k:
              avg = max(avg, total / k)
          
      return avg

https://leetcode.com/problems/partition-array-into-three-parts-with-equal-sum/

class Solution:
  def canThreePartsEqualSum(self, arr: List[int]) -> bool:
      target = sum(arr) // 3
      
      sum1 = 0
      for i in range(len(arr)):
          sum1 += arr[i]
          if sum1 == target:
              sum2 = 0
              for j in range(len(arr) - 1, i + 1, -1):
                  sum2 += arr[j]
                  if sum2 == target:
                      if sum(arr) - sum1 - sum2 == target:
                          return True
      return False

https://leetcode.com/problems/assign-cookies/

class Solution:
  def findContentChildren(self, g: List[int], s: List[int]) -> int:
      g.sort()
      s.sort()
      
      ans = 0
      i = 0
      j = 0
      
      while i < len(g) and j < len(s):
          if s[j] >= g[i]:
              ans += 1
              i += 1
              j += 1
          else:
              j += 1
              
      return ans

https://leetcode.com/problems/sort-array-by-parity-ii/

class Solution:
  def sortArrayByParityII(self, nums: List[int]) -> List[int]:
      n = len(nums)
      ans = [0] * n
      
      t = 0
      for num in nums:
          if num % 2 == 0:
              ans[t] = num
              t += 2
              
      t = 1       
      for num in nums:
          if num % 2 != 0:
              ans[t] = num
              t += 2
              
      return ans

https://leetcode.com/problems/find-words-that-can-be-formed-by-characters/

class Solution:
  def countCharacters(self, words: List[str], chars: str) -> int:
      ans = 0
      
      for word in words:
          d = {}
          
          for c in chars:
              d[c] = d.get(c, 0) + 1
              
          t = 0
          for w in word:
              if w in d and d[w] > 0:
                  d[w] -= 1
                  t += 1
              else:
                  t = 0
                  break
          ans += t
      
      return ans

https://leetcode.com/problems/repeated-substring-pattern/

class Solution:
  def repeatedSubstringPattern(self, s: str) -> bool:
      l = s[1:] + s[:-1]
      
      return s in l

https://leetcode.com/problems/kth-missing-positive-number/

class Solution:
  def findKthPositive(self, arr: List[int], k: int) -> int:
      for i in range(len(arr)):
          if arr[i] <= k:
              k += 1
              
      return k

https://leetcode.com/problems/replace-elements-with-greatest-element-on-right-side/

class Solution:
  def replaceElements(self, arr: List[int]) -> List[int]:
      maxN = -1
      
      for i in range(len(arr) - 1, -1, -1):
          t = maxN
          maxN = max(t, arr[i])
          arr[i] = t
          
      return arr

https://leetcode.com/problems/valid-mountain-array/

class Solution:
  def validMountainArray(self, arr: List[int]) -> bool:
      l = 0
      r = len(arr) - 1
      
      while l < r and arr[l] < arr[l + 1]:
              l += 1
      while l < r and arr[r - 1] > arr[r]:
              r -= 1
      
      return l == r and l != 0 and l != len(arr) - 1

https://leetcode.com/problems/can-place-flowers/

class Solution:
  def canPlaceFlowers(self, flowerbed: List[int], n: int) -> bool:
      m = len(flowerbed)
      
      for i in range(m):
          if n > 0 and flowerbed[i] == 0 and (i - 1 < 0 or flowerbed[i - 1] == 0) and (i + 1 >= m or flowerbed[i + 1] == 0):
              flowerbed[i] = 1
              n -= 1
              
      return n == 0

https://leetcode.com/problems/array-partition/

class Solution:
  def arrayPairSum(self, nums: List[int]) -> int:
      ans = 0
      arr = sorted(nums)
      
      for i in range(0, len(arr), 2):
          ans += arr[i]
          
      return ans

https://leetcode.com/problems/build-array-from-permutation/

class Solution:
  def buildArray(self, nums: List[int]) -> List[int]:
      n = len(nums)
      
      for i in range(n):
          nums[i] += 1000 * (nums[nums[i]] % 1000)
          
      for i in range(n):
          nums[i] //= 1000
          
      return nums

https://leetcode.com/problems/pascals-triangle-ii/

class Solution:
  def getRow(self, rowIndex: int) -> List[int]:
      ans = []
      
      for i in range(rowIndex + 1):
          ans.append(1)
          
          for j in range(i - 1, 0, -1):
              ans[j] = ans[j] + ans[j - 1]
              
      return ans

https://leetcode.com/problems/find-pivot-index/

class Solution:
  def pivotIndex(self, nums: List[int]) -> int:
      curSum = 0
      total = sum(nums)
      
      for i in range(len(nums)):
          if curSum == total - nums[i] - curSum:
              return i
          curSum += nums[i]
          
      return -1

https://leetcode.com/problems/longest-word-in-dictionary/

class Solution:
  def longestWord(self, words: List[str]) -> str:
      lookup = set()
      ans = ""
      words.sort()
      
      for word in words:
          if len(word) == 1 or word[:-1] in lookup:
              ans = word if len(word) > len(ans) else ans
              lookup.add(word)
              
      return ans

https://leetcode.com/problems/summary-ranges/

class Solution:
  def summaryRanges(self, nums: List[int]) -> List[str]:
      ans = []
      t = ""
      
      for i in range(len(nums)):
          if i < len(nums) - 1 and nums[i + 1] == nums[i] + 1:
              if t == "":
                  t = str(nums[i]) + "->"
          else:
              ans.append(t + str(nums[i]))
              t = ""
              
      return ans

https://leetcode.com/problems/missing-ranges/

class Solution:
  def findMissingRanges(self, nums: List[int], lower: int, upper: int) -> List[str]:
      def stringify(a, b):
          if a == b:
              return str(a)
          else:
              return str(a) + "->" + str(b)
          
      nums = [lower - 1] + nums + [upper + 1]
      
      ans = []
      
      for i in range(1, len(nums)):
          if nums[i] - nums[i - 1] > 1:
              ans.append(stringify(nums[i - 1] + 1, nums[i] - 1))
      
      return ans

https://leetcode.com/problems/third-maximum-number/

class Solution:
  def thirdMax(self, nums: List[int]) -> int:
      Max1, Max2, Max3 = float("-inf"), float("-inf"), float("-inf")
      
      for num in nums:
          if num > Max1:
              Max3 = Max2
              Max2 = Max1
              Max1 = num
          elif num < Max1 and num > Max2:
              Max3 = Max2
              Max2 = num
          elif num < Max2 and num > Max3:
              Max3 = num
      
      return Max3 if Max3 != float("-inf") else Max1

https://leetcode.com/problems/shortest-word-distance/

class Solution:
  def shortestDistance(self, wordsDict: List[str], word1: str, word2: str) -> int:
      p1 = -1
      p2 = -1
      ans = float("inf")
      
      for i in range(len(wordsDict)):
          if wordsDict[i] == word1:
              p1 = i
          elif wordsDict[i] == word2:
              p2 = i
          if p1 != -1 and p2 != -1:
              ans = min(ans, abs(p2 - p1))
      
      return ans

https://leetcode.com/problems/running-sum-of-1d-array/

class Solution:
  def runningSum(self, nums: List[int]) -> List[int]:

      for i in range(1, len(nums)):
          nums[i] += nums[i - 1]
      
      return nums

https://leetcode.com/problems/find-common-characters/

class Solution:
  def commonChars(self, words: List[str]) -> List[str]:
      lookup = {}
      ans = []
      
      for c in words[0]:
          lookup[c] = lookup.get(c, 0) + 1
      
      for k in lookup:
          for word in words[1:]:
              if k not in word:
                  lookup[k] = 0
              else:
                  lookup[k] = min(word.count(k), lookup[k])
                  
      for k, v in lookup.items():
          if v > 0:
              for i in range(v):
                  ans.append(k)
      
      return ans

https://leetcode.com/problems/squares-of-a-sorted-array/

class Solution:
  def sortedSquares(self, nums: List[int]) -> List[int]:
      p = len(nums) - 1
      ans = [0] * len(nums)
      
      for i in range(len(nums)):
          if nums[i] >= 0:
              p = i
              break

      i = p - 1
      j = p     
      k = 0   
      while i >= 0 and j < len(nums):
          if nums[i] * nums[i] <= nums[j] * nums[j]:
              ans[k] = nums[i] * nums[i]
              i -= 1
          else:
              ans[k] = nums[j] * nums[j]
              j += 1
          k += 1
      
      while i >= 0:
          ans[k] = nums[i] * nums[i]
          i -= 1
          k += 1
          
      while j < len(nums):
          ans[k] = nums[j] * nums[j]
          j += 1
          k += 1
  
      return ans

https://leetcode.com/problems/meeting-rooms/

class Solution:
  def canAttendMeetings(self, intervals: List[List[int]]) -> bool:
      if len(intervals) <= 1:
          return True
      
      intervals.sort()
      
      for i in range(1, len(intervals)):
          if intervals[i][0] < intervals[i - 1][1]:
              return False
          
      return True

https://leetcode.com/problems/isomorphic-strings/

class Solution:
  def isIsomorphic(self, s: str, t: str) -> bool:
      lookup = {}
      tSet = set()
      
      for i in range(len(s)):
          if (s[i] in lookup and lookup[s[i]] != t[i]) or (s[i] not in lookup and t[i] in tSet):
              return False
          lookup[s[i]] = t[i] 
          tSet.add(t[i])
      
      return True

https://leetcode.com/problems/valid-anagram/

class Solution:
  def isAnagram(self, s: str, t: str) -> bool:
      tracker = defaultdict(int)
      
      for c in s:
          tracker[c] += 1

      for c in t:
          tracker[c] -= 1
          
      for x in tracker.values():
          if x != 0:
              return False
      return True

https://leetcode.com/problems/merge-sorted-array/

class Solution:
  def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
      k = m + n - 1
      
      while m > 0 and n > 0:
          if nums1[m - 1] >= nums2[n - 1]:
              nums1[k] = nums1[m - 1]
              m -= 1
          else:
              nums1[k] = nums2[n - 1]
              n -= 1
          
          k -= 1
          
      if n > 0:
          nums1[: n] = nums2[: n]

https://leetcode.com/problems/longest-common-prefix/

class Solution:
  def longestCommonPrefix(self, strs: List[str]) -> str:
      def helper(str1, str2):
          i = 0
          j = 0
          res = ""
          
          while i < len(str1) and j < len(str2):
              if str1[i] != str2[j]:
                  break
              else:
                  res += str1[i]
                  i += 1
                  j += 1
                  
          return res
      
      prefix = strs[0]
      for i in range(1, len(strs)):
          prefix = helper(prefix, strs[i])
          
      return prefix

https://leetcode.com/problems/maximum-units-on-a-truck/

class Solution:
  def maximumUnits(self, boxTypes: List[List[int]], truckSize: int) -> int:
      boxTypes.sort(key = lambda x: x[1], reverse = True)

      ans = 0
      
      for x in boxTypes:
          if truckSize > 0 and truckSize > x[0]:
              truckSize -= x[0]
              ans += x[0] * x[1]
              
          elif truckSize > 0 and truckSize <= x[0]:
              ans += truckSize * x[1]
              return ans

      return ans

https://leetcode.com/problems/pascals-triangle/

class Solution:
  def generate(self, numRows: int) -> List[List[int]]:
      ans = [[1]]
      
      for i in range(1, numRows):
          t = []
          t.append(1)
          
          for j in range(1, i):
              t.append(ans[i - 1][j - 1] + ans[i - 1][j])
              
          t.append(1)
          
          ans.append(t)
      
      return ans

https://leetcode.com/problems/best-time-to-buy-and-sell-stock/

class Solution:
  def maxProfit(self, prices: List[int]) -> int:
      profit = 0
      buy = prices[0]
      
      for price in prices:
          buy = min(buy, price)
          profit = max(profit, price - buy)
          
      return profit

https://leetcode.com/problems/roman-to-integer/

class Solution:
  def romanToInt(self, s: str) -> int:
      lookup = {
          "I": 1,
          "V": 5,
          "X": 10,
          "L": 50,
          "C": 100,
          "D": 500,
          "M": 1000 
      }
      
      ans = 0
      n = len(s)
      maxN = 0
      
      for i in range(n - 1, -1, -1):
          if lookup[s[i]] >= maxN:
              ans += lookup[s[i]]
              maxN = lookup[s[i]]
          else:
              ans -= lookup[s[i]]
              
      return ans

https://leetcode.com/problems/maximum-subarray/

class Solution:
  def maxSubArray(self, nums: List[int]) -> int:
      curSum = 0
      ans = float("-inf")
      
      for num in nums:
          if curSum < 0:
              curSum = num
          else:
              curSum += num
              ans = max(ans, curSum)
      
      return ans

https://leetcode.com/problems/remove-duplicates-from-sorted-array/

class Solution:
  def removeDuplicates(self, nums: List[int]) -> int:
      l = 1
      
      for r in range(1, len(nums)):
          if nums[r] != nums[l - 1]:
              nums[l] = nums[r]
              l += 1
              
      return l

https://leetcode.com/problems/count-binary-substrings/

class Solution:
  def countBinarySubstrings(self, s: str) -> int:
      last = 0
      cnt = 1
      ans = 0
      
      for i in range(1, len(s)):
          if s[i] == s[i - 1]:
              cnt += 1
          else:
              last = cnt
              cnt = 1
              
          if last >= cnt:
              ans += 1
              
      return ans

• Binary Search

https://leetcode.com/problems/sqrtx/

class Solution:
  def mySqrt(self, x: int) -> int:  
      ans = 0
      l = 1
      r = x
      
      while l <= r:
          mid = (l + r) // 2
          
          if mid * mid <= x:
              ans = mid
              l = mid + 1
              
          else:
              r = mid - 1
              
      return ans

https://leetcode.com/problems/find-smallest-letter-greater-than-target/

class Solution:
  def nextGreatestLetter(self, letters: List[str], target: str) -> str:
      l = 0
      r = len(letters)
      
      while l < r:
          mid = (l + r)//2
          
          if letters[mid] <= target:
              l = mid + 1
          else:
              r = mid
              
      return letters[0 if l == len(letters) else l]

https://leetcode.com/problems/arranging-coins/

class Solution:
  def arrangeCoins(self, n: int) -> int:       
      l = 0
      r = n
      
      while l <= r:
          mid = (l + r) // 2
                                                                               
          if mid * (mid + 1) / 2 == n:
              return mid
          
          if mid * (mid + 1) / 2 > n:
              r = mid - 1
              
          else:
              l = mid + 1
              
      return 1 if l == 1 else l - 1

https://leetcode.com/problems/valid-perfect-square/

class Solution:
  def isPerfectSquare(self, num: int) -> bool:        
      l = 1
      r = num
      
      while l < r:
          mid = (l + r) // 2
          
          if mid * mid <= num:
              l = mid + 1
          else:
              r = mid
              
      return True if l == 1 else (l - 1) * (l - 1) == num

https://leetcode.com/problems/search-insert-position/

class Solution:
  def searchInsert(self, nums: List[int], target: int) -> int:
      l = 0
      r = len(nums)
      
      while l < r:
          mid = (l + r) // 2
          
          if nums[mid] >= target:
              r = mid
          else:
              l = mid + 1
              
      return l

https://leetcode.com/problems/peak-index-in-a-mountain-array/

class Solution:
  def peakIndexInMountainArray(self, arr: List[int]) -> int:
      l = 0
      r = len(arr) - 1
      
      while l < r:
          mid = (l + r) // 2
          
          if arr[mid] > arr[mid + 1]:
              r = mid          
          else:
              l = mid + 1
              
      return l

https://leetcode.com/problems/binary-search/

class Solution:
  def search(self, nums: List[int], target: int) -> int:
      l = 0
      r = len(nums)
      
      while l < r:
          mid = (l + r) // 2
          
          if nums[mid] >= target:
              r = mid
          else:
              l = mid + 1
          
      return -1 if l == len(nums) or nums[l] != target else l

• Two Pointers

https://leetcode.com/problems/valid-palindrome-ii/

class Solution:
  def validPalindrome(self, s: str) -> bool:      
      def helper(s, i, j):
          while i < j:
              if s[i] != s[j]:
                  return False
              i += 1
              j -= 1
          return True
      
      
      i = 0
      j = len(s) - 1
      while i < j:
          if s[i] != s[j]:
              return helper(s, i + 1, j) or helper(s, i, j - 1)
          i += 1
          j -= 1
      return True

https://leetcode.com/problems/long-pressed-name/

class Solution:
  def isLongPressedName(self, name: str, typed: str) -> bool:
      i = 0
      j = 0
      n = len(name)
      m = len(typed)
      prei = 0
      prej = 0
      
      while i < n and j < m:
          if name[prei] != typed[prej]:
              return False
          while i < n and name[i] == name[prei]:
              i += 1
          while j < m and typed[j] == typed[prej]:
              j += 1
              
          if j - prej < i - prei:
              return False
          prei = i
          prej = j
          
      return i == n and j == m

https://leetcode.com/problems/di-string-match/

class Solution:
  def diStringMatch(self, s: str) -> List[int]:
      n = len(s)
      l = 0
      r = n
      ans = [0] * (n + 1)
      
      for i in range(n):
          if s[i] == 'I':
              ans[i] = l
              l += 1
          else:
              ans[i] = r
              r -= 1
      ans[n] = l    
      
      return ans

https://leetcode.com/problems/duplicate-zeros/

class Solution:
  def duplicateZeros(self, arr: List[int]) -> None:
      n = len(arr)
      
      l = 0
      r = 0
      while l < n and r < n:
          arr[l] += 10 * (arr[r] % 10)
          if arr[r] % 10 == 0:
              l += 1
          l += 1
          r += 1
          
      for i in range(n):
          arr[i] //= 10
          
      return arr

https://leetcode.com/problems/remove-element/

class Solution:
  def removeElement(self, nums: List[int], val: int) -> int:
      l = 0
      
      for r in range(0, len(nums)):
          if nums[r] != val:
              nums[l] = nums[r]
              l += 1
              
      return l

https://leetcode.com/problems/sort-array-by-parity/

class Solution:
  def sortArrayByParity(self, nums: List[int]) -> List[int]:
      l = 0
      
      for r in range(len(nums)):
          if nums[r] % 2 == 0:
              nums[l], nums[r] = nums[r], nums[l]
              l += 1
              
      return nums

https://leetcode.com/problems/two-sum-less-than-k/

class Solution:
  def twoSumLessThanK(self, nums: List[int], k: int) -> int:
      nums.sort()
      answer = -1
      l = 0
      r = len(nums)-1
      
      while l < r:
          sumNums = nums[l] + nums[r]
          if sumNums < k:
              answer = max(answer, sumNums)
              l += 1
          else:
              r -= 1
              
      return answer

https://leetcode.com/problems/move-zeroes/

class Solution:
  def moveZeroes(self, nums: List[int]) -> None:
      l = 0
      for r in range(len(nums)):
          if nums[r] != 0:
              nums[l], nums[r] = nums[r], nums[l]
              l += 1

• String

https://leetcode.com/problems/robot-return-to-origin/

class Solution:
  def judgeCircle(self, moves: str) -> bool:
      R = 0
      L = 0
      U = 0
      D = 0
      
      for m in moves:
          if m == "R":
              R += 1
          if m == "L":
              L += 1
          if m == "U":
              U += 1
          if m == "D":
              D += 1
              
      return R == L and U == D

https://leetcode.com/problems/increasing-decreasing-string/

class Solution:
  def sortString(self, s: str) -> str:
      arr = [0] * 26
      ans = ''
      for c in s:
          arr[ord(c) - 97] += 1
      
      while len(ans) < len(s):
          for i in range(0, 26):
              if arr[i] > 0:
                  ans += chr(i + 97)
                  arr[i] -= 1
          for i in range(25, -1, -1):
              if arr[i] > 0:
                  ans += chr(i + 97)
                  arr[i] -= 1
                  
      return ans

https://leetcode.com/problems/to-lower-case/

class Solution:
  def toLowerCase(self, s: str) -> str:
      ans = ""
      
      for c in s:
          if c >= 'A' and c <= 'Z':
              ans += chr(ord(c) - ord('A') + ord('a'))
          else:
              ans += c
              
      return ans

• Sliding Window

https://leetcode.com/problems/contains-duplicate-ii/

class Solution:
  def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
      seen = set()
      
      for i in range(len(nums)):
          if i - k - 1 >= 0:
              seen.remove(nums[i - k - 1])
          if nums[i] in seen:
              return True
          seen.add(nums[i])
          
      return False  

https://leetcode.com/problems/diet-plan-performance/

class Solution:
  def dietPlanPerformance(self, calories: List[int], k: int, lower: int, upper: int) -> int:
      points = 0
      running_calories = 0
      
      for i in range(len(calories)):
          running_calories += calories[i]
          
          if i >= k - 1:
              if running_calories < lower:
                  points -= 1
              elif running_calories > upper:
                  points += 1
                  
              running_calories -= calories[i - k + 1]
       
      return points

• Math

https://leetcode.com/problems/x-of-a-kind-in-a-deck-of-cards/

class Solution:
  def hasGroupsSizeX(self, deck: List[int]) -> bool:
      def gcd(a, b):
          return a if b == 0 else gcd(b, a % b)
      
      d = {}
      pre = -1
      for x in deck:
          d[x] = d.get(x, 0) + 1
      
      for k in d:
          if d[k] < 2:
              return False
          if pre != -1 and gcd(d[k], pre) == 1:
              return False
          pre = d[k]
      return True

https://leetcode.com/problems/range-addition-ii/

class Solution:
  def maxCount(self, m: int, n: int, ops: List[List[int]]) -> int:
      r, c = m, n
      
      for op in ops:
          r = min(r, op[0])
          c = min(c, op[1])
          
      return r * c

https://leetcode.com/problems/water-bottles/

class Solution:
  def numWaterBottles(self, numBottles: int, numExchange: int) -> int:
      ans = 0
      carry = 0
      
      while numBottles > 0:
          ans += numBottles
          t = numBottles + carry
          numBottles = t // numExchange
          carry = t % numExchange
          
      return ans

https://leetcode.com/problems/count-substrings-with-only-one-distinct-letter/

class Solution:
  def countLetters(self, s: str) -> int:
      cnt = 1
      curSum = 1
      
      for i in range(1, len(s)):
          if s[i] == s[i - 1]:
              cnt += 1
          else:
              cnt = 1
          curSum += cnt
          
      return curSum

https://leetcode.com/problems/count-square-sum-triples/

class Solution:
  def countTriples(self, n: int) -> int:
      cnt = 0

      for a in range(1, n + 1):
          for b in range(1, n + 1):
              x = (a * a) + (b * b)
              if (sqrt(x) % 1 == 0) and x <= (n * n):
                  cnt += 1
                  
      return cnt

https://leetcode.com/problems/divisor-game/

class Solution:
  def divisorGame(self, n: int) -> bool:
      return n % 2 == 0

https://leetcode.com/problems/nim-game/

class Solution:
  def canWinNim(self, n: int) -> bool:
      return n % 4 != 0

https://leetcode.com/problems/self-dividing-numbers/

class Solution:
  def selfDividingNumbers(self, left: int, right: int) -> List[int]: 
      def helper(num):
          i = num
          
          while i:
              rem = i % 10
              if not rem:
                  return False
              if num % rem != 0:
                  return False
              
              i = i // 10
              
          return True
      
      return [i for i in range(left, right + 1) if helper(i)]

https://leetcode.com/problems/sum-of-all-odd-length-subarrays/

class Solution:
  def sumOddLengthSubarrays(self, arr: List[int]) -> int:
      n = len(arr)
      ans = 0
      
      for i in range(n):
          lcnt = i
          rcnt = n - i - 1
          
          lOdd = (lcnt + 1) // 2
          rOdd = (rcnt + 1) // 2
          
          lEven = lcnt // 2 + 1
          rEven = rcnt // 2 + 1
          
          ans += arr[i] * (lOdd * rOdd + lEven * rEven)
          
      return ans

https://leetcode.com/problems/fair-candy-swap/

class Solution:
  def fairCandySwap(self, aliceSizes: List[int], bobSizes: List[int]) -> List[int]:
      a = 0
      b = 0
      
      s = set()
      
      for x in aliceSizes:
          a += x
      
      for x in bobSizes:
          b += x
          s.add(x)
          
      for x in aliceSizes:
          if (b - a)/2 + x in s:
              return [x, (b - a) // 2 + x]

https://leetcode.com/problems/ugly-number/

class Solution:
  def isUgly(self, n: int) -> bool:
      if n <= 0:
          return False
      
      while n % 5 == 0:
          n /= 5
          
      while n % 3 == 0:
          n /= 3
      
      while n % 2 == 0:
          n /= 2
          
      return n == 1

https://leetcode.com/problems/power-of-three/

class Solution:
  def isPowerOfThree(self, n: int) -> bool:
      if n == 1:
          return True

      if n % 3 == 0 and n != 0:
          return self.isPowerOfThree(n / 3)
      return False

https://leetcode.com/problems/power-of-four/

class Solution:
  def isPowerOfFour(self, n: int) -> bool:
      if n == 1:
          return True
      
      if n % 4 == 0 and n != 0:
          return self.isPowerOfFour(n / 4)
      return False

https://leetcode.com/problems/perfect-number/

class Solution:
  def checkPerfectNumber(self, num: int) -> bool:
      curSum = 1
      
      if num <= 1:
          return False
      
      for i in range(2, int(sqrt(num)) + 1):
          if num % i == 0:
              if i == num // i:
                  curSum += i
              else:
                  curSum += i + num // i
                  
      return curSum == num

https://leetcode.com/problems/minimum-moves-to-equal-array-elements/

class Solution:
  def minMoves(self, nums: List[int]) -> int:
      m = min(nums)
      
      ans = 0
      for num in nums:
          ans += num - m
          
      return ans

https://leetcode.com/problems/count-odd-numbers-in-an-interval-range/

class Solution:
  def countOdds(self, low: int, high: int) -> int:
      ans = (high - low + 1) // 2
      
      if high % 2 == 1 and low % 2 == 1:
          ans += 1
          
      return ans

https://leetcode.com/problems/minimum-time-visiting-all-points/

class Solution:
  def minTimeToVisitAllPoints(self, points: List[List[int]]) -> int:
      ans = 0
      
      for i in range(1, len(points)):
          ans += max(abs(points[i][0] - points[i - 1][0]), abs(points[i][1] - points[i - 1][1]))
          
      return ans

https://leetcode.com/problems/palindrome-number/

class Solution:
  def isPalindrome(self, x: int) -> bool:
      if x < 0:
          return False
      
      y = 0
      t = x
      
      while t > 0:
          y = y * 10 + t % 10
          t = t // 10
          
      return x == y

https://leetcode.com/problems/greatest-common-divisor-of-strings/

class Solution:
  def gcdOfStrings(self, str1: str, str2: str) -> str:      
      if str1 + str2 != str2 + str1:
          return ""
      
      def gcd(a, b):
          return a if b == 0 else gcd(b, a % b)
      
      return str1[0: gcd(len(str1), len(str2))]

https://leetcode.com/problems/add-digits/

class Solution:
  def addDigits(self, num: int) -> int:
      while num > 9:
          s = 0
          
          while num > 0:
              s += num % 10
              num //= 10
              
          num = s
          
      return num

https://leetcode.com/problems/excel-sheet-column-title/

class Solution:
  def convertToTitle(self, columnNumber: int) -> str:
      ans = ''
      
      while columnNumber > 0:
          columnNumber -= 1
          ans += chr(columnNumber % 26 + 65)
          columnNumber = columnNumber // 26
          
      return ans[::-1]

https://leetcode.com/problems/number-of-days-between-two-dates/

class Solution:
  def daysBetweenDates(self, date1: str, date2: str) -> int:      
      def cal(s):
          total = 0
          y = int(s[:4])
          m = int(s[5:7])
          d = int(s[8:10])
          
          for i in range(1971, y):
              if i % 400 == 0 or (i % 4 == 0 and i % 100 != 0):
                  total += 366
              else:
                  total += 365
                  
          month = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]     
          
          for j in range(1, m):
              total += month[j]
              if j == 2 and (y % 400 == 0 or (y % 4 == 0 and y % 100 != 0)):
                  total += 1
                  
          return total + d
      
      return abs(cal(date1) - cal(date2))

https://leetcode.com/problems/excel-sheet-column-number/

class Solution:
  def titleToNumber(self, columnTitle: str) -> int:
      ans = 0
      for i in range(len(columnTitle)):

          ans = ans * 26 + ord(columnTitle[i]) - ord('A') + 1
          
      return ans

https://leetcode.com/problems/rectangle-overlap/

class Solution:
  def isRectangleOverlap(self, rec1: List[int], rec2: List[int]) -> bool:
      a1, b1, a2, b2 = rec1[0], rec1[1], rec1[2], rec1[3]
      x1, y1, x2, y2 = rec2[0], rec2[1], rec2[2], rec2[3]
      
      return not (a2 <= x1 or x2 <= a1 or b2 <= y1 or y2 <= b1)

https://leetcode.com/problems/maximum-product-of-three-numbers/

class Solution:
  def maximumProduct(self, nums: List[int]) -> int:
      ans = 0
      nums.sort()
      n = len(nums) - 1
      
      ans = max((nums[n - 2] * nums[n - 1] * nums[n]), (nums[0] * nums[1] * nums[-1]))
      return ans

https://leetcode.com/problems/plus-one/

class Solution:
  def plusOne(self, digits: List[int]) -> List[int]:
      n = len(digits)
      ans = []
      carry = 0
      for i in range(n - 1, -1, -1):
          cur = carry + digits[i] + (1 if i == n - 1 else 0)
          
          ans.append(cur % 10)
          carry = cur // 10
      
      if carry > 0:
          ans.append(1)
          
      return ans[::-1]

https://leetcode.com/problems/add-strings/

class Solution:
  def addStrings(self, num1: str, num2: str) -> str:
      n = len(num1) - 1
      m = len(num2) - 1
      
      carry = 0
      val = 0
      ans = ""
      
      while n >= 0 or m >= 0:
          val = carry
          if n >= 0:
              val += int(num1[n])
              n -= 1
              
          if m >= 0:
              val += int(num2[m])
              m -= 1
              
          ans += str(val % 10)
          carry = val // 10
       
      if carry > 0:
          ans += str(carry)
          
      return ans[::-1]

https://leetcode.com/problems/happy-number/

class Solution:
  def isHappy(self, n: int) -> bool:
      
      def cal(n):
          ans = 0
          while n > 0:
              ans += (n % 10) * (n % 10)
              n = n // 10
          return ans
      
      s = n 
      f = n
      
      while f != 1 and cal(f) != 1:
          s = cal(s)
          f = cal(cal(f))
          
          if s == f:
              return False
      return True
         
      return cal(n)

• Bit Manipulation

https://leetcode.com/problems/missing-number/

class Solution:
  def missingNumber(self, nums: List[int]) -> int:
      n = len(nums)
      
      t = 0        
      for i in range(1, n + 1):
          t ^= i
          t ^= nums[i - 1]
          
      return t    

https://leetcode.com/problems/complement-of-base-10-integer/

class Solution:
  def bitwiseComplement(self, n: int) -> int:
      if n == 0:
          return 1
      
      x = 1
      while x <= n:
          x <<= 1
          
      return (x - 1) ^ n

https://leetcode.com/problems/binary-watch/

class Solution:
  def readBinaryWatch(self, turnedOn: int) -> List[str]:
      ans = []
      
      for i in range(12):
          for j in range(60):
              if (bin(i) + bin(j)).count('1') == turnedOn:
                  ans.append(str(i) + ':' + ('0' if j < 10 else '') + str(j))
                  
      return ans

https://leetcode.com/problems/number-complement/

class Solution:
  def findComplement(self, num: int) -> int:
      p = 0
      ans = 0
      
      while num > 0:
          ans += (1 - (num & 1)) * (2 ** p)
          p += 1
          num >>= 1
      
      return ans  

https://leetcode.com/problems/prime-number-of-set-bits-in-binary-representation/

class Solution:
  def countPrimeSetBits(self, left: int, right: int) -> int:
      prime = [0] * 35
      prime[1] = 1
      
      for i in range(2, 32):
          if prime[i] == 0:
              for j in range(i + i, 33, i):
                  prime[j] = 1
      
      cnt = 0
      for i in range(left, right + 1):
          if prime[bin(i).count('1')] == 0:
              cnt += 1
              
      return cnt

https://leetcode.com/problems/sort-integers-by-the-number-of-1-bits/

class Solution:
  def sortByBits(self, arr: List[int]) -> List[int]:
      return sorted(arr, key = lambda x: (bin(x).count('1'), x))

https://leetcode.com/problems/find-the-difference/

class Solution:
  def findTheDifference(self, s: str, t: str) -> str:
      ans = 0
      
      for c in s:
          ans ^= ord(c)
      
      for c in t:
          ans ^= ord(c)
          
      return chr(ans)

https://leetcode.com/problems/hamming-distance/

class Solution:
  def hammingDistance(self, x: int, y: int) -> int:
      cnt = 0
      
      while x > 0 or y > 0:
          if (x & 1) != (y & 1):
              cnt += 1
          x >>= 1
          y >>= 1
          
      return cnt

https://leetcode.com/problems/number-of-1-bits/

class Solution:
  def hammingWeight(self, n: int) -> int:
      cnt = 0
      
      while n:
          
          if n & 1 > 0:
              cnt += 1
              
          n = n >> 1  
      
      return cnt

https://leetcode.com/problems/counting-bits/

class Solution:
  def countBits(self, n: int) -> List[int]:
      ans = [0] * (n + 1)
      
      for i in range(1, n + 1):
          ans[i] = ans[i >> 1] + (i & 1)
      
      return ans

https://leetcode.com/problems/reverse-bits/

class Solution:
  def reverseBits(self, n: int) -> int:
      ans = 0
      
      for _ in range(32):
          
          ans <<= 1
          ans |= n & 1
          n >>= 1
          
      return ans

https://leetcode.com/problems/convert-a-number-to-hexadecimal/

class Solution:
  def toHex(self, num: int) -> str:
      s = "0123456789abcdef"      
      ans = ""
      
      if num == 0:
          return "0"
      elif num < 0:
          num += 2**32 
      while num > 0:
          ans += s[num % 16]
          num >>= 4
          
      return ans[::-1]

https://leetcode.com/problems/power-of-two/

class Solution:
  def isPowerOfTwo(self, n: int) -> bool:
      return n > 0 and n & (n-1) == 0

https://leetcode.com/problems/1-bit-and-2-bit-characters/

class Solution:
  def isOneBitCharacter(self, bits: List[int]) -> bool:
      i = 0
      
      while i < len(bits) - 1:
          i += bits[i] + 1
          
      return i == len(bits) - 1

https://leetcode.com/problems/add-binary/

class Solution:
  def addBinary(self, a: str, b: str) -> str:
      m = len(a) - 1
      n = len(b) - 1
      ans = ""
      val = 0
      carry = 0
      
      while m >= 0 or n >= 0:
          val = carry
          
          if m >= 0:
              val += int(a[m]) 
              m -= 1
              
          if n >= 0:
              val += int(b[n])
              n -= 1
          
          ans += str(val % 2)
          carry = val // 2
          
      if carry != 0:
          ans += str(carry)
      
      return ans[::-1]

https://leetcode.com/problems/single-number/

class Solution:
  def singleNumber(self, nums: List[int]) -> int:
      ans = 0
      
      for num in nums:
          ans ^= num
          
      return ans 

• Queue

https://leetcode.com/problems/moving-average-from-data-stream/

class MovingAverage:
  def __init__(self, size: int):
      self.q = deque()
      self.size = size

  def next(self, val: int) -> float:
      if len(self.q) < self.size:
          self.q.append(val)
      else:
          self.q.popleft()
          self.q.append(val)
          
      return sum(self.q)/len(self.q)

• Stack

https://leetcode.com/problems/valid-parentheses/

class Solution:
  def isValid(self, s: str) -> bool:
      stack = []
      
      lookup = {
          ")": "(",
          "}": "{",
          "]": "["
      }
      
      for c in s:
          if c in lookup:
              if len(stack) > 0 and stack[-1] == lookup[c]:
                  stack.pop()
              else:
                  return False
          else:
              stack.append(c)
              
      return len(stack) == 0

https://leetcode.com/problems/final-prices-with-a-special-discount-in-a-shop/

class Solution:
  def finalPrices(self, prices: List[int]) -> List[int]:
      stack = []

      for i in range(len(prices)):
          while len(stack) > 0 and prices[stack[-1]] >= prices[i]:
              k = stack.pop()
              prices[k] = prices[k] - prices[i]
          
          stack.append(i)
          
      return prices

https://leetcode.com/problems/backspace-string-compare/

class Solution:
  def backspaceCompare(self, s: str, t: str) -> bool:
      stack_s = []
      stack_t = []
      
      for i in range(len(s)):
          if s[i] == "#":
              if len(stack_s) > 0:
                  stack_s.pop()
          else:
              stack_s.append(s[i])
              
      for i in range(len(t)):
          if t[i] == "#":
              if len(stack_t) > 0:
                  stack_t.pop()
          else:
              stack_t.append(t[i])
          
      return stack_s == stack_t

https://leetcode.com/problems/remove-all-adjacent-duplicates-in-string/

class Solution:
  def removeDuplicates(self, s: str) -> str:
      stack = []
      
      for i in range(len(s)):
          if len(stack) > 0 and stack[-1] == s[i]:
              stack.pop()
          else:
              stack.append(s[i])
          
      return "".join(stack)

https://leetcode.com/problems/baseball-game/

class Solution:
  def calPoints(self, ops: List[str]) -> int:
      stack = []
      ans = 0
      
      for i in range(len(ops)):
          if ops[i] == "C":
              stack.pop()
          elif ops[i] == "D":
              stack.append(stack[-1] * 2)
          elif ops[i] == "+":
              stack.append(stack[-1] + stack[-2])
          else:
              stack.append(int(ops[i]))
              
      for num in stack:
          ans += num
          
      return ans

https://leetcode.com/problems/next-greater-element-i/

class Solution:
  def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
      lookup = {}
      stack = []
      ans = []
      
      for i in range(len(nums2)):
          while len(stack) > 0 and stack[-1] < nums2[i]:
              lookup[stack.pop()] = nums2[i] 
          stack.append(nums2[i])
          
      for num in nums1:
          if num in lookup:
              ans.append(lookup[num])
          else:
              ans.append(-1)
      
      return ans

https://leetcode.com/problems/min-stack/

class MinStack:

  def __init__(self):
      self.stack = []
      self.minStack = []

  def push(self, val: int) -> None:
      self.stack.append(val)
      if len(self.minStack) == 0 or val <= self.minStack[-1]:
          self.minStack.append(val)

  def pop(self) -> None:
      k = self.stack.pop()
      if self.minStack[-1] == k:
          self.minStack.pop()        

  def top(self) -> int:
      return self.stack[-1]

  def getMin(self) -> int:
      return self.minStack[-1]

• Greedy

https://leetcode.com/problems/minimum-cost-to-move-chips-to-the-same-position/

class Solution:
  def minCostToMoveChips(self, position: List[int]) -> int:
      odd = 0
      even = 0
      
      for x in position:
          if x % 2 == 0:
              even += 1
          else:
              odd += 1
              
      return min(even, odd)

https://leetcode.com/problems/largest-perimeter-triangle/

class Solution:
  def largestPerimeter(self, nums: List[int]) -> int:
      nums.sort()
      
      for i in range(len(nums) - 1, 1, -1):
          a = nums[i]
          b = nums[i - 1]
          c = nums[i - 2]
          
          if b + c > a:
              return a + b + c
      return 0

• Linked List

https://leetcode.com/problems/reverse-linked-list/

class Solution:
  def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
      pre = None
      cur = head
      
      while cur:
          nxt = cur.next
          cur.next = pre
          pre = cur
          cur = nxt
      
      return pre

https://leetcode.com/problems/convert-binary-number-in-a-linked-list-to-integer/

class Solution:
  def getDecimalValue(self, head: ListNode) -> int:   
      ans = 0
      cur = head
      
      while cur:
          ans = ans * 2 + cur.val
          cur = cur.next
      
      return ans

https://leetcode.com/problems/middle-of-the-linked-list/

class Solution:
  def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:
      slow = head
      fast = head
      
      while fast and fast.next:
          fast = fast.next.next
          slow = slow.next

      return slow

https://leetcode.com/problems/delete-node-in-a-linked-list/

class Solution:
  def deleteNode(self, node):
      node.val = node.next.val
      node.next = node.next.next

https://leetcode.com/problems/remove-linked-list-elements/

class Solution:
  def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:
      dummy = ListNode(-1)    
      dummy.next = head
      
      cur = dummy
      
      while cur.next != None:
          if cur.next.val == val:
              cur.next = cur.next.next
          else:
              cur = cur.next
          
      return dummy.next

https://leetcode.com/problems/remove-duplicates-from-sorted-list/

class Solution:
  def deleteDuplicates(self, head: Optional[ListNode]) -> Optional[ListNode]:
      if head is None:
          return head
      
      cur = head
      while cur.next:
          if cur.val == cur.next.val:
              cur.next = cur.next.next
          else:
              cur = cur.next
      
      return head

https://leetcode.com/problems/intersection-of-two-linked-lists/

class Solution:
  def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:
      a = headA
      b = headB
      
      while a != b:
          a = headB if a == None else a.next
          b = headA if b == None else b.next
  
      return a

https://leetcode.com/problems/linked-list-cycle/

class Solution:
  def hasCycle(self, head: Optional[ListNode]) -> bool:
      if head == None or head.next == None:
          return False
      
      fast, slow = head, head
      
      while fast != None and fast.next != None:
          slow = slow.next
          fast = fast.next.next
          
          if slow == fast:
              return True
      
      return False

https://leetcode.com/problems/merge-two-sorted-lists/

class Solution:
  def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
      prehead = ListNode(-1)
      prev = prehead
      
      while list1 and list2:
          if list1.val <= list2.val:
              prev.next = list1
              list1 = list1.next
          else:
              prev.next = list2
              list2 = list2.next
              
          prev = prev.next
          
      if list1:
          prev.next = list1
          
      if list2:
          prev.next = list2
          
      return prehead.next

https://leetcode.com/problems/palindrome-linked-list/

class Solution:
  def isPalindrome(self, head: Optional[ListNode]) -> bool:      
      if head == None or head.next == None:
          return True
      
      prev = None
      slow = head
      fast = head
      while fast != None and fast.next != None:
          fast = fast.next.next
          prev = slow
          slow = slow.next   
      prev.next = None
      
      pre = None
      cur = slow
      while cur:
          nxt = cur.next
          cur.next = pre
          pre = cur
          cur = nxt
      
      while head != None and pre != None:
          if head.val  != pre.val:
              return False
          head = head.next
          pre = pre.next
      return True

• Tree

https://leetcode.com/problems/same-tree/

class Solution:
  def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:
      if p is None and q is None:
          return True
      
      if p is None or q is None:
          return False

      return p.val == q.val and self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)

https://leetcode.com/problems/construct-string-from-binary-tree/

class Solution:
  def tree2str(self, root: Optional[TreeNode]) -> str:
      ans = ""
      
      if root == None:
          return ans
          
      ans += str(root.val)
      if root.left == None and root.right == None:
          return ans
      
      ans += '(' + self.tree2str(root.left) + ')'
      
      if root.right != None:
          ans += '(' + self.tree2str(root.right) + ')'
          
      return ans

https://leetcode.com/problems/sum-of-root-to-leaf-binary-numbers/

class Solution:
  def sumRootToLeaf(self, root: Optional[TreeNode]) -> int:
      self.curSum = 0
      
      def dfs(node, x):
          if node == None:
              return
          
          x = x << 1 | node.val
          
          if node.left == None and node.right == None:
              self.curSum += x
              
          dfs(node.left, x)
          dfs(node.right, x)
          
      dfs(root, 0)
      return self.curSum

https://leetcode.com/problems/find-mode-in-binary-search-tree/

class Solution:
  def findMode(self, root: Optional[TreeNode]) -> List[int]:
      self.pre = root.val
      self.cur, self.max = 0, 0
      self.ans = []
      
      def dfs(node):
          if node == None:
              return
          
          dfs(node.left)
          
          if node.val != self.pre:
              self.cur = 1
              self.pre = node.val
          else:
              self.cur += 1
              
          if self.cur > self.max:
              self.max = self.cur
              self.ans.clear()
              self.ans.append(node.val)
              
          elif self.cur == self.max:
              self.ans.append(node.val)            
          
          dfs(node.right)
          
      dfs(root)
      return self.ans

https://leetcode.com/problems/binary-tree-tilt/

class Solution:
  def findTilt(self, root: Optional[TreeNode]) -> int:
      self.tilt = 0
      
      def dfs(node):
          if node == None:
              return 0
          
          l = dfs(node.left)
          r = dfs(node.right)
          
          self.tilt += abs(l - r)
          return l + r + node.val
          
      dfs(root)
      return self.tilt

https://leetcode.com/problems/minimum-absolute-difference-in-bst/

class Solution:
  def getMinimumDifference(self, root: Optional[TreeNode]) -> int:
      self.global_min = float("inf")       
      self.prev = None
      
      def helper(root):  
          if root is None:
              return
          
          helper(root.left)
      
          if self.prev:
              self.global_min = min(abs(root.val - self.prev.val), self.global_min)
          self.prev = root
          
          helper(root.right)
      
      
      helper(root)
      return self.global_min

https://leetcode.com/problems/n-ary-tree-postorder-traversal/

class Solution:
  def postorder(self, root: 'Node') -> List[int]:
      self.ans = []
      
      def dfs(node):
          if node == None:
              return
          
          for child in node.children:
              dfs(child)
              
          self.ans.append(node.val)
          
      dfs(root)
      return self.ans

https://leetcode.com/problems/n-ary-tree-preorder-traversal/

class Solution:
  def preorder(self, root: 'Node') -> List[int]:
      self.ans = []
      
      def dfs(node):
          if node == None:
              return
          
          self.ans.append(node.val)
          
          for child in node.children:
              dfs(child)
          
      dfs(root)
      return self.ans

https://leetcode.com/problems/leaf-similar-trees/

class Solution:
  def leafSimilar(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> bool:
      root1arr = []
      root2arr = []
      
      def helper(root, arr):
          if root is None:
              return 0
            
          if root.left is None and root.right is None:
              arr.append(root.val)   
              
          helper(root.left, arr)
          helper(root.right, arr)
          
      helper(root1, root1arr)
      helper(root2, root2arr)
      
      return root1arr == root2arr

https://leetcode.com/problems/increasing-order-search-tree/

class Solution:
  def increasingBST(self, root: TreeNode) -> TreeNode:
      dummy = TreeNode(-1)
      self.cur = dummy
      
      def dfs(node):
          if node == None:
              return
          
          dfs(node.left)
          
          self.cur.right = node
          node.left = None
          self.cur = self.cur.right
          
          dfs(node.right)
          
      dfs(root)
      return dummy.right

https://leetcode.com/problems/maximum-depth-of-n-ary-tree/

class Solution:
  def maxDepth(self, root: 'Node') -> int:
      if root is None:
          return 0
      
      ans = 1
      
      for child in root.children:
          ans = max(self.maxDepth(child) + 1, ans) 

      return ans

https://leetcode.com/problems/sum-of-left-leaves/

class Solution:
  def sumOfLeftLeaves(self, root: Optional[TreeNode]) -> int:
      self.ans = 0
      
      def dfs(node):
          if node == None:
              return 0
          
          if node.left != None and node.left.left == None and node.left.right == None:
              self.ans += node.left.val
          
          dfs(node.left)
          dfs(node.right)
          
      dfs(root)
      return self.ans

https://leetcode.com/problems/average-of-levels-in-binary-tree/

class Solution:
  def averageOfLevels(self, root: Optional[TreeNode]) -> List[float]:
      ans = []
      
      q = collections.deque()
      q.append(root)
      
      while q:
          levelSum = 0
          k = len(q)
          
          for _ in range(k):
              node = q.popleft()
              levelSum += node.val

              if node.left:
                  q.append(node.left)

              if node.right:
                  q.append(node.right)

          ans.append(levelSum / k)  
              
      return ans

https://leetcode.com/problems/minimum-depth-of-binary-tree/

class Solution:
  def minDepth(self, root: Optional[TreeNode]) -> int:
      self.ans = float("inf")
      if root == None:
          return 0
     
      def dfs(node, dep):
          if node == None:
              return 0
          
          if node.left == None and node.right == None:
              self.ans = min(self.ans, dep)
              
          dfs(node.left, dep + 1)
          dfs(node.right, dep + 1)
          
      dfs(root, 1)
      
      return self.ans

https://leetcode.com/problems/binary-tree-inorder-traversal/

class Solution:
  def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
      ans = []
      stack = [root]
      
      if root is None:
          return ans
      
      while stack:
          cur = stack.pop()
          
          if cur != None:
              if cur.right != None:
                  stack.append(cur.right)

              stack.append(cur)
              stack.append(None)

              if cur.left != None:
                  stack.append(cur.left)
          else:
              ans.append(stack.pop().val)
              
      return ans

https://leetcode.com/problems/binary-tree-postorder-traversal/

class Solution:
  def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
      ans = []
      stack = [root]
      
      if root is None:
          return ans
      
      while stack:
          cur = stack.pop()
          
          if cur != None:
              stack.append(cur)
              stack.append(None)
              
              if (cur.right != None):
                  stack.append(cur.right)
                  
              if (cur.left != None):
                  stack.append(cur.left)
          else:
              ans.append(stack.pop().val)
              
      return ans

https://leetcode.com/problems/binary-tree-preorder-traversal/

class Solution:
  def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
      ans = []
      stack = [root]
      
      if root is None:
          return ans
      
      while stack:
          cur = stack.pop()

          if cur != None:
              if (cur.right != None):
                  stack.append(cur.right)
                  
              if (cur.left != None):
                  stack.append(cur.left)
                  
              stack.append(cur)
              stack.append(None)
              
          else:
              ans.append(stack.pop().val)
              
      return ans

https://leetcode.com/problems/two-sum-iv-input-is-a-bst/

class Solution:
  def __init__(self):
      self.seen = set()
  
  def findTarget(self, root: Optional[TreeNode], k: int) -> bool:         
      if root == None:
          return False

      if k - root.val in self.seen:
          return True

      self.seen.add(root.val)
      
      return self.findTarget(root.left, k) or self.findTarget(root.right, k)

https://leetcode.com/problems/binary-tree-paths/

class Solution:
  def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
      ans = []

      def dfs(node, t):
          if node is None:
              return []

          if node.left == None and node.right == None:
              return ans.append(t + str(node.val))

          t += str(node.val) + "->"

          dfs(node.left, t)  
          dfs(node.right, t)

      dfs(root, "")

      return ans

https://leetcode.com/problems/closest-binary-search-tree-value/

class Solution:
  def closestValue(self, root: Optional[TreeNode], target: float) -> int:
      self.ans = root.val
        
      while root != None:
          if abs(root.val - target) < abs(self.ans - target):
              self.ans = root.val
              
          root = root.left if root.val > target else root.right
      
      return self.ans

https://leetcode.com/problems/balanced-binary-tree/

class Solution:
  def isBalanced(self, root: Optional[TreeNode]) -> bool:       
      def dfs(node):
          if node == None:
              return 0
          
          l, r = dfs(node.left), dfs(node.right)
          
          if l == -1:
              return -1
          if r == -1:
              return -1
          
          if abs(l - r) > 1:
              return -1
          
          return max(l, r) + 1
      
      return dfs(root) != -1

https://leetcode.com/problems/range-sum-of-bst/

class Solution:
  def rangeSumBST(self, root: Optional[TreeNode], low: int, high: int) -> int:

      if not root:
          return 0
      
      if root.val > high:
          return self.rangeSumBST(root.left, low, high)
      
      if root.val < low:
          return self.rangeSumBST(root.right, low, high)
      
      return root.val + self.rangeSumBST(root.left, low, high) + self.rangeSumBST(root.right, low, high)

https://leetcode.com/problems/merge-two-binary-trees/

class Solution:
  def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:
      if root1 is None and root2 is None:
          return None
      
      if root1 is None and root2 is not None:
          return root2
      
      if root1 is not None and root2 is None:
          return root1
      
      root1.val += root2.val

      root1.left = self.mergeTrees(root1.left, root2.left)

      root1.right = self.mergeTrees(root1.right, root2.right)
      
      return root1

https://leetcode.com/problems/cousins-in-binary-tree/

class Solution:
  def isCousins(self, root: Optional[TreeNode], x: int, y: int) -> bool:
      self.parx = None
      self.pary = None
      self.depx = 0
      self.depy = 0
      
      if root.val == x or root.val == y:
          return False

      def dfs(root, par, target, dep):
          if root is None:
              return
          
          if root.val == target:
              if target == x:
                  self.parx = par
                  self.depx = dep
              else:
                  self.pary = par
                  self.depy = dep
                  
              return
      
          dfs(root.left, root, target, dep + 1)
          dfs(root.right, root, target, dep + 1)
      
      dfs(root, -1, x, 0)
      dfs(root, -1, y, 0)
      
      return self.parx != self.pary and self.depx == self.depy

https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/

class Solution:
  def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:    
      
      def dfs(left, right):
          if left > right:
              return None
          
          mid = (left + right) // 2
          
          root = TreeNode(nums[mid])
          
          root.left = dfs(left, mid - 1)
          root.right = dfs(mid + 1, right)
          
          return root
          
      return dfs(0, len(nums) - 1)

https://leetcode.com/problems/invert-binary-tree/

class Solution:
  def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
      if root is None:
          return None
          
      t = root.right
      root.right = self.invertTree(root.left)
      root.left = self.invertTree(t)
      
      return root

https://leetcode.com/problems/path-sum/

class Solution:
  def hasPathSum(self, root: Optional[TreeNode], targetSum: int) -> bool:    
      if root is None:
          return False
      
      if root.left is None and root.right is None and root.val == targetSum:
          return True
      
      return self.hasPathSum(root.left, targetSum - root.val) or self.hasPathSum(root.right, targetSum - root.val)

https://leetcode.com/problems/maximum-depth-of-binary-tree/

class Solution:
  def maxDepth(self, root: Optional[TreeNode]) -> int:
      if root is None:
          return 0
      
      return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1

https://leetcode.com/problems/subtree-of-another-tree/

class Solution:
  def isSubtree(self, root: Optional[TreeNode], subRoot: Optional[TreeNode]) -> bool:
      def sameTree(t1, t2):
          if t1 is None and t2 is None:
              return True
          
          if t1 is None or t2 is None:
              return False
          
          return t1.val == t2.val and sameTree(t1.left, t2.left) and sameTree(t1.right, t2.right)
      
      if sameTree(root, subRoot):
          return True
      
      return (root.left != None and self.isSubtree(root.left, subRoot)) or (root.right != None and self.isSubtree(root.right, subRoot))

https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/

class Solution:
  def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
      if root.val < p.val and root.val < q.val:
          return self.lowestCommonAncestor(root.right, p, q)
      
      if root.val > p.val and root.val > q.val:
          return self.lowestCommonAncestor(root.left, p, q)
      
      return root

https://leetcode.com/problems/diameter-of-binary-tree/

class Solution:
  def diameterOfBinaryTree(self, root: Optional[TreeNode]) -> int:
      self.ans = 0
      
      def dfs(node):
          if node == None:
              return 0
          
          l = dfs(node.left)
          r = dfs(node.right)
          
          self.ans = max(l + r, self.ans)
          
          return max(l, r) + 1
      
      dfs(root)
      return self.ans

https://leetcode.com/problems/symmetric-tree/

class Solution:
  def isSymmetric(self, root: Optional[TreeNode]) -> bool:
      if root is None:
          return True
        
      def symmetric(a, b):
          return (a is None and b is None) or (a != None and b != None and a.val == b.val and symmetric(a.left, b.right) and symmetric(a.right, b.left))
        
      return symmetric(root.left, root.right)

• Heap

https://leetcode.com/problems/kth-largest-element-in-a-stream/

class KthLargest:

  def __init__(self, k: int, nums: List[int]):
      self.pq = []
      self.k = k
      
      for num in nums:
          self.add(num)    

  def add(self, val: int) -> int:
      heapq.heappush(self.pq, val)
      
      if len(self.pq) > self.k:
          heapq.heappop(self.pq)
          
      return self.pq[0]

https://leetcode.com/problems/maximize-sum-of-array-after-k-negations/

class Solution:
  def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:
      pq = []
      ans = 0
      
      for x in nums:
          heapq.heappush(pq, x)
          
      while k > 0:
          heapq.heappush(pq, -heapq.heappop(pq))
          k -= 1
          
      while len(pq) > 0:
          ans += heapq.heappop(pq)
          
      return ans

https://leetcode.com/problems/last-stone-weight/

class Solution:
  def lastStoneWeight(self, stones: List[int]) -> int:
      stones = [-x for x in stones]
      heapq.heapify(stones)
      
      while len(stones) > 1:
          first =  -1 * heapq.heappop(stones)
          second = -1 * heapq.heappop(stones)
          
          if first != second:
              heapq.heappush(stones, -1 *(first - second))
              
      return 0 if len(stones) == 0 else -1 * stones[0]    

• Matrix

https://leetcode.com/problems/transpose-matrix/

class Solution:
  def transpose(self, matrix: List[List[int]]) -> List[List[int]]:
      m = len(matrix)
      n = len(matrix[0])
      
      ans = [[0 for j in range(m)] for i in range(n)]
      
      for i in range(n):
          for j in range(m):
              ans[i][j] = matrix[j][i]
              
      return ans

https://leetcode.com/problems/surface-area-of-3d-shapes/

class Solution:
  def surfaceArea(self, grid: List[List[int]]) -> int:
      curSum = 0
      m, n = len(grid), len(grid[0])
      
      for i in range(m):
          for j in range(n):
              curSum += max(grid[i][j] - (grid[i - 1][j] if i > 0 else 0), 0)
              curSum += max(grid[i][j] - (grid[i][j - 1] if j > 0 else 0), 0)
              curSum += max(grid[i][j] - (grid[i + 1][j] if i < m - 1 else 0), 0)
              curSum += max(grid[i][j] - (grid[i][j + 1] if j < n - 1 else 0), 0)
              if grid[i][j] == 0:
                  curSum -= 2
                  
      return m * n * 2 + curSum

https://leetcode.com/problems/image-smoother/

class Solution:
  def imageSmoother(self, img: List[List[int]]) -> List[List[int]]:
      m, n = len(img), len(img[0])
      ans = [[0 for j in range(n)] for i in range(m)]
      
      for i in range(m):
          for j in range(n):
              cnt = 0
              curSum = 0
              for a in range(i - 1, i + 2):
                  for b in range(j - 1, j + 2):
                      if 0 <= a < m and 0 <= b < n:
                          cnt += 1
                          curSum += img[a][b]
              ans[i][j] = curSum // cnt
      
      return ans

https://leetcode.com/problems/projection-area-of-3d-shapes/

class Solution:
  def projectionArea(self, grid: List[List[int]]) -> int:
      curSum = 0
      m = len(grid)
      n = len(grid[0])
      
      for i in range(m):
          maxN = 0
          for j in range(n):
              maxN = max(maxN, grid[i][j])
              if grid[i][j] == 0:
                  curSum -= 1
          curSum += maxN
          
      for i in range(n):
          maxN = 0
          for j in range(m):
              maxN = max(maxN, grid[j][i])
          curSum += maxN
          
      return m * n + curSum

https://leetcode.com/problems/reshape-the-matrix/

class Solution:
  def matrixReshape(self, mat: List[List[int]], r: int, c: int) -> List[List[int]]:
      if r * c != len(mat) * len(mat[0]):
          return mat
      
      ans = [[0 for j in range(c)] for i in range(r)]
      
      i = 0
      j = 0
      
      for x in mat:
          for e in x:
              ans[i][j] = e
              j += 1
              if j == c:
                  j = 0
                  i += 1
                  
      return ans

https://leetcode.com/problems/cells-with-odd-values-in-a-matrix/

class Solution:
  def oddCells(self, m: int, n: int, indices: List[List[int]]) -> int:
      a = [0] * m
      b = [0] * n
      
      for i in indices:
          a[i[0]] += 1
          b[i[1]] += 1
       
      aOdd = 0
      aEven = 0
      
      for x in a:
          if x % 2 == 0:
              aEven += 1
          else:
              aOdd += 1
              
      ans = 0
      for x in b:
          ans += aOdd if x % 2 == 0 else aEven
          
      return ans

https://leetcode.com/problems/toeplitz-matrix/

class Solution:
  def isToeplitzMatrix(self, matrix: List[List[int]]) -> bool:
      for i in range(len(matrix)):
          for j in range(len(matrix[0])):
              if i > 0 and j > 0 and matrix[i][j] != matrix[i - 1][j - 1]:
                  return False
      return True
class Solution:
  def isToeplitzMatrix(self, matrix: List[List[int]]) -> bool:        
      m = len(matrix)
      n = len(matrix[0])
      
      '''
          the indicies of top-left bottom-right diagonals are r-c
                          top-right bottom-left diagonals are r+c
      '''
      lookup = {}

      for r in range(m):
          for c in range(n):
              diag_idx = r - c
              if diag_idx in lookup:
                  if lookup[diag_idx] != matrix[r][c]:
                      return False
              else:
                  lookup[diag_idx] = matrix[r][c]
              
      return True

https://leetcode.com/problems/flipping-an-image/

class Solution:
  def flipAndInvertImage(self, image: List[List[int]]) -> List[List[int]]:
      m = len(image)
      n = len(image[0])
      
      for i in range(m):
          l = 0
          r = n - 1
          while l <= r:
              t = image[i][l]
              image[i][l] = image[i][r]
              image[i][r] = t
              
              image[i][l] = 1 - image[i][l]
              if l != r:      
                  image[i][r] = 1 - image[i][r]
                  
              l += 1
              r -= 1
              
      return image

https://leetcode.com/problems/the-k-weakest-rows-in-a-matrix/

class Solution:
  def kWeakestRows(self, mat: List[List[int]], k: int) -> List[int]:
      m = len(mat)
      n = len(mat[0])
      ans = []
      l = []
      
      for i in range(m):
          cnt = 0
          for j in range(n):
              if mat[i][j] == 1:
                  cnt += 1
          l.append([cnt, i])
            
      l = sorted(sorted(l, key = lambda x: x[1]), key = lambda x: x[0])
      
      for i in range(k):
          ans.append(l[i][1])
          
      return ans

https://leetcode.com/problems/count-negative-numbers-in-a-sorted-matrix/

class Solution:
  def countNegatives(self, grid: List[List[int]]) -> int:
      ans = 0
      
      m = len(grid)
      n = len(grid[0])
      
      i = m - 1
      j = 0
      
      while i >=0 and j < n:
          if grid[i][j] >= 0:
              ans += i + 1
              j += 1
          else:
              i -= 1
              
      return m * n - ans

https://leetcode.com/problems/flood-fill/

class Solution:
  def floodFill(self, image: List[List[int]], sr: int, sc: int, newColor: int) -> List[List[int]]:
      self.directions = [[-1, 0], [1, 0], [0, -1], [0, 1]]
      
      def dfs(image, i, j, newColor, oldColor):
          image[i][j] = newColor
          
          for d in self.directions:
              ni = i + d[0]
              nj = j + d[1]
              
              if ni >= 0 and nj >= 0 and ni < len(image) and nj < len(image[0]) and image[ni][nj] == oldColor:
                  dfs(image, ni, nj, newColor, oldColor)
                  
      if image[sr][sc] != newColor:
          dfs(image, sr, sc, newColor, image[sr][sc])
      
      return image

https://leetcode.com/problems/island-perimeter/

class Solution:
  def islandPerimeter(self, grid: List[List[int]]) -> int:
      ans = 0
      m = len(grid)
      n = len(grid[0])
      
      for i in range(m):
          for j in range(n):
              if grid[i][j] == 1:
                  ans += 4
              
                  if i + 1 < m and grid[i + 1][j] == 1:
                      ans -= 1
                  if j + 1 < n and grid[i][j + 1] == 1:
                      ans -= 1
                  if i - 1 >= 0 and grid[i - 1][j] == 1:
                      ans -= 1
                  if j - 1 >= 0 and grid[i][j - 1] == 1:
                      ans -= 1
                  
      return ans

• Graph

https://leetcode.com/problems/find-the-town-judge/

class Solution:
  def findJudge(self, n: int, trust: List[List[int]]) -> int:
      ind = [0] * (n + 1)
      outd = [0] * (n + 1)
      
      for x in trust:
          ind[x[1]] += 1
          outd[x[0]] += 1
      
      for i in range(1, n + 1):
          if ind[i] == n - 1 and outd[i] == 0:
              return i
          
      return -1

https://leetcode.com/problems/find-if-path-exists-in-graph/

class Solution:
  def validPath(self, n: int, edges: List[List[int]], source: int, destination: int) -> bool:
      g = {}
      vis = set()
      
      for e in edges:
          if e[0] in g:
              g[e[0]].append(e[1])
          else:
              g[e[0]] = [e[1]]
              
          if e[1] in g:
              g[e[1]].append(e[0])
          else:
              g[e[1]] = [e[0]]
      
      def dfs(u, d):
          if u == d:
              return True
          
          vis.add(u)
          
          for v in g[u]:
              if v in vis:
                  continue
              if dfs(v, d):
                  return True
          return False
  
      return dfs(source, destination)

• Dynamic Programming

https://leetcode.com/problems/climbing-stairs/

class Solution:
  def climbStairs(self, n: int) -> int:
      dp = [0] * (n + 1)
      
      dp[0] = 1
      dp[1] = 1
      
      for i in range(2, n + 1):
          dp[i] = dp[i - 1] + dp[i - 2]
          
      return dp[n]

https://leetcode.com/problems/n-th-tribonacci-number/

class Solution:
  def tribonacci(self, n: int) -> int:
      if n <= 1:
          return n
      
      dp = [0] * (n + 1)
      
      dp[0] = 0
      dp[1] = 1
      dp[2] = 1
      
      for i in range(3, n + 1):
          dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3]
      
      return dp[n]

https://leetcode.com/problems/min-cost-climbing-stairs/

class Solution:
  def minCostClimbingStairs(self, cost: List[int]) -> int:
      n = len(cost)
      dp = [0] * (n + 1)
      
      if n == 2:
          return min(cost[0], cost[1])
      
      for i in range(2, n + 1):
          dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2])
      
      return dp[n]

https://leetcode.com/problems/fibonacci-number/

class Solution:
  def fib(self, n: int) -> int:
      if n <= 1:
          return n
      
      dp = [0] * (n + 1)
      
      dp[0] = 0
      dp[1] = 1
      
      for i in range(2, n + 1):
          dp[i] = dp[i - 1] + dp[i - 2]
          
      return dp[n]

• Design

https://leetcode.com/problems/design-parking-system/

class ParkingSystem:
  def __init__(self, big: int, medium: int, small: int):
      self.slots = [0] * 3
      self.slots[0] = big
      self.slots[1] = medium
      self.slots[2] = small

  def addCar(self, carType: int) -> bool:
      if self.slots[carType - 1] > 0:
          self.slots[carType - 1] -= 1
          return True
      return False

https://leetcode.com/problems/design-an-ordered-stream/

class OrderedStream:
  def __init__(self, n: int):
      self.i = 0
      self.s = [None] * n

  def insert(self, idKey: int, value: str) -> List[str]:
      self.s[idKey - 1] = value
      
      ans = []
      while self.i < len(self.s) and self.s[self.i]:
          ans.append(self.s[self.i])
          self.i += 1
      return ans

https://leetcode.com/problems/two-sum-iii-data-structure-design/

class TwoSum:
  def __init__(self):
      self.map = {}

  def add(self, number: int) -> None:
      self.map[number] = self.map.get(number, 0) + 1

  def find(self, value: int) -> bool:
      for k in self.map:
          if k == value - k and self.map[k] >= 2:
              return True
          elif k != value - k and value - k in self.map:
              return True
      return False

https://leetcode.com/problems/logger-rate-limiter/

class Logger:
  def __init__(self):
      self.lookup = {}

  def shouldPrintMessage(self, timestamp: int, message: str) -> bool:
      if message not in self.lookup or timestamp - self.lookup[message] >= 10:
          self.lookup[message] = timestamp
          return True
      
      return False

https://leetcode.com/problems/implement-stack-using-queues/

class MyStack:
  def __init__(self):
      self.q = deque([])

  def push(self, x: int) -> None:
      self.q.append(x)

  def pop(self) -> int:
      for i in range(len(self.q) - 1):
          self.q.append(self.q.popleft())
      return self.q.popleft()

  def top(self) -> int:
      return self.q[-1]

  def empty(self) -> bool:
      return len(self.q) == 0

https://leetcode.com/problems/max-stack/

class MaxStack:
  def __init__(self):
      self.maxStack = []

  def push(self, x: int) -> None:
      self.maxStack.append(x)

  def pop(self) -> int:
      return self.maxStack.pop()

  def top(self) -> int:
      return self.maxStack[-1]

  def peekMax(self) -> int:
      return max(self.maxStack)

  def popMax(self) -> int:
      max_val = self.peekMax()
      t = float("-inf")
      for i in range(len(self.maxStack) - 1, -1, -1):
          if self.maxStack[i] == max_val:
              t = self.maxStack.pop(i)
              return t

https://leetcode.com/problems/implement-queue-using-stacks/

class MyQueue:
  def __init__(self):
      self.a_stack = []
      self.b_stack = []

  def push(self, x: int) -> None:
      self.a_stack.append(x)

  def pop(self) -> int:
      if len(self.b_stack) == 0:
          while len(self.a_stack) > 0:
              self.b_stack.append(self.a_stack.pop())
              
      return self.b_stack.pop()
  
  def peek(self) -> int:
      if len(self.b_stack) == 0:
          while len(self.a_stack) > 0:
              self.b_stack.append(self.a_stack.pop())
              
      return self.b_stack[-1]

  def empty(self) -> bool:
      return len(self.a_stack) == 0 and len(self.b_stack) == 0