A1 — Two Sum

// JavaScript
function twoSum(nums, target) {
  const seen = new Map();
  for (let i = 0; i < nums.length; i++) {
    const complement = target - nums[i];
    if (seen.has(complement)) {
      return [seen.get(complement), i];
    }
    seen.set(nums[i], i);
  }
  throw new Error("No solution found");
}
// TypeScript
function twoSum(nums: number[], target: number): number[] {
  const seen = new Map<number, number>();
  for (let i = 0; i < nums.length; i++) {
    const complement = target - nums[i];
    if (seen.has(complement)) {
      return [seen.get(complement)!, i];
    }
    seen.set(nums[i], i);
  }
  throw new Error("No solution found");
}

A2 — Valid Palindrome

// JavaScript
function isPalindrome(s) {
  let left = 0, right = s.length - 1;
  const isAlnum = (c) => /[a-z0-9]/i.test(c);
  while (left < right) {
    while (left < right && !isAlnum(s[left])) left++;
    while (left < right && !isAlnum(s[right])) right--;
    if (s[left].toLowerCase() !== s[right].toLowerCase()) return false;
    left++;
    right--;
  }
  return true;
}
// TypeScript
function isPalindrome(s: string): boolean {
  let left = 0, right = s.length - 1;
  const isAlnum = (c: string): boolean => /[a-z0-9]/i.test(c);
  while (left < right) {
    while (left < right && !isAlnum(s[left])) left++;
    while (left < right && !isAlnum(s[right])) right--;
    if (s[left].toLowerCase() !== s[right].toLowerCase()) return false;
    left++;
    right--;
  }
  return true;
}

A3 — Valid Parentheses

// JavaScript
function isValid(s) {
  const stack = [];
  const pairs = { ')': '(', ']': '[', '}': '{' };
  for (const c of s) {
    if (c in pairs) {
      if (stack.pop() !== pairs[c]) return false;
    } else {
      stack.push(c);
    }
  }
  return stack.length === 0;
}
// TypeScript
function isValid(s: string): boolean {
  const stack: string[] = [];
  const pairs: Record<string, string> = { ')': '(', ']': '[', '}': '{' };
  for (const c of s) {
    if (c in pairs) {
      if (stack.pop() !== pairs[c]) return false;
    } else {
      stack.push(c);
    }
  }
  return stack.length === 0;
}

A4 — Longest Subarray Without Repeats

// JavaScript
function longestUniqueSubarray(nums) {
  const lastSeen = new Map();
  let maxLen = 0, left = 0;
  for (let right = 0; right < nums.length; right++) {
    if (lastSeen.has(nums[right]) && lastSeen.get(nums[right]) >= left) {
      left = lastSeen.get(nums[right]) + 1;
    }
    lastSeen.set(nums[right], right);
    maxLen = Math.max(maxLen, right - left + 1);
  }
  return maxLen;
}
// TypeScript
function longestUniqueSubarray(nums: number[]): number {
  const lastSeen = new Map<number, number>();
  let maxLen = 0, left = 0;
  for (let right = 0; right < nums.length; right++) {
    if (lastSeen.has(nums[right]) && lastSeen.get(nums[right])! >= left) {
      left = lastSeen.get(nums[right])! + 1;
    }
    lastSeen.set(nums[right], right);
    maxLen = Math.max(maxLen, right - left + 1);
  }
  return maxLen;
}

A5 — Max Depth of Binary Tree

// JavaScript
function maxDepth(root) {
  if (root === null) return 0;
  return 1 + Math.max(maxDepth(root.left), maxDepth(root.right));
}
// TypeScript
interface TreeNode {
  val: number;
  left: TreeNode | null;
  right: TreeNode | null;
}

function maxDepth(root: TreeNode | null): number {
  if (root === null) return 0;
  return 1 + Math.max(maxDepth(root.left), maxDepth(root.right));
}