From d08444365adf7958dd8c9203aa2b652b9d0002a3 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Thu, 8 May 2025 13:45:23 -0400 Subject: [PATCH 001/571] Add solution #2049 --- README.md | 3 +- ...2049-count-nodes-with-the-highest-score.js | 61 +++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 solutions/2049-count-nodes-with-the-highest-score.js diff --git a/README.md b/README.md index bb07c5c9..8befe0aa 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,709 LeetCode solutions in JavaScript +# 1,710 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1571,6 +1571,7 @@ 2045|[Second Minimum Time to Reach Destination](./solutions/2045-second-minimum-time-to-reach-destination.js)|Hard| 2047|[Number of Valid Words in a Sentence](./solutions/2047-number-of-valid-words-in-a-sentence.js)|Easy| 2048|[Next Greater Numerically Balanced Number](./solutions/2048-next-greater-numerically-balanced-number.js)|Medium| +2049|[Count Nodes With the Highest Score](./solutions/2049-count-nodes-with-the-highest-score.js)|Medium| 2053|[Kth Distinct String in an Array](./solutions/2053-kth-distinct-string-in-an-array.js)|Medium| 2071|[Maximum Number of Tasks You Can Assign](./solutions/2071-maximum-number-of-tasks-you-can-assign.js)|Hard| 2085|[Count Common Words With One Occurrence](./solutions/2085-count-common-words-with-one-occurrence.js)|Easy| diff --git a/solutions/2049-count-nodes-with-the-highest-score.js b/solutions/2049-count-nodes-with-the-highest-score.js new file mode 100644 index 00000000..1f13961e --- /dev/null +++ b/solutions/2049-count-nodes-with-the-highest-score.js @@ -0,0 +1,61 @@ +/** + * 2049. Count Nodes With the Highest Score + * https://leetcode.com/problems/count-nodes-with-the-highest-score/ + * Difficulty: Medium + * + * There is a binary tree rooted at 0 consisting of n nodes. The nodes are labeled from 0 to n - 1. + * You are given a 0-indexed integer array parents representing the tree, where parents[i] is the + * parent of node i. Since node 0 is the root, parents[0] == -1. + * + * Each node has a score. To find the score of a node, consider if the node and the edges connected + * to it were removed. The tree would become one or more non-empty subtrees. The size of a subtree + * is the number of the nodes in it. The score of the node is the product of the sizes of all + * those subtrees. + * + * Return the number of nodes that have the highest score. + */ + +/** + * @param {number[]} parents + * @return {number} + */ +var countHighestScoreNodes = function(parents) { + const n = parents.length; + const children = Array.from({ length: n }, () => []); + for (let i = 1; i < n; i++) { + children[parents[i]].push(i); + } + + const sizes = new Array(n).fill(0); + let maxScore = 0n; + let maxScoreCount = 0; + + calculateSize(0); + + return maxScoreCount; + + function calculateSize(node) { + let leftSize = 0; + let rightSize = 0; + + if (children[node].length > 0) leftSize = calculateSize(children[node][0]); + if (children[node].length > 1) rightSize = calculateSize(children[node][1]); + + sizes[node] = leftSize + rightSize + 1; + + let score = 1n; + if (leftSize > 0) score *= BigInt(leftSize); + if (rightSize > 0) score *= BigInt(rightSize); + const parentSize = n - sizes[node]; + if (parentSize > 0) score *= BigInt(parentSize); + + if (score > maxScore) { + maxScore = score; + maxScoreCount = 1; + } else if (score === maxScore) { + maxScoreCount++; + } + + return sizes[node]; + } +}; From d4ff52fa602c31c2e6383219e025e721f0f00700 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Fri, 9 May 2025 00:04:27 -0400 Subject: [PATCH 002/571] Add solution #3343 --- README.md | 3 +- ...3-count-number-of-balanced-permutations.js | 70 +++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 solutions/3343-count-number-of-balanced-permutations.js diff --git a/README.md b/README.md index 8befe0aa..65937f18 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,710 LeetCode solutions in JavaScript +# 1,711 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1704,6 +1704,7 @@ 3272|[Find the Count of Good Integers](./solutions/3272-find-the-count-of-good-integers.js)|Hard| 3306|[Count of Substrings Containing Every Vowel and K Consonants II](./solutions/3306-count-of-substrings-containing-every-vowel-and-k-consonants-ii.js)|Medium| 3342|[Find Minimum Time to Reach Last Room II](./solutions/3342-find-minimum-time-to-reach-last-room-ii.js)|Medium| +3343|[Count Number of Balanced Permutations](./solutions/3343-count-number-of-balanced-permutations.js)|Hard| 3356|[Zero Array Transformation II](./solutions/3356-zero-array-transformation-ii.js)|Medium| 3375|[Minimum Operations to Make Array Values Equal to K](./solutions/3375-minimum-operations-to-make-array-values-equal-to-k.js)|Easy| 3392|[Count Subarrays of Length Three With a Condition](./solutions/3392-count-subarrays-of-length-three-with-a-condition.js)|Easy| diff --git a/solutions/3343-count-number-of-balanced-permutations.js b/solutions/3343-count-number-of-balanced-permutations.js new file mode 100644 index 00000000..0e27eae1 --- /dev/null +++ b/solutions/3343-count-number-of-balanced-permutations.js @@ -0,0 +1,70 @@ +/** + * 3343. Count Number of Balanced Permutations + * https://leetcode.com/problems/count-number-of-balanced-permutations/ + * Difficulty: Hard + * + * You are given a string num. A string of digits is called balanced if the sum of the digits + * at even indices is equal to the sum of the digits at odd indices. + * + * Return the number of distinct permutations of num that are balanced. + * + * Since the answer may be very large, return it modulo 109 + 7. + * + * A permutation is a rearrangement of all the characters of a string. + */ + +/** + * @param {string} num + * @return {number} + */ +var countBalancedPermutations = function(num) { + const MOD = 1e9 + 7; + const n = num.length; + const digitCounts = new Array(10).fill(0); + let totalSum = 0; + + for (const char of num) { + const digit = parseInt(char); + digitCounts[digit]++; + totalSum += digit; + } + + if (totalSum % 2) return 0; + + const memo = new Map(); + + function combination(n, r) { + if (r > n) return 0; + if (r === 0 || r === n) return 1; + if (r > n - r) r = n - r; + + let result = 1n; + for (let i = 0; i < r; i++) { + result = result * BigInt(n - i) / BigInt(i + 1); + } + return Number(result % BigInt(MOD)); + } + + function exploreDigits(digit, oddSlots, evenSlots, targetBalance) { + if (oddSlots === 0 && evenSlots === 0 && targetBalance === 0) return 1; + if (digit < 0 || oddSlots < 0 || evenSlots < 0 || targetBalance < 0) return 0; + + const key = `${digit},${oddSlots},${evenSlots},${targetBalance}`; + if (memo.has(key)) return memo.get(key); + + let result = 0; + for (let oddCount = 0; oddCount <= digitCounts[digit]; oddCount++) { + const evenCount = digitCounts[digit] - oddCount; + const ways = (BigInt(combination(oddSlots, oddCount)) + * BigInt(combination(evenSlots, evenCount))) % BigInt(MOD); + const next = BigInt(exploreDigits(digit - 1, oddSlots - oddCount, + evenSlots - evenCount, targetBalance - digit * oddCount)); + result = (result + Number((ways * next) % BigInt(MOD))) % MOD; + } + + memo.set(key, result); + return result; + } + + return exploreDigits(9, n - Math.floor(n / 2), Math.floor(n / 2), totalSum / 2); +}; From 82f22ada1065f977ccb2926843c8c126cf68280b Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sat, 10 May 2025 17:21:55 -0500 Subject: [PATCH 003/571] Add solution #2918 --- README.md | 3 +- ...sum-of-two-arrays-after-replacing-zeros.js | 40 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 solutions/2918-minimum-equal-sum-of-two-arrays-after-replacing-zeros.js diff --git a/README.md b/README.md index 65937f18..4b48861d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,711 LeetCode solutions in JavaScript +# 1,712 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1685,6 +1685,7 @@ 2845|[Count of Interesting Subarrays](./solutions/2845-count-of-interesting-subarrays.js)|Medium| 2873|[Maximum Value of an Ordered Triplet I](./solutions/2873-maximum-value-of-an-ordered-triplet-i.js)|Easy| 2874|[Maximum Value of an Ordered Triplet II](./solutions/2874-maximum-value-of-an-ordered-triplet-ii.js)|Medium| +2918|[Minimum Equal Sum of Two Arrays After Replacing Zeros](./solutions/2918-minimum-equal-sum-of-two-arrays-after-replacing-zeros.js)|Medium| 2948|[Make Lexicographically Smallest Array by Swapping Elements](./solutions/2948-make-lexicographically-smallest-array-by-swapping-elements.js)|Medium| 2962|[Count Subarrays Where Max Element Appears at Least K Times](./solutions/2962-count-subarrays-where-max-element-appears-at-least-k-times.js)|Medium| 2965|[Find Missing and Repeated Values](./solutions/2965-find-missing-and-repeated-values.js)|Easy| diff --git a/solutions/2918-minimum-equal-sum-of-two-arrays-after-replacing-zeros.js b/solutions/2918-minimum-equal-sum-of-two-arrays-after-replacing-zeros.js new file mode 100644 index 00000000..15ea4af7 --- /dev/null +++ b/solutions/2918-minimum-equal-sum-of-two-arrays-after-replacing-zeros.js @@ -0,0 +1,40 @@ +/** + * 2918. Minimum Equal Sum of Two Arrays After Replacing Zeros + * https://leetcode.com/problems/minimum-equal-sum-of-two-arrays-after-replacing-zeros/ + * Difficulty: Medium + * + * You are given two arrays nums1 and nums2 consisting of positive integers. + * + * You have to replace all the 0's in both arrays with strictly positive integers such that the + * sum of elements of both arrays becomes equal. + * + * Return the minimum equal sum you can obtain, or -1 if it is impossible. + */ + +/** + * @param {number[]} nums1 + * @param {number[]} nums2 + * @return {number} + */ +var minSum = function(nums1, nums2) { + let sum1 = 0; + let zeros1 = 0; + for (const num of nums1) { + sum1 += num; + if (num === 0) zeros1++; + } + + let sum2 = 0; + let zeros2 = 0; + for (const num of nums2) { + sum2 += num; + if (num === 0) zeros2++; + } + + const minSum1 = sum1 + zeros1; + const minSum2 = sum2 + zeros2; + + if (minSum1 > sum2 && zeros2 === 0 || minSum2 > sum1 && zeros1 === 0) return -1; + + return Math.max(minSum1, minSum2); +}; From 3ae6f4387dbc0cf3a14566cab43d7b9c73e238d1 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sat, 10 May 2025 17:24:26 -0500 Subject: [PATCH 004/571] Add solution #3341 --- README.md | 3 +- ...-find-minimum-time-to-reach-last-room-i.js | 55 +++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 solutions/3341-find-minimum-time-to-reach-last-room-i.js diff --git a/README.md b/README.md index 4b48861d..c946ba63 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,712 LeetCode solutions in JavaScript +# 1,713 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1704,6 +1704,7 @@ 3223|[Minimum Length of String After Operations](./solutions/3223-minimum-length-of-string-after-operations.js)|Medium| 3272|[Find the Count of Good Integers](./solutions/3272-find-the-count-of-good-integers.js)|Hard| 3306|[Count of Substrings Containing Every Vowel and K Consonants II](./solutions/3306-count-of-substrings-containing-every-vowel-and-k-consonants-ii.js)|Medium| +3341|[Find Minimum Time to Reach Last Room I](./solutions/3341-find-minimum-time-to-reach-last-room-i.js)|Medium| 3342|[Find Minimum Time to Reach Last Room II](./solutions/3342-find-minimum-time-to-reach-last-room-ii.js)|Medium| 3343|[Count Number of Balanced Permutations](./solutions/3343-count-number-of-balanced-permutations.js)|Hard| 3356|[Zero Array Transformation II](./solutions/3356-zero-array-transformation-ii.js)|Medium| diff --git a/solutions/3341-find-minimum-time-to-reach-last-room-i.js b/solutions/3341-find-minimum-time-to-reach-last-room-i.js new file mode 100644 index 00000000..fae5957b --- /dev/null +++ b/solutions/3341-find-minimum-time-to-reach-last-room-i.js @@ -0,0 +1,55 @@ +/** + * 3341. Find Minimum Time to Reach Last Room I + * https://leetcode.com/problems/find-minimum-time-to-reach-last-room-i/ + * Difficulty: Medium + * + * There is a dungeon with n x m rooms arranged as a grid. + * + * You are given a 2D array moveTime of size n x m, where moveTime[i][j] represents the minimum + * time in seconds when you can start moving to that room. You start from the room (0, 0) at + * time t = 0 and can move to an adjacent room. Moving between adjacent rooms takes exactly + * one second. + * + * Return the minimum time to reach the room (n - 1, m - 1). + * + * Two rooms are adjacent if they share a common wall, either horizontally or vertically. + */ + +/** + * @param {number[][]} moveTime + * @return {number} + */ +var minTimeToReach = function(moveTime) { + const rows = moveTime.length; + const cols = moveTime[0].length; + const distances = Array.from({ length: rows }, () => new Array(cols).fill(Infinity)); + const pq = new PriorityQueue((a, b) => a[0] - b[0]); + pq.enqueue([0, 0, 0]); + const directions = [[0, 1], [1, 0], [0, -1], [-1, 0]]; + + distances[0][0] = 0; + + while (!pq.isEmpty()) { + const [time, row, col] = pq.dequeue(); + + if (row === rows - 1 && col === cols - 1) return time; + + if (time > distances[row][col]) continue; + + for (const [dr, dc] of directions) { + const newRow = row + dr; + const newCol = col + dc; + + if (newRow < 0 || newRow >= rows || newCol < 0 || newCol >= cols) continue; + + const newTime = Math.max(time, moveTime[newRow][newCol]) + 1; + + if (newTime < distances[newRow][newCol]) { + distances[newRow][newCol] = newTime; + pq.enqueue([newTime, newRow, newCol]); + } + } + } + + return distances[rows - 1][cols - 1]; +}; From 8d0eb2b36a3e5fbf0528afe1bb99801eac72a256 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sat, 10 May 2025 18:20:12 -0500 Subject: [PATCH 005/571] Add solution #2050 --- README.md | 3 +- solutions/2050-parallel-courses-iii.js | 61 ++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 solutions/2050-parallel-courses-iii.js diff --git a/README.md b/README.md index c946ba63..cca2c3bd 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,713 LeetCode solutions in JavaScript +# 1,714 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1572,6 +1572,7 @@ 2047|[Number of Valid Words in a Sentence](./solutions/2047-number-of-valid-words-in-a-sentence.js)|Easy| 2048|[Next Greater Numerically Balanced Number](./solutions/2048-next-greater-numerically-balanced-number.js)|Medium| 2049|[Count Nodes With the Highest Score](./solutions/2049-count-nodes-with-the-highest-score.js)|Medium| +2050|[Parallel Courses III](./solutions/2050-parallel-courses-iii.js)|Hard| 2053|[Kth Distinct String in an Array](./solutions/2053-kth-distinct-string-in-an-array.js)|Medium| 2071|[Maximum Number of Tasks You Can Assign](./solutions/2071-maximum-number-of-tasks-you-can-assign.js)|Hard| 2085|[Count Common Words With One Occurrence](./solutions/2085-count-common-words-with-one-occurrence.js)|Easy| diff --git a/solutions/2050-parallel-courses-iii.js b/solutions/2050-parallel-courses-iii.js new file mode 100644 index 00000000..62cdec65 --- /dev/null +++ b/solutions/2050-parallel-courses-iii.js @@ -0,0 +1,61 @@ +/** + * 2050. Parallel Courses III + * https://leetcode.com/problems/parallel-courses-iii/ + * Difficulty: Hard + * + * You are given an integer n, which indicates that there are n courses labeled from 1 to n. + * You are also given a 2D integer array relations where relations[j] = [prevCoursej, nextCoursej] + * denotes that course prevCoursej has to be completed before course nextCoursej (prerequisite + * relationship). Furthermore, you are given a 0-indexed integer array time where time[i] denotes + * how many months it takes to complete the (i+1)th course. + * + * You must find the minimum number of months needed to complete all the courses following these + * rules: + * - You may start taking a course at any time if the prerequisites are met. + * - Any number of courses can be taken at the same time. + * + * Return the minimum number of months needed to complete all the courses. + * + * Note: The test cases are generated such that it is possible to complete every course (i.e., the + * graph is a directed acyclic graph). + */ + +/** + * @param {number} n + * @param {number[][]} relations + * @param {number[]} time + * @return {number} + */ +var minimumTime = function(n, relations, time) { + const adjacencyList = Array.from({ length: n + 1 }, () => []); + const inDegree = new Array(n + 1).fill(0); + const completionTime = new Array(n + 1).fill(0); + + for (const [prev, next] of relations) { + adjacencyList[prev].push(next); + inDegree[next]++; + } + + const queue = []; + for (let i = 1; i <= n; i++) { + if (inDegree[i] === 0) { + queue.push(i); + completionTime[i] = time[i - 1]; + } + } + + while (queue.length) { + const current = queue.shift(); + for (const next of adjacencyList[current]) { + completionTime[next] = Math.max( + completionTime[next], + completionTime[current] + time[next - 1] + ); + if (--inDegree[next] === 0) { + queue.push(next); + } + } + } + + return Math.max(...completionTime); +}; From 70a134502d310b495f61850abc6506ea0777c646 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sat, 10 May 2025 18:22:06 -0500 Subject: [PATCH 006/571] Add solution #2055 --- README.md | 3 +- solutions/2055-plates-between-candles.js | 55 ++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 solutions/2055-plates-between-candles.js diff --git a/README.md b/README.md index cca2c3bd..6ab3b938 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,714 LeetCode solutions in JavaScript +# 1,715 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1574,6 +1574,7 @@ 2049|[Count Nodes With the Highest Score](./solutions/2049-count-nodes-with-the-highest-score.js)|Medium| 2050|[Parallel Courses III](./solutions/2050-parallel-courses-iii.js)|Hard| 2053|[Kth Distinct String in an Array](./solutions/2053-kth-distinct-string-in-an-array.js)|Medium| +2055|[Plates Between Candles](./solutions/2055-plates-between-candles.js)|Medium| 2071|[Maximum Number of Tasks You Can Assign](./solutions/2071-maximum-number-of-tasks-you-can-assign.js)|Hard| 2085|[Count Common Words With One Occurrence](./solutions/2085-count-common-words-with-one-occurrence.js)|Easy| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| diff --git a/solutions/2055-plates-between-candles.js b/solutions/2055-plates-between-candles.js new file mode 100644 index 00000000..347ed4ae --- /dev/null +++ b/solutions/2055-plates-between-candles.js @@ -0,0 +1,55 @@ +/** + * 2055. Plates Between Candles + * https://leetcode.com/problems/plates-between-candles/ + * Difficulty: Medium + * + * There is a long table with a line of plates and candles arranged on top of it. You are given + * a 0-indexed string s consisting of characters '*' and '|' only, where a '*' represents a plate + * and a '|' represents a candle. + * + * You are also given a 0-indexed 2D integer array queries where queries[i] = [lefti, righti] + * denotes the substring s[lefti...righti] (inclusive). For each query, you need to find the + * number of plates between candles that are in the substring. A plate is considered between + * candles if there is at least one candle to its left and at least one candle to its right + * in the substring. + * - For example, s = "||**||**|*", and a query [3, 8] denotes the substring "*||**|". The number + * of plates between candles in this substring is 2, as each of the two plates has at least one + * candle in the substring to its left and right. + * + * Return an integer array answer where answer[i] is the answer to the ith query. + */ + +/** + * @param {string} s + * @param {number[][]} queries + * @return {number[]} + */ +var platesBetweenCandles = function(s, queries) { + const n = s.length; + const prefixPlates = new Array(n + 1).fill(0); + const leftCandle = new Array(n).fill(-1); + const rightCandle = new Array(n).fill(-1); + + for (let i = 0, candle = -1; i < n; i++) { + prefixPlates[i + 1] = prefixPlates[i] + (s[i] === '*' ? 1 : 0); + if (s[i] === '|') candle = i; + leftCandle[i] = candle; + } + + for (let i = n - 1, candle = -1; i >= 0; i--) { + if (s[i] === '|') candle = i; + rightCandle[i] = candle; + } + + const result = new Array(queries.length).fill(0); + for (let i = 0; i < queries.length; i++) { + const [start, end] = queries[i]; + const left = rightCandle[start]; + const right = leftCandle[end]; + if (left !== -1 && right !== -1 && left < right) { + result[i] = prefixPlates[right] - prefixPlates[left]; + } + } + + return result; +}; From 4e854b1f31a3f2713128b9bf6b731c4977562672 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sat, 10 May 2025 18:34:25 -0500 Subject: [PATCH 007/571] Add solution #2056 --- README.md | 3 +- ...f-valid-move-combinations-on-chessboard.js | 108 ++++++++++++++++++ 2 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 solutions/2056-number-of-valid-move-combinations-on-chessboard.js diff --git a/README.md b/README.md index 6ab3b938..bbc5f2c9 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,715 LeetCode solutions in JavaScript +# 1,716 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1575,6 +1575,7 @@ 2050|[Parallel Courses III](./solutions/2050-parallel-courses-iii.js)|Hard| 2053|[Kth Distinct String in an Array](./solutions/2053-kth-distinct-string-in-an-array.js)|Medium| 2055|[Plates Between Candles](./solutions/2055-plates-between-candles.js)|Medium| +2056|[Number of Valid Move Combinations On Chessboard](./solutions/2056-number-of-valid-move-combinations-on-chessboard.js)|Hard| 2071|[Maximum Number of Tasks You Can Assign](./solutions/2071-maximum-number-of-tasks-you-can-assign.js)|Hard| 2085|[Count Common Words With One Occurrence](./solutions/2085-count-common-words-with-one-occurrence.js)|Easy| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| diff --git a/solutions/2056-number-of-valid-move-combinations-on-chessboard.js b/solutions/2056-number-of-valid-move-combinations-on-chessboard.js new file mode 100644 index 00000000..94716f2b --- /dev/null +++ b/solutions/2056-number-of-valid-move-combinations-on-chessboard.js @@ -0,0 +1,108 @@ +/** + * 2056. Number of Valid Move Combinations On Chessboard + * https://leetcode.com/problems/number-of-valid-move-combinations-on-chessboard/ + * Difficulty: Hard + * + * There is an 8 x 8 chessboard containing n pieces (rooks, queens, or bishops). You are given a + * string array pieces of length n, where pieces[i] describes the type (rook, queen, or bishop) + * of the ith piece. In addition, you are given a 2D integer array positions also of length n, + * where positions[i] = [ri, ci] indicates that the ith piece is currently at the 1-based + * coordinate (ri, ci) on the chessboard. + * + * When making a move for a piece, you choose a destination square that the piece will travel + * toward and stop on. + * - A rook can only travel horizontally or vertically from (r, c) to the direction of (r+1, c), + * (r-1, c), (r, c+1), or (r, c-1). + * - A queen can only travel horizontally, vertically, or diagonally from (r, c) to the direction + * of (r+1, c), (r-1, c), (r, c+1), (r, c-1), (r+1, c+1), (r+1, c-1), (r-1, c+1), (r-1, c-1). + * - A bishop can only travel diagonally from (r, c) to the direction of (r+1, c+1), (r+1, c-1), + * (r-1, c+1), (r-1, c-1). + * + * You must make a move for every piece on the board simultaneously. A move combination consists of + * all the moves performed on all the given pieces. Every second, each piece will instantaneously + * travel one square towards their destination if they are not already at it. All pieces start + * traveling at the 0th second. A move combination is invalid if, at a given time, two or more + * pieces occupy the same square. + * + * Return the number of valid move combinations. + * + * Notes: + * - No two pieces will start in the same square. + * - You may choose the square a piece is already on as its destination. + * - If two pieces are directly adjacent to each other, it is valid for them to move past each other + * and swap positions in one second. + */ + +/** + * @param {string[]} pieces + * @param {number[][]} positions + * @return {number} + */ +var countCombinations = function(pieces, positions) { + const n = pieces.length; + const directions = { + rook: [[0, 1], [0, -1], [1, 0], [-1, 0]], + bishop: [[1, 1], [1, -1], [-1, 1], [-1, -1]], + queen: [[0, 1], [0, -1], [1, 0], [-1, 0], [1, 1], [1, -1], [-1, 1], [-1, -1]] + }; + + return generateCombinations(0, [], []); + + function isValidPosition(row, col) { + return row >= 1 && row <= 8 && col >= 1 && col <= 8; + } + + function simulateMoves(moves, steps) { + const current = positions.map(([r, c]) => [r, c]); + const maxSteps = Math.max(...steps); + + for (let t = 0; t <= maxSteps; t++) { + const positionsAtTime = new Set(); + for (let i = 0; i < n; i++) { + const [dr, dc] = moves[i]; + const step = Math.min(t, steps[i]); + const newRow = current[i][0] + dr * step; + const newCol = current[i][1] + dc * step; + + if (t > steps[i] && steps[i] > 0 && !isValidPosition(newRow, newCol)) continue; + + const posKey = `${newRow},${newCol}`; + if (positionsAtTime.has(posKey)) return false; + positionsAtTime.add(posKey); + } + } + + return true; + } + + function generateCombinations(index, selectedMoves, selectedSteps) { + if (index === n) { + return simulateMoves(selectedMoves, selectedSteps) ? 1 : 0; + } + + let total = 0; + const [startRow, startCol] = positions[index]; + const pieceDirections = directions[pieces[index]]; + + total += generateCombinations(index + 1, [...selectedMoves, [0, 0]], [...selectedSteps, 0]); + + for (const [dr, dc] of pieceDirections) { + let row = startRow; + let col = startCol; + let step = 0; + + while (isValidPosition(row + dr, col + dc)) { + row += dr; + col += dc; + step++; + total += generateCombinations( + index + 1, + [...selectedMoves, [dr, dc]], + [...selectedSteps, step] + ); + } + } + + return total; + } +}; From 9c8c6c83c29e0b98247fe8a70b12245454c39de7 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sat, 10 May 2025 18:36:27 -0500 Subject: [PATCH 008/571] Add solution #2057 --- README.md | 3 ++- .../2057-smallest-index-with-equal-value.js | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 solutions/2057-smallest-index-with-equal-value.js diff --git a/README.md b/README.md index bbc5f2c9..e1c8f879 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,716 LeetCode solutions in JavaScript +# 1,717 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1576,6 +1576,7 @@ 2053|[Kth Distinct String in an Array](./solutions/2053-kth-distinct-string-in-an-array.js)|Medium| 2055|[Plates Between Candles](./solutions/2055-plates-between-candles.js)|Medium| 2056|[Number of Valid Move Combinations On Chessboard](./solutions/2056-number-of-valid-move-combinations-on-chessboard.js)|Hard| +2057|[Smallest Index With Equal Value](./solutions/2057-smallest-index-with-equal-value.js)|Easy| 2071|[Maximum Number of Tasks You Can Assign](./solutions/2071-maximum-number-of-tasks-you-can-assign.js)|Hard| 2085|[Count Common Words With One Occurrence](./solutions/2085-count-common-words-with-one-occurrence.js)|Easy| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| diff --git a/solutions/2057-smallest-index-with-equal-value.js b/solutions/2057-smallest-index-with-equal-value.js new file mode 100644 index 00000000..3fe1c453 --- /dev/null +++ b/solutions/2057-smallest-index-with-equal-value.js @@ -0,0 +1,23 @@ +/** + * 2057. Smallest Index With Equal Value + * https://leetcode.com/problems/smallest-index-with-equal-value/ + * Difficulty: Easy + * + * Given a 0-indexed integer array nums, return the smallest index i of nums such that i mod + * 10 == nums[i], or -1 if such index does not exist. + * + * x mod y denotes the remainder when x is divided by y. + */ + +/** + * @param {number[]} nums + * @return {number} + */ +var smallestEqual = function(nums) { + for (let i = 0; i < nums.length; i++) { + if (i % 10 === nums[i]) { + return i; + } + } + return -1; +}; From 20fdf445aaab9f17cdb347818a34902360b74aa6 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sat, 10 May 2025 18:43:42 -0500 Subject: [PATCH 009/571] Add solution #2058 --- README.md | 3 +- ...number-of-nodes-between-critical-points.js | 63 +++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 solutions/2058-find-the-minimum-and-maximum-number-of-nodes-between-critical-points.js diff --git a/README.md b/README.md index e1c8f879..eec96320 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,717 LeetCode solutions in JavaScript +# 1,718 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1577,6 +1577,7 @@ 2055|[Plates Between Candles](./solutions/2055-plates-between-candles.js)|Medium| 2056|[Number of Valid Move Combinations On Chessboard](./solutions/2056-number-of-valid-move-combinations-on-chessboard.js)|Hard| 2057|[Smallest Index With Equal Value](./solutions/2057-smallest-index-with-equal-value.js)|Easy| +2058|[Find the Minimum and Maximum Number of Nodes Between Critical Points](./solutions/2058-find-the-minimum-and-maximum-number-of-nodes-between-critical-points.js)|Medium| 2071|[Maximum Number of Tasks You Can Assign](./solutions/2071-maximum-number-of-tasks-you-can-assign.js)|Hard| 2085|[Count Common Words With One Occurrence](./solutions/2085-count-common-words-with-one-occurrence.js)|Easy| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| diff --git a/solutions/2058-find-the-minimum-and-maximum-number-of-nodes-between-critical-points.js b/solutions/2058-find-the-minimum-and-maximum-number-of-nodes-between-critical-points.js new file mode 100644 index 00000000..da92ff90 --- /dev/null +++ b/solutions/2058-find-the-minimum-and-maximum-number-of-nodes-between-critical-points.js @@ -0,0 +1,63 @@ +/** + * 2058. Find the Minimum and Maximum Number of Nodes Between Critical Points + * https://leetcode.com/problems/find-the-minimum-and-maximum-number-of-nodes-between-critical-points/ + * Difficulty: Medium + * + * A critical point in a linked list is defined as either a local maxima or a local minima. + * + * A node is a local maxima if the current node has a value strictly greater than the previous node + * and the next node. + * + * A node is a local minima if the current node has a value strictly smaller than the previous node + * and the next node. + * + * Note that a node can only be a local maxima/minima if there exists both a previous node and a + * next node. + * + * Given a linked list head, return an array of length 2 containing [minDistance, maxDistance] + * where minDistance is the minimum distance between any two distinct critical points and + * maxDistance is the maximum distance between any two distinct critical points. If there are + * fewer than two critical points, return [-1, -1]. + */ + +/** + * Definition for singly-linked list. + * function ListNode(val, next) { + * this.val = (val===undefined ? 0 : val) + * this.next = (next===undefined ? null : next) + * } + */ +/** + * @param {ListNode} head + * @return {number[]} + */ +var nodesBetweenCriticalPoints = function(head) { + const criticalPositions = []; + let position = 1; + let prev = head; + let current = head.next; + + while (current.next) { + const next = current.next; + if ((current.val > prev.val && current.val > next.val) || + (current.val < prev.val && current.val < next.val)) { + criticalPositions.push(position); + } + prev = current; + current = next; + position++; + } + + if (criticalPositions.length < 2) { + return [-1, -1]; + } + + let minDistance = Infinity; + for (let i = 1; i < criticalPositions.length; i++) { + minDistance = Math.min(minDistance, criticalPositions[i] - criticalPositions[i - 1]); + } + + const maxDistance = criticalPositions[criticalPositions.length - 1] - criticalPositions[0]; + + return [minDistance, maxDistance]; +}; From f39cdf2f2219fc978eb8fffbe43322fffd26a04f Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sat, 10 May 2025 18:45:34 -0500 Subject: [PATCH 010/571] Add solution #2059 --- README.md | 3 +- ...59-minimum-operations-to-convert-number.js | 57 +++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 solutions/2059-minimum-operations-to-convert-number.js diff --git a/README.md b/README.md index eec96320..937b78a5 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,718 LeetCode solutions in JavaScript +# 1,719 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1578,6 +1578,7 @@ 2056|[Number of Valid Move Combinations On Chessboard](./solutions/2056-number-of-valid-move-combinations-on-chessboard.js)|Hard| 2057|[Smallest Index With Equal Value](./solutions/2057-smallest-index-with-equal-value.js)|Easy| 2058|[Find the Minimum and Maximum Number of Nodes Between Critical Points](./solutions/2058-find-the-minimum-and-maximum-number-of-nodes-between-critical-points.js)|Medium| +2059|[Minimum Operations to Convert Number](./solutions/2059-minimum-operations-to-convert-number.js)|Medium| 2071|[Maximum Number of Tasks You Can Assign](./solutions/2071-maximum-number-of-tasks-you-can-assign.js)|Hard| 2085|[Count Common Words With One Occurrence](./solutions/2085-count-common-words-with-one-occurrence.js)|Easy| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| diff --git a/solutions/2059-minimum-operations-to-convert-number.js b/solutions/2059-minimum-operations-to-convert-number.js new file mode 100644 index 00000000..677e5de9 --- /dev/null +++ b/solutions/2059-minimum-operations-to-convert-number.js @@ -0,0 +1,57 @@ +/** + * 2059. Minimum Operations to Convert Number + * https://leetcode.com/problems/minimum-operations-to-convert-number/ + * Difficulty: Medium + * + * You are given a 0-indexed integer array nums containing distinct numbers, an integer start, + * and an integer goal. There is an integer x that is initially set to start, and you want to + * perform operations on x such that it is converted to goal. You can perform the following + * operation repeatedly on the number x: + * + * If 0 <= x <= 1000, then for any index i in the array (0 <= i < nums.length), you can set x + * to any of the following: + * - x + nums[i] + * - x - nums[i] + * - x ^ nums[i] (bitwise-XOR) + * + * Note that you can use each nums[i] any number of times in any order. Operations that set x + * to be out of the range 0 <= x <= 1000 are valid, but no more operations can be done afterward. + * + * Return the minimum number of operations needed to convert x = start into goal, and -1 if it + * is not possible. + */ + +/** + * @param {number[]} nums + * @param {number} start + * @param {number} goal + * @return {number} + */ +var minimumOperations = function(nums, start, goal) { + const queue = [[start, 0]]; + const visited = new Set([start]); + + while (queue.length) { + const [current, steps] = queue.shift(); + + for (const num of nums) { + const candidates = [ + current + num, + current - num, + current ^ num + ]; + + for (const next of candidates) { + if (next === goal) { + return steps + 1; + } + if (next >= 0 && next <= 1000 && !visited.has(next)) { + visited.add(next); + queue.push([next, steps + 1]); + } + } + } + } + + return -1; +}; From fafb1b6a31564b4a28fcc1f0a00cfbab9bf78091 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sat, 10 May 2025 18:51:36 -0500 Subject: [PATCH 011/571] Add solution #2060 --- README.md | 3 +- ...string-exists-given-two-encoded-strings.js | 73 +++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 solutions/2060-check-if-an-original-string-exists-given-two-encoded-strings.js diff --git a/README.md b/README.md index 937b78a5..2cf7e444 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,719 LeetCode solutions in JavaScript +# 1,720 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1579,6 +1579,7 @@ 2057|[Smallest Index With Equal Value](./solutions/2057-smallest-index-with-equal-value.js)|Easy| 2058|[Find the Minimum and Maximum Number of Nodes Between Critical Points](./solutions/2058-find-the-minimum-and-maximum-number-of-nodes-between-critical-points.js)|Medium| 2059|[Minimum Operations to Convert Number](./solutions/2059-minimum-operations-to-convert-number.js)|Medium| +2060|[Check if an Original String Exists Given Two Encoded Strings](./solutions/2060-check-if-an-original-string-exists-given-two-encoded-strings.js)|Hard| 2071|[Maximum Number of Tasks You Can Assign](./solutions/2071-maximum-number-of-tasks-you-can-assign.js)|Hard| 2085|[Count Common Words With One Occurrence](./solutions/2085-count-common-words-with-one-occurrence.js)|Easy| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| diff --git a/solutions/2060-check-if-an-original-string-exists-given-two-encoded-strings.js b/solutions/2060-check-if-an-original-string-exists-given-two-encoded-strings.js new file mode 100644 index 00000000..520e531e --- /dev/null +++ b/solutions/2060-check-if-an-original-string-exists-given-two-encoded-strings.js @@ -0,0 +1,73 @@ +/** + * 2060. Check if an Original String Exists Given Two Encoded Strings + * https://leetcode.com/problems/check-if-an-original-string-exists-given-two-encoded-strings/ + * Difficulty: Hard + * + * An original string, consisting of lowercase English letters, can be encoded by the following + * steps: + * - Arbitrarily split it into a sequence of some number of non-empty substrings. + * - Arbitrarily choose some elements (possibly none) of the sequence, and replace each with its + * length (as a numeric string). + * - Concatenate the sequence as the encoded string. + * + * For example, one way to encode an original string "abcdefghijklmnop" might be: + * - Split it as a sequence: ["ab", "cdefghijklmn", "o", "p"]. + * - Choose the second and third elements to be replaced by their lengths, respectively. The + * sequence becomes ["ab", "12", "1", "p"]. + * - Concatenate the elements of the sequence to get the encoded string: "ab121p". + * + * Given two encoded strings s1 and s2, consisting of lowercase English letters and digits 1-9 + * (inclusive), return true if there exists an original string that could be encoded as both s1 + * and s2. Otherwise, return false. + * + * Note: The test cases are generated such that the number of consecutive digits in s1 and s2 + * does not exceed 3. + */ + +/** + * @param {string} s1 + * @param {string} s2 + * @return {boolean} + */ +var possiblyEquals = function(s1, s2) { + const memo = new Array(s1.length + 1).fill().map(() => new Array(s2.length + 1).fill() + .map(() => ({}))); + + function match(pos1, pos2, diff) { + if (pos1 === s1.length && pos2 === s2.length) return diff === 0; + if (memo[pos1][pos2][diff] !== undefined) return memo[pos1][pos2][diff]; + + const char1 = s1[pos1]; + const char2 = s2[pos2]; + + if (pos1 < s1.length && pos2 < s2.length && char1 === char2 && diff === 0) { + if (match(pos1 + 1, pos2 + 1, 0)) return true; + } + + if (pos1 < s1.length && isNaN(char1) && diff < 0) { + if (match(pos1 + 1, pos2, diff + 1)) return true; + } + + if (pos2 < s2.length && isNaN(char2) && diff > 0) { + if (match(pos1, pos2 + 1, diff - 1)) return true; + } + + let num = 0; + for (let i = 0; i < 3 && pos1 + i < s1.length; i++) { + if (isNaN(s1[pos1 + i])) break; + num = num * 10 + parseInt(s1[pos1 + i]); + if (match(pos1 + i + 1, pos2, diff + num)) return true; + } + + num = 0; + for (let i = 0; i < 3 && pos2 + i < s2.length; i++) { + if (isNaN(s2[pos2 + i])) break; + num = num * 10 + parseInt(s2[pos2 + i]); + if (match(pos1, pos2 + i + 1, diff - num)) return true; + } + + return memo[pos1][pos2][diff] = false; + } + + return match(0, 0, 0); +}; From 00009659372bef5e4e2e3f69f0017ef325bb75b1 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sat, 10 May 2025 18:52:50 -0500 Subject: [PATCH 012/571] Add solution #2062 --- README.md | 3 +- ...2062-count-vowel-substrings-of-a-string.js | 33 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 solutions/2062-count-vowel-substrings-of-a-string.js diff --git a/README.md b/README.md index 2cf7e444..aea09d23 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,720 LeetCode solutions in JavaScript +# 1,721 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1580,6 +1580,7 @@ 2058|[Find the Minimum and Maximum Number of Nodes Between Critical Points](./solutions/2058-find-the-minimum-and-maximum-number-of-nodes-between-critical-points.js)|Medium| 2059|[Minimum Operations to Convert Number](./solutions/2059-minimum-operations-to-convert-number.js)|Medium| 2060|[Check if an Original String Exists Given Two Encoded Strings](./solutions/2060-check-if-an-original-string-exists-given-two-encoded-strings.js)|Hard| +2062|[Count Vowel Substrings of a String](./solutions/2062-count-vowel-substrings-of-a-string.js)|Easy| 2071|[Maximum Number of Tasks You Can Assign](./solutions/2071-maximum-number-of-tasks-you-can-assign.js)|Hard| 2085|[Count Common Words With One Occurrence](./solutions/2085-count-common-words-with-one-occurrence.js)|Easy| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| diff --git a/solutions/2062-count-vowel-substrings-of-a-string.js b/solutions/2062-count-vowel-substrings-of-a-string.js new file mode 100644 index 00000000..8d427ac8 --- /dev/null +++ b/solutions/2062-count-vowel-substrings-of-a-string.js @@ -0,0 +1,33 @@ +/** + * 2062. Count Vowel Substrings of a String + * https://leetcode.com/problems/count-vowel-substrings-of-a-string/ + * Difficulty: Easy + * + * A substring is a contiguous (non-empty) sequence of characters within a string. + * + * A vowel substring is a substring that only consists of vowels ('a', 'e', 'i', 'o', and 'u') + * and has all five vowels present in it. + * + * Given a string word, return the number of vowel substrings in word. + */ + +/** + * @param {string} word + * @return {number} + */ +var countVowelSubstrings = function(word) { + const vowels = new Set(['a', 'e', 'i', 'o', 'u']); + let total = 0; + + for (let start = 0; start < word.length; start++) { + const vowelCount = new Map(); + for (let end = start; end < word.length && vowels.has(word[end]); end++) { + vowelCount.set(word[end], (vowelCount.get(word[end]) || 0) + 1); + if (vowelCount.size === 5) { + total++; + } + } + } + + return total; +}; From f76162da1662e53cfa65c14cdb3a9421fab4c746 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sat, 10 May 2025 18:53:48 -0500 Subject: [PATCH 013/571] Add solution #2063 --- README.md | 3 ++- solutions/2063-vowels-of-all-substrings.js | 30 ++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 solutions/2063-vowels-of-all-substrings.js diff --git a/README.md b/README.md index aea09d23..7426fe09 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,721 LeetCode solutions in JavaScript +# 1,722 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1581,6 +1581,7 @@ 2059|[Minimum Operations to Convert Number](./solutions/2059-minimum-operations-to-convert-number.js)|Medium| 2060|[Check if an Original String Exists Given Two Encoded Strings](./solutions/2060-check-if-an-original-string-exists-given-two-encoded-strings.js)|Hard| 2062|[Count Vowel Substrings of a String](./solutions/2062-count-vowel-substrings-of-a-string.js)|Easy| +2063|[Vowels of All Substrings](./solutions/2063-vowels-of-all-substrings.js)|Medium| 2071|[Maximum Number of Tasks You Can Assign](./solutions/2071-maximum-number-of-tasks-you-can-assign.js)|Hard| 2085|[Count Common Words With One Occurrence](./solutions/2085-count-common-words-with-one-occurrence.js)|Easy| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| diff --git a/solutions/2063-vowels-of-all-substrings.js b/solutions/2063-vowels-of-all-substrings.js new file mode 100644 index 00000000..bde705e8 --- /dev/null +++ b/solutions/2063-vowels-of-all-substrings.js @@ -0,0 +1,30 @@ +/** + * 2063. Vowels of All Substrings + * https://leetcode.com/problems/vowels-of-all-substrings/ + * Difficulty: Medium + * + * Given a string word, return the sum of the number of vowels ('a', 'e', 'i', 'o', and 'u') in + * every substring of word. + * + * A substring is a contiguous (non-empty) sequence of characters within a string. + * + * Note: Due to the large constraints, the answer may not fit in a signed 32-bit integer. Please + * be careful during the calculations. + */ + +/** + * @param {string} word + * @return {number} + */ +var countVowels = function(word) { + const vowels = new Set(['a', 'e', 'i', 'o', 'u']); + let total = 0; + + for (let i = 0; i < word.length; i++) { + if (vowels.has(word[i])) { + total += (i + 1) * (word.length - i); + } + } + + return total; +}; From ce55ded1c26a402dd64fd791a1ec3373aa8e49ee Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sat, 10 May 2025 18:54:56 -0500 Subject: [PATCH 014/571] Add solution #2064 --- README.md | 3 +- ...um-of-products-distributed-to-any-store.js | 45 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 solutions/2064-minimized-maximum-of-products-distributed-to-any-store.js diff --git a/README.md b/README.md index 7426fe09..eef1c7d2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,722 LeetCode solutions in JavaScript +# 1,723 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1582,6 +1582,7 @@ 2060|[Check if an Original String Exists Given Two Encoded Strings](./solutions/2060-check-if-an-original-string-exists-given-two-encoded-strings.js)|Hard| 2062|[Count Vowel Substrings of a String](./solutions/2062-count-vowel-substrings-of-a-string.js)|Easy| 2063|[Vowels of All Substrings](./solutions/2063-vowels-of-all-substrings.js)|Medium| +2064|[Minimized Maximum of Products Distributed to Any Store](./solutions/2064-minimized-maximum-of-products-distributed-to-any-store.js)|Medium| 2071|[Maximum Number of Tasks You Can Assign](./solutions/2071-maximum-number-of-tasks-you-can-assign.js)|Hard| 2085|[Count Common Words With One Occurrence](./solutions/2085-count-common-words-with-one-occurrence.js)|Easy| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| diff --git a/solutions/2064-minimized-maximum-of-products-distributed-to-any-store.js b/solutions/2064-minimized-maximum-of-products-distributed-to-any-store.js new file mode 100644 index 00000000..b1781081 --- /dev/null +++ b/solutions/2064-minimized-maximum-of-products-distributed-to-any-store.js @@ -0,0 +1,45 @@ +/** + * 2064. Minimized Maximum of Products Distributed to Any Store + * https://leetcode.com/problems/minimized-maximum-of-products-distributed-to-any-store/ + * Difficulty: Medium + * + * You are given an integer n indicating there are n specialty retail stores. There are m product + * types of varying amounts, which are given as a 0-indexed integer array quantities, where + * quantities[i] represents the number of products of the ith product type. + * + * You need to distribute all products to the retail stores following these rules: + * - A store can only be given at most one product type but can be given any amount of it. + * - After distribution, each store will have been given some number of products (possibly 0). + * Let x represent the maximum number of products given to any store. You want x to be as small + * as possible, i.e., you want to minimize the maximum number of products that are given to any + * store. + * + * Return the minimum possible x. + */ + +/** + * @param {number} n + * @param {number[]} quantities + * @return {number} + */ +var minimizedMaximum = function(n, quantities) { + let left = 1; + let right = Math.max(...quantities); + + while (left < right) { + const mid = Math.floor((left + right) / 2); + let storesNeeded = 0; + + for (const quantity of quantities) { + storesNeeded += Math.ceil(quantity / mid); + } + + if (storesNeeded <= n) { + right = mid; + } else { + left = mid + 1; + } + } + + return left; +}; From 63f7d04a072ea7cfb4495ce6003f5a007f515213 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sat, 10 May 2025 18:56:17 -0500 Subject: [PATCH 015/571] Add solution #2065 --- README.md | 3 +- .../2065-maximum-path-quality-of-a-graph.js | 59 +++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 solutions/2065-maximum-path-quality-of-a-graph.js diff --git a/README.md b/README.md index eef1c7d2..e47e518d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,723 LeetCode solutions in JavaScript +# 1,724 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1583,6 +1583,7 @@ 2062|[Count Vowel Substrings of a String](./solutions/2062-count-vowel-substrings-of-a-string.js)|Easy| 2063|[Vowels of All Substrings](./solutions/2063-vowels-of-all-substrings.js)|Medium| 2064|[Minimized Maximum of Products Distributed to Any Store](./solutions/2064-minimized-maximum-of-products-distributed-to-any-store.js)|Medium| +2065|[Maximum Path Quality of a Graph](./solutions/2065-maximum-path-quality-of-a-graph.js)|Hard| 2071|[Maximum Number of Tasks You Can Assign](./solutions/2071-maximum-number-of-tasks-you-can-assign.js)|Hard| 2085|[Count Common Words With One Occurrence](./solutions/2085-count-common-words-with-one-occurrence.js)|Easy| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| diff --git a/solutions/2065-maximum-path-quality-of-a-graph.js b/solutions/2065-maximum-path-quality-of-a-graph.js new file mode 100644 index 00000000..9d07048c --- /dev/null +++ b/solutions/2065-maximum-path-quality-of-a-graph.js @@ -0,0 +1,59 @@ +/** + * 2065. Maximum Path Quality of a Graph + * https://leetcode.com/problems/maximum-path-quality-of-a-graph/ + * Difficulty: Hard + * + * There is an undirected graph with n nodes numbered from 0 to n - 1 (inclusive). You are given a + * 0-indexed integer array values where values[i] is the value of the ith node. You are also given + * a 0-indexed 2D integer array edges, where each edges[j] = [uj, vj, timej] indicates that there + * is an undirected edge between the nodes uj and vj, and it takes timej seconds to travel between + * the two nodes. Finally, you are given an integer maxTime. + * + * A valid path in the graph is any path that starts at node 0, ends at node 0, and takes at most + * maxTime seconds to complete. You may visit the same node multiple times. The quality of a valid + * path is the sum of the values of the unique nodes visited in the path (each node's value is + * added at most once to the sum). + * + * Return the maximum quality of a valid path. + * + * Note: There are at most four edges connected to each node. + */ + +/** + * @param {number[]} values + * @param {number[][]} edges + * @param {number} maxTime + * @return {number} + */ +var maximalPathQuality = function(values, edges, maxTime) { + const n = values.length; + const adjList = Array.from({ length: n }, () => []); + + for (const [u, v, time] of edges) { + adjList[u].push([v, time]); + adjList[v].push([u, time]); + } + + let result = 0; + const initialVisited = new Set([0]); + + dfs(0, maxTime, values[0], initialVisited); + + return result; + + function dfs(node, timeLeft, quality, visited) { + if (timeLeft < 0) return 0; + if (node === 0) { + result = Math.max(result, quality); + } + + for (const [nextNode, travelTime] of adjList[node]) { + const newVisited = new Set(visited); + const newQuality = newVisited.has(nextNode) ? quality : quality + values[nextNode]; + newVisited.add(nextNode); + dfs(nextNode, timeLeft - travelTime, newQuality, newVisited); + } + + return result; + } +}; From 8751b63cb2d3ffb0b6c0f50c2fe958a84b597b24 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sat, 10 May 2025 18:57:20 -0500 Subject: [PATCH 016/571] Add solution #2068 --- README.md | 3 +- ...ether-two-strings-are-almost-equivalent.js | 29 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 solutions/2068-check-whether-two-strings-are-almost-equivalent.js diff --git a/README.md b/README.md index e47e518d..6ea1771b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,724 LeetCode solutions in JavaScript +# 1,725 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1584,6 +1584,7 @@ 2063|[Vowels of All Substrings](./solutions/2063-vowels-of-all-substrings.js)|Medium| 2064|[Minimized Maximum of Products Distributed to Any Store](./solutions/2064-minimized-maximum-of-products-distributed-to-any-store.js)|Medium| 2065|[Maximum Path Quality of a Graph](./solutions/2065-maximum-path-quality-of-a-graph.js)|Hard| +2068|[Check Whether Two Strings are Almost Equivalent](./solutions/2068-check-whether-two-strings-are-almost-equivalent.js)|Easy| 2071|[Maximum Number of Tasks You Can Assign](./solutions/2071-maximum-number-of-tasks-you-can-assign.js)|Hard| 2085|[Count Common Words With One Occurrence](./solutions/2085-count-common-words-with-one-occurrence.js)|Easy| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| diff --git a/solutions/2068-check-whether-two-strings-are-almost-equivalent.js b/solutions/2068-check-whether-two-strings-are-almost-equivalent.js new file mode 100644 index 00000000..210aeb88 --- /dev/null +++ b/solutions/2068-check-whether-two-strings-are-almost-equivalent.js @@ -0,0 +1,29 @@ +/** + * 2068. Check Whether Two Strings are Almost Equivalent + * https://leetcode.com/problems/check-whether-two-strings-are-almost-equivalent/ + * Difficulty: Easy + * + * Two strings word1 and word2 are considered almost equivalent if the differences between the + * frequencies of each letter from 'a' to 'z' between word1 and word2 is at most 3. + * + * Given two strings word1 and word2, each of length n, return true if word1 and word2 are almost + * equivalent, or false otherwise. + * + * The frequency of a letter x is the number of times it occurs in the string. + */ + +/** + * @param {string} word1 + * @param {string} word2 + * @return {boolean} + */ +var checkAlmostEquivalent = function(word1, word2) { + const map = new Array(26).fill(0); + + for (let i = 0; i < word1.length; i++) { + map[word1.charCodeAt(i) - 97]++; + map[word2.charCodeAt(i) - 97]--; + } + + return map.every(diff => Math.abs(diff) <= 3); +}; From e0cf73afc1766d3c195983ed9727350d804d663c Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sun, 11 May 2025 00:00:06 -0500 Subject: [PATCH 017/571] Add solution #2069 --- README.md | 3 +- solutions/2069-walking-robot-simulation-ii.js | 84 +++++++++++++++++++ 2 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 solutions/2069-walking-robot-simulation-ii.js diff --git a/README.md b/README.md index 6ea1771b..b317e107 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,725 LeetCode solutions in JavaScript +# 1,726 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1585,6 +1585,7 @@ 2064|[Minimized Maximum of Products Distributed to Any Store](./solutions/2064-minimized-maximum-of-products-distributed-to-any-store.js)|Medium| 2065|[Maximum Path Quality of a Graph](./solutions/2065-maximum-path-quality-of-a-graph.js)|Hard| 2068|[Check Whether Two Strings are Almost Equivalent](./solutions/2068-check-whether-two-strings-are-almost-equivalent.js)|Easy| +2069|[Walking Robot Simulation II](./solutions/2069-walking-robot-simulation-ii.js)|Medium| 2071|[Maximum Number of Tasks You Can Assign](./solutions/2071-maximum-number-of-tasks-you-can-assign.js)|Hard| 2085|[Count Common Words With One Occurrence](./solutions/2085-count-common-words-with-one-occurrence.js)|Easy| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| diff --git a/solutions/2069-walking-robot-simulation-ii.js b/solutions/2069-walking-robot-simulation-ii.js new file mode 100644 index 00000000..e4896040 --- /dev/null +++ b/solutions/2069-walking-robot-simulation-ii.js @@ -0,0 +1,84 @@ +/** + * 2069. Walking Robot Simulation II + * https://leetcode.com/problems/walking-robot-simulation-ii/ + * Difficulty: Medium + * + * A width x height grid is on an XY-plane with the bottom-left cell at (0, 0) and the + * top-right cell at (width - 1, height - 1). The grid is aligned with the four cardinal + * directions ("North", "East", "South", and "West"). A robot is initially at cell (0, 0) + * facing direction "East". + * + * The robot can be instructed to move for a specific number of steps. For each step, it does + * the following. + * 1. Attempts to move forward one cell in the direction it is facing. + * 2. If the cell the robot is moving to is out of bounds, the robot instead turns 90 degrees + * counterclockwise and retries the step. + * + * After the robot finishes moving the number of steps required, it stops and awaits the next + * instruction. + * + * Implement the Robot class: + * - Robot(int width, int height) Initializes the width x height grid with the robot at (0, 0) + * facing "East". + * - void step(int num) Instructs the robot to move forward num steps. + * - int[] getPos() Returns the current cell the robot is at, as an array of length 2, [x, y]. + * - String getDir() Returns the current direction of the robot, "North", "East", "South", or + * "West". + */ + +/** + * @param {number} width + * @param {number} height + */ +var Robot = function(width, height) { + this.width = width; + this.height = height; + this.position = [0, 0]; + this.directionIndex = 0; + this.directions = ['East', 'North', 'West', 'South']; + this.moves = [[1, 0], [0, 1], [-1, 0], [0, -1]]; + this.perimeter = 2 * (width + height - 2); +}; + +/** + * @param {number} num + * @return {void} + */ +Robot.prototype.step = function(num) { + num %= this.perimeter; + if (num === 0) num = this.perimeter; + + while (num > 0) { + const [dx, dy] = this.moves[this.directionIndex]; + const [x, y] = this.position; + let steps; + + if (this.directionIndex === 0) steps = this.width - 1 - x; + else if (this.directionIndex === 1) steps = this.height - 1 - y; + else if (this.directionIndex === 2) steps = x; + else steps = y; + + if (steps >= num) { + this.position = [x + dx * num, y + dy * num]; + num = 0; + } else { + this.position = [x + dx * steps, y + dy * steps]; + this.directionIndex = (this.directionIndex + 1) % 4; + num -= steps; + } + } +}; + +/** + * @return {number[]} + */ +Robot.prototype.getPos = function() { + return this.position; +}; + +/** + * @return {string} + */ +Robot.prototype.getDir = function() { + return this.directions[this.directionIndex]; +}; From a9e3e9e83e489bcb5acf35610e30b39e38d45a1f Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sun, 11 May 2025 00:00:54 -0500 Subject: [PATCH 018/571] Add solution #2070 --- README.md | 3 +- ...2070-most-beautiful-item-for-each-query.js | 54 +++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 solutions/2070-most-beautiful-item-for-each-query.js diff --git a/README.md b/README.md index b317e107..c0507a5e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,726 LeetCode solutions in JavaScript +# 1,727 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1586,6 +1586,7 @@ 2065|[Maximum Path Quality of a Graph](./solutions/2065-maximum-path-quality-of-a-graph.js)|Hard| 2068|[Check Whether Two Strings are Almost Equivalent](./solutions/2068-check-whether-two-strings-are-almost-equivalent.js)|Easy| 2069|[Walking Robot Simulation II](./solutions/2069-walking-robot-simulation-ii.js)|Medium| +2070|[Most Beautiful Item for Each Query](./solutions/2070-most-beautiful-item-for-each-query.js)|Medium| 2071|[Maximum Number of Tasks You Can Assign](./solutions/2071-maximum-number-of-tasks-you-can-assign.js)|Hard| 2085|[Count Common Words With One Occurrence](./solutions/2085-count-common-words-with-one-occurrence.js)|Easy| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| diff --git a/solutions/2070-most-beautiful-item-for-each-query.js b/solutions/2070-most-beautiful-item-for-each-query.js new file mode 100644 index 00000000..1931e875 --- /dev/null +++ b/solutions/2070-most-beautiful-item-for-each-query.js @@ -0,0 +1,54 @@ +/** + * 2070. Most Beautiful Item for Each Query + * https://leetcode.com/problems/most-beautiful-item-for-each-query/ + * Difficulty: Medium + * + * You are given a 2D integer array items where items[i] = [pricei, beautyi] denotes the price and + * beauty of an item respectively. + * + * You are also given a 0-indexed integer array queries. For each queries[j], you want to determine + * the maximum beauty of an item whose price is less than or equal to queries[j]. If no such item + * exists, then the answer to this query is 0. + * + * Return an array answer of the same length as queries where answer[j] is the answer to the jth + * query. + */ + +/** + * @param {number[][]} items + * @param {number[]} queries + * @return {number[]} + */ +var maximumBeauty = function(items, queries) { + items.sort((a, b) => a[0] - b[0]); + const maxBeauty = []; + let currentMax = 0; + + for (const [, beauty] of items) { + currentMax = Math.max(currentMax, beauty); + maxBeauty.push(currentMax); + } + + const result = new Array(queries.length).fill(0); + + for (let i = 0; i < queries.length; i++) { + const price = queries[i]; + let left = 0; + let right = items.length - 1; + + while (left <= right) { + const mid = Math.floor((left + right) / 2); + if (items[mid][0] <= price) { + left = mid + 1; + } else { + right = mid - 1; + } + } + + if (right >= 0) { + result[i] = maxBeauty[right]; + } + } + + return result; +}; From 756637228f22ef034a4f23c0e4463e38fed2bbd1 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sun, 11 May 2025 00:02:38 -0500 Subject: [PATCH 019/571] Add solution #2074 --- README.md | 3 +- ...074-reverse-nodes-in-even-length-groups.js | 72 +++++++++++++++++++ 2 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 solutions/2074-reverse-nodes-in-even-length-groups.js diff --git a/README.md b/README.md index c0507a5e..a6b2ede9 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,727 LeetCode solutions in JavaScript +# 1,728 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1588,6 +1588,7 @@ 2069|[Walking Robot Simulation II](./solutions/2069-walking-robot-simulation-ii.js)|Medium| 2070|[Most Beautiful Item for Each Query](./solutions/2070-most-beautiful-item-for-each-query.js)|Medium| 2071|[Maximum Number of Tasks You Can Assign](./solutions/2071-maximum-number-of-tasks-you-can-assign.js)|Hard| +2074|[Reverse Nodes in Even Length Groups](./solutions/2074-reverse-nodes-in-even-length-groups.js)|Medium| 2085|[Count Common Words With One Occurrence](./solutions/2085-count-common-words-with-one-occurrence.js)|Easy| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| 2099|[Find Subsequence of Length K With the Largest Sum](./solutions/2099-find-subsequence-of-length-k-with-the-largest-sum.js)|Medium| diff --git a/solutions/2074-reverse-nodes-in-even-length-groups.js b/solutions/2074-reverse-nodes-in-even-length-groups.js new file mode 100644 index 00000000..2608277e --- /dev/null +++ b/solutions/2074-reverse-nodes-in-even-length-groups.js @@ -0,0 +1,72 @@ +/** + * 2074. Reverse Nodes in Even Length Groups + * https://leetcode.com/problems/reverse-nodes-in-even-length-groups/ + * Difficulty: Medium + * + * You are given the head of a linked list. + * + * The nodes in the linked list are sequentially assigned to non-empty groups whose lengths form + * the sequence of the natural numbers (1, 2, 3, 4, ...). The length of a group is the number + * of nodes assigned to it. In other words: + * - The 1st node is assigned to the first group. + * - The 2nd and the 3rd nodes are assigned to the second group. + * - The 4th, 5th, and 6th nodes are assigned to the third group, and so on. + * + * Note that the length of the last group may be less than or equal to 1 + the length of the second + * to last group. + * + * Reverse the nodes in each group with an even length, and return the head of the modified linked + * list. + */ + +/** + * Definition for singly-linked list. + * function ListNode(val, next) { + * this.val = (val===undefined ? 0 : val) + * this.next = (next===undefined ? null : next) + * } + */ +/** + * @param {ListNode} head + * @return {ListNode} + */ +var reverseEvenLengthGroups = function(head) { + let prevGroup = head; + let groupLength = 2; + + while (prevGroup.next) { + let count = 0; + let current = prevGroup.next; + const groupStart = current; + + while (current && count < groupLength) { + current = current.next; + count++; + } + + if (count % 2 === 0) { + prevGroup.next = reverseGroup(groupStart, count); + } + + for (let i = 0; i < count; i++) { + prevGroup = prevGroup.next; + } + + groupLength++; + } + + return head; + + function reverseGroup(start, length) { + let prev = null; + let current = start; + for (let i = 0; i < length; i++) { + const next = current.next; + current.next = prev; + prev = current; + current = next; + } + start.next = current; + return prev; + } +}; From 296c68f23ceb203b229102cdde0d693afe592d95 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sun, 11 May 2025 00:06:23 -0500 Subject: [PATCH 020/571] Add solution #2075 --- README.md | 3 +- .../2075-decode-the-slanted-ciphertext.js | 51 +++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 solutions/2075-decode-the-slanted-ciphertext.js diff --git a/README.md b/README.md index a6b2ede9..f336c7e8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,728 LeetCode solutions in JavaScript +# 1,729 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1589,6 +1589,7 @@ 2070|[Most Beautiful Item for Each Query](./solutions/2070-most-beautiful-item-for-each-query.js)|Medium| 2071|[Maximum Number of Tasks You Can Assign](./solutions/2071-maximum-number-of-tasks-you-can-assign.js)|Hard| 2074|[Reverse Nodes in Even Length Groups](./solutions/2074-reverse-nodes-in-even-length-groups.js)|Medium| +2075|[Decode the Slanted Ciphertext](./solutions/2075-decode-the-slanted-ciphertext.js)|Medium| 2085|[Count Common Words With One Occurrence](./solutions/2085-count-common-words-with-one-occurrence.js)|Easy| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| 2099|[Find Subsequence of Length K With the Largest Sum](./solutions/2099-find-subsequence-of-length-k-with-the-largest-sum.js)|Medium| diff --git a/solutions/2075-decode-the-slanted-ciphertext.js b/solutions/2075-decode-the-slanted-ciphertext.js new file mode 100644 index 00000000..63f5a41d --- /dev/null +++ b/solutions/2075-decode-the-slanted-ciphertext.js @@ -0,0 +1,51 @@ +/** + * 2075. Decode the Slanted Ciphertext + * https://leetcode.com/problems/decode-the-slanted-ciphertext/ + * Difficulty: Medium + * + * A string originalText is encoded using a slanted transposition cipher to a string encodedText + * with the help of a matrix having a fixed number of rows rows. + * + * originalText is placed first in a top-left to bottom-right manner. + * + * The blue cells are filled first, followed by the red cells, then the yellow cells, and so on, + * until we reach the end of originalText. The arrow indicates the order in which the cells are + * filled. All empty cells are filled with ' '. The number of columns is chosen such that the + * rightmost column will not be empty after filling in originalText. + * + * encodedText is then formed by appending all characters of the matrix in a row-wise fashion. + * + * The characters in the blue cells are appended first to encodedText, then the red cells, and so + * on, and finally the yellow cells. The arrow indicates the order in which the cells are accessed. + * + * For example, if originalText = "cipher" and rows = 3, then we encode it in the following manner. + * + * The blue arrows depict how originalText is placed in the matrix, and the red arrows denote the + * order in which encodedText is formed. In the above example, encodedText = "ch ie pr". + * + * Given the encoded string encodedText and number of rows rows, return the original string + * originalText. + * + * Note: originalText does not have any trailing spaces ' '. The test cases are generated such that + * there is only one possible originalText. + */ + +/** + * @param {string} encodedText + * @param {number} rows + * @return {string} + */ +var decodeCiphertext = function(encodedText, rows) { + if (rows === 1) return encodedText; + + const count = encodedText.length / rows; + let result = ''; + + for (let i = 0; i < count; i++) { + for (let row = 0; row < rows && row + i < count; row++) { + result += encodedText[row * count + i + row]; + } + } + + return result.trimEnd(); +}; From 687cd0d065d84d7691b572eaa43e152d4d8c3e3a Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sun, 11 May 2025 00:08:39 -0500 Subject: [PATCH 021/571] Add solution #2076 --- README.md | 3 +- ...2076-process-restricted-friend-requests.js | 70 +++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 solutions/2076-process-restricted-friend-requests.js diff --git a/README.md b/README.md index f336c7e8..43963ea0 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,729 LeetCode solutions in JavaScript +# 1,730 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1590,6 +1590,7 @@ 2071|[Maximum Number of Tasks You Can Assign](./solutions/2071-maximum-number-of-tasks-you-can-assign.js)|Hard| 2074|[Reverse Nodes in Even Length Groups](./solutions/2074-reverse-nodes-in-even-length-groups.js)|Medium| 2075|[Decode the Slanted Ciphertext](./solutions/2075-decode-the-slanted-ciphertext.js)|Medium| +2076|[Process Restricted Friend Requests](./solutions/2076-process-restricted-friend-requests.js)|Hard| 2085|[Count Common Words With One Occurrence](./solutions/2085-count-common-words-with-one-occurrence.js)|Easy| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| 2099|[Find Subsequence of Length K With the Largest Sum](./solutions/2099-find-subsequence-of-length-k-with-the-largest-sum.js)|Medium| diff --git a/solutions/2076-process-restricted-friend-requests.js b/solutions/2076-process-restricted-friend-requests.js new file mode 100644 index 00000000..dff94d09 --- /dev/null +++ b/solutions/2076-process-restricted-friend-requests.js @@ -0,0 +1,70 @@ +/** + * 2076. Process Restricted Friend Requests + * https://leetcode.com/problems/process-restricted-friend-requests/ + * Difficulty: Hard + * + * You are given an integer n indicating the number of people in a network. Each person is + * labeled from 0 to n - 1. + * + * You are also given a 0-indexed 2D integer array restrictions, where restrictions[i] = [xi, yi] + * means that person xi and person yi cannot become friends, either directly or indirectly through + * other people. + * + * Initially, no one is friends with each other. You are given a list of friend requests as a + * 0-indexed 2D integer array requests, where requests[j] = [uj, vj] is a friend request between + * person uj and person vj. + * + * A friend request is successful if uj and vj can be friends. Each friend request is processed + * in the given order (i.e., requests[j] occurs before requests[j + 1]), and upon a successful + * request, uj and vj become direct friends for all future friend requests. + * + * Return a boolean array result, where each result[j] is true if the jth friend request is + * successful or false if it is not. + * + * Note: If uj and vj are already direct friends, the request is still successful. + */ + +/** + * @param {number} n + * @param {number[][]} restrictions + * @param {number[][]} requests + * @return {boolean[]} + */ +var friendRequests = function(n, restrictions, requests) { + const parent = Array.from({ length: n }, (_, i) => i); + const result = new Array(requests.length).fill(true); + + for (let j = 0; j < requests.length; j++) { + const [u, v] = requests[j]; + const pu = find(u); + const pv = find(v); + + let canBeFriends = true; + for (const [x, y] of restrictions) { + const px = find(x); + const py = find(y); + if ((pu === px && pv === py) || (pu === py && pv === px)) { + canBeFriends = false; + break; + } + } + + result[j] = canBeFriends; + if (canBeFriends) { + union(u, v); + } + } + + return result; + + function find(x) { + if (parent[x] !== x) { + parent[x] = find(parent[x]); + } + return parent[x]; + } + + function union(x, y) { + parent[find(x)] = find(y); + } +}; From effede67040b2fbc7c5c0cde649c2bf3b375716b Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sun, 11 May 2025 00:16:39 -0500 Subject: [PATCH 022/571] Add solution #2078 --- README.md | 3 +- ...o-furthest-houses-with-different-colors.js | 32 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 solutions/2078-two-furthest-houses-with-different-colors.js diff --git a/README.md b/README.md index 43963ea0..f4328fc7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,730 LeetCode solutions in JavaScript +# 1,731 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1591,6 +1591,7 @@ 2074|[Reverse Nodes in Even Length Groups](./solutions/2074-reverse-nodes-in-even-length-groups.js)|Medium| 2075|[Decode the Slanted Ciphertext](./solutions/2075-decode-the-slanted-ciphertext.js)|Medium| 2076|[Process Restricted Friend Requests](./solutions/2076-process-restricted-friend-requests.js)|Hard| +2078|[Two Furthest Houses With Different Colors](./solutions/2078-two-furthest-houses-with-different-colors.js)|Easy| 2085|[Count Common Words With One Occurrence](./solutions/2085-count-common-words-with-one-occurrence.js)|Easy| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| 2099|[Find Subsequence of Length K With the Largest Sum](./solutions/2099-find-subsequence-of-length-k-with-the-largest-sum.js)|Medium| diff --git a/solutions/2078-two-furthest-houses-with-different-colors.js b/solutions/2078-two-furthest-houses-with-different-colors.js new file mode 100644 index 00000000..9a42b696 --- /dev/null +++ b/solutions/2078-two-furthest-houses-with-different-colors.js @@ -0,0 +1,32 @@ +/** + * 2078. Two Furthest Houses With Different Colors + * https://leetcode.com/problems/two-furthest-houses-with-different-colors/ + * Difficulty: Easy + * + * There are n houses evenly lined up on the street, and each house is beautifully painted. + * You are given a 0-indexed integer array colors of length n, where colors[i] represents + * the color of the ith house. + * + * Return the maximum distance between two houses with different colors. + * + * The distance between the ith and jth houses is abs(i - j), where abs(x) is the absolute + * value of x. + */ + +/** + * @param {number[]} colors + * @return {number} + */ +var maxDistance = function(colors) { + let result = 0; + + for (let i = 0; i < colors.length; i++) { + for (let j = i + 1; j < colors.length; j++) { + if (colors[i] !== colors[j]) { + result = Math.max(result, j - i); + } + } + } + + return result; +}; From 3ac3b0fe1088ebebc4050358a073b95a7f0aa90b Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sun, 11 May 2025 00:18:22 -0500 Subject: [PATCH 023/571] Add solution #2079 --- README.md | 3 ++- solutions/2079-watering-plants.js | 42 +++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 solutions/2079-watering-plants.js diff --git a/README.md b/README.md index f4328fc7..3b005494 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,731 LeetCode solutions in JavaScript +# 1,732 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1592,6 +1592,7 @@ 2075|[Decode the Slanted Ciphertext](./solutions/2075-decode-the-slanted-ciphertext.js)|Medium| 2076|[Process Restricted Friend Requests](./solutions/2076-process-restricted-friend-requests.js)|Hard| 2078|[Two Furthest Houses With Different Colors](./solutions/2078-two-furthest-houses-with-different-colors.js)|Easy| +2079|[Watering Plants](./solutions/2079-watering-plants.js)|Medium| 2085|[Count Common Words With One Occurrence](./solutions/2085-count-common-words-with-one-occurrence.js)|Easy| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| 2099|[Find Subsequence of Length K With the Largest Sum](./solutions/2099-find-subsequence-of-length-k-with-the-largest-sum.js)|Medium| diff --git a/solutions/2079-watering-plants.js b/solutions/2079-watering-plants.js new file mode 100644 index 00000000..ba77b302 --- /dev/null +++ b/solutions/2079-watering-plants.js @@ -0,0 +1,42 @@ +/** + * 2079. Watering Plants + * https://leetcode.com/problems/watering-plants/ + * Difficulty: Medium + * + * You want to water n plants in your garden with a watering can. The plants are arranged in + * a row and are labeled from 0 to n - 1 from left to right where the ith plant is located at + * x = i. There is a river at x = -1 that you can refill your watering can at. + * + * Each plant needs a specific amount of water. You will water the plants in the following way: + * - Water the plants in order from left to right. + * - After watering the current plant, if you do not have enough water to completely water the + * next plant, return to the river to fully refill the watering can. + * - You cannot refill the watering can early. + * + * You are initially at the river (i.e., x = -1). It takes one step to move one unit on the x-axis. + * + * Given a 0-indexed integer array plants of n integers, where plants[i] is the amount of water + * the ith plant needs, and an integer capacity representing the watering can capacity, return + * the number of steps needed to water all the plants. + */ + +/** + * @param {number[]} plants + * @param {number} capacity + * @return {number} + */ +var wateringPlants = function(plants, capacity) { + let water = capacity; + let result = 0; + + for (let i = 0; i < plants.length; i++) { + if (water < plants[i]) { + result += 2 * i; + water = capacity; + } + water -= plants[i]; + result++; + } + + return result; +}; From 9e1b3833ac1406b9956996118959f9c993a3c0c4 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sun, 11 May 2025 00:20:05 -0500 Subject: [PATCH 024/571] Add solution #2080 --- README.md | 3 +- solutions/2080-range-frequency-queries.js | 72 +++++++++++++++++++++++ 2 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 solutions/2080-range-frequency-queries.js diff --git a/README.md b/README.md index 3b005494..d4115d92 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,732 LeetCode solutions in JavaScript +# 1,733 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1593,6 +1593,7 @@ 2076|[Process Restricted Friend Requests](./solutions/2076-process-restricted-friend-requests.js)|Hard| 2078|[Two Furthest Houses With Different Colors](./solutions/2078-two-furthest-houses-with-different-colors.js)|Easy| 2079|[Watering Plants](./solutions/2079-watering-plants.js)|Medium| +2080|[Range Frequency Queries](./solutions/2080-range-frequency-queries.js)|Medium| 2085|[Count Common Words With One Occurrence](./solutions/2085-count-common-words-with-one-occurrence.js)|Easy| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| 2099|[Find Subsequence of Length K With the Largest Sum](./solutions/2099-find-subsequence-of-length-k-with-the-largest-sum.js)|Medium| diff --git a/solutions/2080-range-frequency-queries.js b/solutions/2080-range-frequency-queries.js new file mode 100644 index 00000000..32b1bb27 --- /dev/null +++ b/solutions/2080-range-frequency-queries.js @@ -0,0 +1,72 @@ +/** + * 2080. Range Frequency Queries + * https://leetcode.com/problems/range-frequency-queries/ + * Difficulty: Medium + * + * Design a data structure to find the frequency of a given value in a given subarray. + * + * The frequency of a value in a subarray is the number of occurrences of that value in + * the subarray. + * + * Implement the RangeFreqQuery class: + * - RangeFreqQuery(int[] arr) Constructs an instance of the class with the given 0-indexed + * integer array arr. + * - int query(int left, int right, int value) Returns the frequency of value in the subarray + * arr[left...right]. + * - A subarray is a contiguous sequence of elements within an array. arr[left...right] denotes + * the subarray that contains the elements of nums between indices left and right (inclusive). + */ + +/** + * @param {number[]} arr + */ +var RangeFreqQuery = function(arr) { + this.frequencyMap = new Map(); + + for (let i = 0; i < arr.length; i++) { + if (!this.frequencyMap.has(arr[i])) { + this.frequencyMap.set(arr[i], []); + } + this.frequencyMap.get(arr[i]).push(i); + } +}; + +/** + * @param {number} left + * @param {number} right + * @param {number} value + * @return {number} + */ +RangeFreqQuery.prototype.query = function(left, right, value) { + if (!this.frequencyMap.has(value)) return 0; + + const indices = this.frequencyMap.get(value); + let start = 0; + let end = indices.length - 1; + let leftBound = -1; + let rightBound = -1; + + while (start <= end) { + const mid = Math.floor((start + end) / 2); + if (indices[mid] >= left) { + leftBound = mid; + end = mid - 1; + } else { + start = mid + 1; + } + } + + start = 0; + end = indices.length - 1; + while (start <= end) { + const mid = Math.floor((start + end) / 2); + if (indices[mid] <= right) { + rightBound = mid; + start = mid + 1; + } else { + end = mid - 1; + } + } + + return leftBound === -1 || rightBound === -1 ? 0 : rightBound - leftBound + 1; +}; From 9aebc22ee763a33d07fec28e4a9f87c28564126c Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sun, 11 May 2025 00:40:09 -0500 Subject: [PATCH 025/571] Add solution #2081 --- README.md | 3 +- solutions/2081-sum-of-k-mirror-numbers.js | 105 ++++++++++++++++++++++ 2 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 solutions/2081-sum-of-k-mirror-numbers.js diff --git a/README.md b/README.md index d4115d92..30ad0a61 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,733 LeetCode solutions in JavaScript +# 1,734 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1594,6 +1594,7 @@ 2078|[Two Furthest Houses With Different Colors](./solutions/2078-two-furthest-houses-with-different-colors.js)|Easy| 2079|[Watering Plants](./solutions/2079-watering-plants.js)|Medium| 2080|[Range Frequency Queries](./solutions/2080-range-frequency-queries.js)|Medium| +2081|[Sum of k-Mirror Numbers](./solutions/2081-sum-of-k-mirror-numbers.js)|Hard| 2085|[Count Common Words With One Occurrence](./solutions/2085-count-common-words-with-one-occurrence.js)|Easy| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| 2099|[Find Subsequence of Length K With the Largest Sum](./solutions/2099-find-subsequence-of-length-k-with-the-largest-sum.js)|Medium| diff --git a/solutions/2081-sum-of-k-mirror-numbers.js b/solutions/2081-sum-of-k-mirror-numbers.js new file mode 100644 index 00000000..600d62d8 --- /dev/null +++ b/solutions/2081-sum-of-k-mirror-numbers.js @@ -0,0 +1,105 @@ +/** + * 2081. Sum of k-Mirror Numbers + * https://leetcode.com/problems/sum-of-k-mirror-numbers/ + * Difficulty: Hard + * + * A k-mirror number is a positive integer without leading zeros that reads the same both forward + * and backward in base-10 as well as in base-k. + * - For example, 9 is a 2-mirror number. The representation of 9 in base-10 and base-2 are 9 and + * 1001 respectively, which read the same both forward and backward. + * - On the contrary, 4 is not a 2-mirror number. The representation of 4 in base-2 is 100, which + * does not read the same both forward and backward. + * + * Given the base k and the number n, return the sum of the n smallest k-mirror numbers. + */ + +/** + * @param {number} k + * @param {number} n + * @return {number} + */ +var kMirror = function(k, n) { + const kMirrorNumbers = []; + let sum = 0; + let length = 1; + + while (kMirrorNumbers.length < n) { + generatePalindromes(length).forEach(num => { + if (kMirrorNumbers.length < n && isKMirror(num, k)) { + kMirrorNumbers.push(num); + sum += num; + } + }); + length++; + } + + return sum; +}; + +function toBaseK(num, k) { + if (num === 0) return '0'; + + let result = ''; + while (num > 0) { + result = (num % k) + result; + num = Math.floor(num / k); + } + + return result; +} + +function isKMirror(num, k) { + const baseKRepresentation = toBaseK(num, k); + return isPalindrome(baseKRepresentation); +} + +function isPalindrome(str) { + let left = 0; + let right = str.length - 1; + + while (left < right) { + if (str[left] !== str[right]) return false; + left++; + right--; + } + + return true; +} + +function generatePalindromes(length) { + const palindromes = []; + + if (length === 1) { + for (let i = 1; i <= 9; i++) { + palindromes.push(i); + } + return palindromes; + } + + if (length % 2 === 0) { + const half = length / 2; + const start = Math.pow(10, half - 1); + const end = Math.pow(10, half) - 1; + + for (let i = start; i <= end; i++) { + const firstHalf = i.toString(); + const secondHalf = firstHalf.split('').reverse().join(''); + palindromes.push(parseInt(firstHalf + secondHalf)); + } + } else { + const half = Math.floor(length / 2); + const start = Math.pow(10, half); + const end = Math.pow(10, half + 1) - 1; + + for (let i = start; i <= end; i++) { + const withoutMiddle = Math.floor(i / 10); + const middle = i % 10; + const firstHalf = withoutMiddle.toString(); + const secondHalf = firstHalf.split('').reverse().join(''); + palindromes.push(parseInt(firstHalf + middle + secondHalf)); + } + } + + return palindromes; +} + From 6174e00775db410d97e6f01958af06b35142bd85 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sun, 11 May 2025 00:41:54 -0500 Subject: [PATCH 026/571] Add solution #2086 --- README.md | 3 +- ...er-of-food-buckets-to-feed-the-hamsters.js | 43 +++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 solutions/2086-minimum-number-of-food-buckets-to-feed-the-hamsters.js diff --git a/README.md b/README.md index 30ad0a61..7976e60f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,734 LeetCode solutions in JavaScript +# 1,735 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1596,6 +1596,7 @@ 2080|[Range Frequency Queries](./solutions/2080-range-frequency-queries.js)|Medium| 2081|[Sum of k-Mirror Numbers](./solutions/2081-sum-of-k-mirror-numbers.js)|Hard| 2085|[Count Common Words With One Occurrence](./solutions/2085-count-common-words-with-one-occurrence.js)|Easy| +2086|[Minimum Number of Food Buckets to Feed the Hamsters](./solutions/2086-minimum-number-of-food-buckets-to-feed-the-hamsters.js)|Medium| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| 2099|[Find Subsequence of Length K With the Largest Sum](./solutions/2099-find-subsequence-of-length-k-with-the-largest-sum.js)|Medium| 2114|[Maximum Number of Words Found in Sentences](./solutions/2114-maximum-number-of-words-found-in-sentences.js)|Easy| diff --git a/solutions/2086-minimum-number-of-food-buckets-to-feed-the-hamsters.js b/solutions/2086-minimum-number-of-food-buckets-to-feed-the-hamsters.js new file mode 100644 index 00000000..5cda9132 --- /dev/null +++ b/solutions/2086-minimum-number-of-food-buckets-to-feed-the-hamsters.js @@ -0,0 +1,43 @@ +/** + * 2086. Minimum Number of Food Buckets to Feed the Hamsters + * https://leetcode.com/problems/minimum-number-of-food-buckets-to-feed-the-hamsters/ + * Difficulty: Medium + * + * You are given a 0-indexed string hamsters where hamsters[i] is either: + * - 'H' indicating that there is a hamster at index i, or + * - '.' indicating that index i is empty. + * + * You will add some number of food buckets at the empty indices in order to feed the hamsters. + * A hamster can be fed if there is at least one food bucket to its left or to its right. More + * formally, a hamster at index i can be fed if you place a food bucket at index i - 1 and/or + * at index i + 1. + * + * Return the minimum number of food buckets you should place at empty indices to feed all the + * hamsters or -1 if it is impossible to feed all of them. + */ + +/** + * @param {string} hamsters + * @return {number} + */ +var minimumBuckets = function(hamsters) { + const n = hamsters.length; + let result = 0; + + for (let i = 0; i < n; i++) { + if (hamsters[i] === 'H') { + if (i > 0 && hamsters[i - 1] === 'B') continue; + if (i < n - 1 && hamsters[i + 1] === '.') { + result++; + hamsters = hamsters.slice(0, i + 1) + 'B' + hamsters.slice(i + 2); + } else if (i > 0 && hamsters[i - 1] === '.') { + result++; + hamsters = hamsters.slice(0, i - 1) + 'B' + hamsters.slice(i); + } else { + return -1; + } + } + } + + return result; +}; From ae31f45925f2ac24332aba809c84bccc51246315 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sun, 11 May 2025 12:04:25 -0500 Subject: [PATCH 027/571] Add solution #2087 --- README.md | 3 +- ...um-cost-homecoming-of-a-robot-in-a-grid.js | 45 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 solutions/2087-minimum-cost-homecoming-of-a-robot-in-a-grid.js diff --git a/README.md b/README.md index 7976e60f..11720dc6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,735 LeetCode solutions in JavaScript +# 1,736 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1597,6 +1597,7 @@ 2081|[Sum of k-Mirror Numbers](./solutions/2081-sum-of-k-mirror-numbers.js)|Hard| 2085|[Count Common Words With One Occurrence](./solutions/2085-count-common-words-with-one-occurrence.js)|Easy| 2086|[Minimum Number of Food Buckets to Feed the Hamsters](./solutions/2086-minimum-number-of-food-buckets-to-feed-the-hamsters.js)|Medium| +2087|[Minimum Cost Homecoming of a Robot in a Grid](./solutions/2087-minimum-cost-homecoming-of-a-robot-in-a-grid.js)|Medium| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| 2099|[Find Subsequence of Length K With the Largest Sum](./solutions/2099-find-subsequence-of-length-k-with-the-largest-sum.js)|Medium| 2114|[Maximum Number of Words Found in Sentences](./solutions/2114-maximum-number-of-words-found-in-sentences.js)|Easy| diff --git a/solutions/2087-minimum-cost-homecoming-of-a-robot-in-a-grid.js b/solutions/2087-minimum-cost-homecoming-of-a-robot-in-a-grid.js new file mode 100644 index 00000000..8fde0697 --- /dev/null +++ b/solutions/2087-minimum-cost-homecoming-of-a-robot-in-a-grid.js @@ -0,0 +1,45 @@ +/** + * 2087. Minimum Cost Homecoming of a Robot in a Grid + * https://leetcode.com/problems/minimum-cost-homecoming-of-a-robot-in-a-grid/ + * Difficulty: Medium + * + * There is an m x n grid, where (0, 0) is the top-left cell and (m - 1, n - 1) is the bottom-right + * cell. You are given an integer array startPos where startPos = [startrow, startcol] indicates + * that initially, a robot is at the cell (startrow, startcol). You are also given an integer array + * homePos where homePos = [homerow, homecol] indicates that its home is at the cell (homerow, + * homecol). + * + * The robot needs to go to its home. It can move one cell in four directions: left, right, up, + * or down, and it can not move outside the boundary. Every move incurs some cost. You are further + * given two 0-indexed integer arrays: rowCosts of length m and colCosts of length n. + * - If the robot moves up or down into a cell whose row is r, then this move costs rowCosts[r]. + * - If the robot moves left or right into a cell whose column is c, then this move costs + * colCosts[c]. + * + * Return the minimum total cost for this robot to return home. + */ + +/** + * @param {number[]} startPos + * @param {number[]} homePos + * @param {number[]} rowCosts + * @param {number[]} colCosts + * @return {number} + */ +var minCost = function(startPos, homePos, rowCosts, colCosts) { + let result = 0; + const [startRow, startCol] = startPos; + const [homeRow, homeCol] = homePos; + + const rowStep = startRow < homeRow ? 1 : -1; + for (let row = startRow + rowStep; row !== homeRow + rowStep; row += rowStep) { + result += rowCosts[row]; + } + + const colStep = startCol < homeCol ? 1 : -1; + for (let col = startCol + colStep; col !== homeCol + colStep; col += colStep) { + result += colCosts[col]; + } + + return result; +}; From afd3cd562988d280df65c8bc571ac7ec70926c46 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sun, 11 May 2025 12:06:39 -0500 Subject: [PATCH 028/571] Add solution #2088 --- README.md | 3 +- .../2088-count-fertile-pyramids-in-a-land.js | 71 +++++++++++++++++++ 2 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 solutions/2088-count-fertile-pyramids-in-a-land.js diff --git a/README.md b/README.md index 11720dc6..beee4424 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,736 LeetCode solutions in JavaScript +# 1,737 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1598,6 +1598,7 @@ 2085|[Count Common Words With One Occurrence](./solutions/2085-count-common-words-with-one-occurrence.js)|Easy| 2086|[Minimum Number of Food Buckets to Feed the Hamsters](./solutions/2086-minimum-number-of-food-buckets-to-feed-the-hamsters.js)|Medium| 2087|[Minimum Cost Homecoming of a Robot in a Grid](./solutions/2087-minimum-cost-homecoming-of-a-robot-in-a-grid.js)|Medium| +2088|[Count Fertile Pyramids in a Land](./solutions/2088-count-fertile-pyramids-in-a-land.js)|Hard| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| 2099|[Find Subsequence of Length K With the Largest Sum](./solutions/2099-find-subsequence-of-length-k-with-the-largest-sum.js)|Medium| 2114|[Maximum Number of Words Found in Sentences](./solutions/2114-maximum-number-of-words-found-in-sentences.js)|Easy| diff --git a/solutions/2088-count-fertile-pyramids-in-a-land.js b/solutions/2088-count-fertile-pyramids-in-a-land.js new file mode 100644 index 00000000..0780710b --- /dev/null +++ b/solutions/2088-count-fertile-pyramids-in-a-land.js @@ -0,0 +1,71 @@ +/** + * 2088. Count Fertile Pyramids in a Land + * https://leetcode.com/problems/count-fertile-pyramids-in-a-land/ + * Difficulty: Hard + * + * A farmer has a rectangular grid of land with m rows and n columns that can be divided into + * unit cells. Each cell is either fertile (represented by a 1) or barren (represented by a 0). + * All cells outside the grid are considered barren. + * + * A pyramidal plot of land can be defined as a set of cells with the following criteria: + * 1. The number of cells in the set has to be greater than 1 and all cells must be fertile. + * 2. The apex of a pyramid is the topmost cell of the pyramid. The height of a pyramid is the + * number of rows it covers. Let (r, c) be the apex of the pyramid, and its height be h. + * Then, the plot comprises of cells (i, j) where r <= i <= r + h - 1 and + * c - (i - r) <= j <= c + (i - r). + * + * An inverse pyramidal plot of land can be defined as a set of cells with similar criteria: + * 1. The number of cells in the set has to be greater than 1 and all cells must be fertile. + * 2. The apex of an inverse pyramid is the bottommost cell of the inverse pyramid. The height + * of an inverse pyramid is the number of rows it covers. Let (r, c) be the apex of the + * pyramid, and its height be h. Then, the plot comprises of cells (i, j) where + * r - h + 1 <= i <= r and c - (r - i) <= j <= c + (r - i). + * + * Some examples of valid and invalid pyramidal (and inverse pyramidal) plots are shown below. + * Black cells indicate fertile cells. + * + * Given a 0-indexed m x n binary matrix grid representing the farmland, return the total number + * of pyramidal and inverse pyramidal plots that can be found in grid. + */ + +/** + * @param {number[][]} grid + * @return {number} + */ +var countPyramids = function(grid) { + const rows = grid.length; + const cols = grid[0].length; + let result = 0; + + for (let i = 0; i < rows; i++) { + for (let j = 0; j < cols; j++) { + if (grid[i][j] === 1) { + result += countPyramidAt(i, j, false); + result += countPyramidAt(i, j, true); + } + } + } + + return result; + + function countPyramidAt(row, col, isInverse) { + let height = 0; + for (let h = 1; ; h++) { + const r = isInverse ? row - h : row + h; + if (r < 0 || r >= rows) break; + const left = col - h; + const right = col + h; + if (left < 0 || right >= cols) break; + let valid = true; + for (let j = left; j <= right; j++) { + if (grid[r][j] === 0) { + valid = false; + break; + } + } + if (!valid) break; + height++; + } + return height; + } +}; From e7b6bc6f9faced76d2eb870711237cea6b70f732 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sun, 11 May 2025 12:07:46 -0500 Subject: [PATCH 029/571] Add solution #2089 --- README.md | 3 +- ...find-target-indices-after-sorting-array.js | 32 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 solutions/2089-find-target-indices-after-sorting-array.js diff --git a/README.md b/README.md index beee4424..1c66a2c3 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,737 LeetCode solutions in JavaScript +# 1,738 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1599,6 +1599,7 @@ 2086|[Minimum Number of Food Buckets to Feed the Hamsters](./solutions/2086-minimum-number-of-food-buckets-to-feed-the-hamsters.js)|Medium| 2087|[Minimum Cost Homecoming of a Robot in a Grid](./solutions/2087-minimum-cost-homecoming-of-a-robot-in-a-grid.js)|Medium| 2088|[Count Fertile Pyramids in a Land](./solutions/2088-count-fertile-pyramids-in-a-land.js)|Hard| +2089|[Find Target Indices After Sorting Array](./solutions/2089-find-target-indices-after-sorting-array.js)|Easy| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| 2099|[Find Subsequence of Length K With the Largest Sum](./solutions/2099-find-subsequence-of-length-k-with-the-largest-sum.js)|Medium| 2114|[Maximum Number of Words Found in Sentences](./solutions/2114-maximum-number-of-words-found-in-sentences.js)|Easy| diff --git a/solutions/2089-find-target-indices-after-sorting-array.js b/solutions/2089-find-target-indices-after-sorting-array.js new file mode 100644 index 00000000..c7235faa --- /dev/null +++ b/solutions/2089-find-target-indices-after-sorting-array.js @@ -0,0 +1,32 @@ +/** + * 2089. Find Target Indices After Sorting Array + * https://leetcode.com/problems/find-target-indices-after-sorting-array/ + * Difficulty: Easy + * + * You are given a 0-indexed integer array nums and a target element target. + * + * A target index is an index i such that nums[i] == target. + * + * Return a list of the target indices of nums after sorting nums in non-decreasing order. + * If there are no target indices, return an empty list. The returned list must be sorted + * in increasing order. + */ + +/** + * @param {number[]} nums + * @param {number} target + * @return {number[]} + */ +var targetIndices = function(nums, target) { + const result = []; + + nums.sort((a, b) => a - b); + + for (let i = 0; i < nums.length; i++) { + if (nums[i] === target) { + result.push(i); + } + } + + return result; +}; From 4eb48220736eb2e263d57daaa98f765987945b99 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sun, 11 May 2025 12:09:32 -0500 Subject: [PATCH 030/571] Add solution #2090 --- README.md | 3 +- solutions/2090-k-radius-subarray-averages.js | 46 ++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 solutions/2090-k-radius-subarray-averages.js diff --git a/README.md b/README.md index 1c66a2c3..e9c64729 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,738 LeetCode solutions in JavaScript +# 1,739 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1600,6 +1600,7 @@ 2087|[Minimum Cost Homecoming of a Robot in a Grid](./solutions/2087-minimum-cost-homecoming-of-a-robot-in-a-grid.js)|Medium| 2088|[Count Fertile Pyramids in a Land](./solutions/2088-count-fertile-pyramids-in-a-land.js)|Hard| 2089|[Find Target Indices After Sorting Array](./solutions/2089-find-target-indices-after-sorting-array.js)|Easy| +2090|[K Radius Subarray Averages](./solutions/2090-k-radius-subarray-averages.js)|Medium| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| 2099|[Find Subsequence of Length K With the Largest Sum](./solutions/2099-find-subsequence-of-length-k-with-the-largest-sum.js)|Medium| 2114|[Maximum Number of Words Found in Sentences](./solutions/2114-maximum-number-of-words-found-in-sentences.js)|Easy| diff --git a/solutions/2090-k-radius-subarray-averages.js b/solutions/2090-k-radius-subarray-averages.js new file mode 100644 index 00000000..3808077d --- /dev/null +++ b/solutions/2090-k-radius-subarray-averages.js @@ -0,0 +1,46 @@ +/** + * 2090. K Radius Subarray Averages + * https://leetcode.com/problems/k-radius-subarray-averages/ + * Difficulty: Medium + * + * You are given a 0-indexed array nums of n integers, and an integer k. + * + * The k-radius average for a subarray of nums centered at some index i with the radius k is + * the average of all elements in nums between the indices i - k and i + k (inclusive). If + * there are less than k elements before or after the index i, then the k-radius average is -1. + * + * Build and return an array avgs of length n where avgs[i] is the k-radius average for the + * subarray centered at index i. + * + * The average of x elements is the sum of the x elements divided by x, using integer division. + * The integer division truncates toward zero, which means losing its fractional part. + * - For example, the average of four elements 2, 3, 1, and + * 5 is (2 + 3 + 1 + 5) / 4 = 11 / 4 = 2.75, which truncates to 2. + */ + +/** + * @param {number[]} nums + * @param {number} k + * @return {number[]} + */ +var getAverages = function(nums, k) { + const n = nums.length; + const windowSize = 2 * k + 1; + const result = new Array(n).fill(-1); + + if (windowSize > n) return result; + + let sum = 0; + for (let i = 0; i < windowSize; i++) { + sum += nums[i]; + } + + result[k] = Math.floor(sum / windowSize); + + for (let i = k + 1; i < n - k; i++) { + sum = sum - nums[i - k - 1] + nums[i + k]; + result[i] = Math.floor(sum / windowSize); + } + + return result; +}; From 3d7d4e31dee60250bcf677ed696477af32dec9a5 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sun, 11 May 2025 12:10:36 -0500 Subject: [PATCH 031/571] Add solution #2091 --- README.md | 3 +- ...removing-minimum-and-maximum-from-array.js | 41 +++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 solutions/2091-removing-minimum-and-maximum-from-array.js diff --git a/README.md b/README.md index e9c64729..e3ca3f9a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,739 LeetCode solutions in JavaScript +# 1,740 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1601,6 +1601,7 @@ 2088|[Count Fertile Pyramids in a Land](./solutions/2088-count-fertile-pyramids-in-a-land.js)|Hard| 2089|[Find Target Indices After Sorting Array](./solutions/2089-find-target-indices-after-sorting-array.js)|Easy| 2090|[K Radius Subarray Averages](./solutions/2090-k-radius-subarray-averages.js)|Medium| +2091|[Removing Minimum and Maximum From Array](./solutions/2091-removing-minimum-and-maximum-from-array.js)|Medium| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| 2099|[Find Subsequence of Length K With the Largest Sum](./solutions/2099-find-subsequence-of-length-k-with-the-largest-sum.js)|Medium| 2114|[Maximum Number of Words Found in Sentences](./solutions/2114-maximum-number-of-words-found-in-sentences.js)|Easy| diff --git a/solutions/2091-removing-minimum-and-maximum-from-array.js b/solutions/2091-removing-minimum-and-maximum-from-array.js new file mode 100644 index 00000000..b62e781e --- /dev/null +++ b/solutions/2091-removing-minimum-and-maximum-from-array.js @@ -0,0 +1,41 @@ +/** + * 2091. Removing Minimum and Maximum From Array + * https://leetcode.com/problems/removing-minimum-and-maximum-from-array/ + * Difficulty: Medium + * + * You are given a 0-indexed array of distinct integers nums. + * + * There is an element in nums that has the lowest value and an element that has the highest + * value. We call them the minimum and maximum respectively. Your goal is to remove both these + * elements from the array. + * + * A deletion is defined as either removing an element from the front of the array or removing + * an element from the back of the array. + * + * Return the minimum number of deletions it would take to remove both the minimum and maximum + * element from the array. + */ + +/** + * @param {number[]} nums + * @return {number} + */ +var minimumDeletions = function(nums) { + const n = nums.length; + let minIndex = 0; + let maxIndex = 0; + + for (let i = 1; i < n; i++) { + if (nums[i] < nums[minIndex]) minIndex = i; + if (nums[i] > nums[maxIndex]) maxIndex = i; + } + + const left = Math.min(minIndex, maxIndex); + const right = Math.max(minIndex, maxIndex); + + return Math.min( + right + 1, + n - left, + left + 1 + n - right + ); +}; From dfb90fbab23bc756b0f34f2880f823ad542840c8 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sun, 11 May 2025 22:07:59 -0500 Subject: [PATCH 032/571] Add solution #2092 --- README.md | 3 +- solutions/2092-find-all-people-with-secret.js | 73 +++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 solutions/2092-find-all-people-with-secret.js diff --git a/README.md b/README.md index e3ca3f9a..b0bd05db 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,740 LeetCode solutions in JavaScript +# 1,741 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1602,6 +1602,7 @@ 2089|[Find Target Indices After Sorting Array](./solutions/2089-find-target-indices-after-sorting-array.js)|Easy| 2090|[K Radius Subarray Averages](./solutions/2090-k-radius-subarray-averages.js)|Medium| 2091|[Removing Minimum and Maximum From Array](./solutions/2091-removing-minimum-and-maximum-from-array.js)|Medium| +2092|[Find All People With Secret](./solutions/2092-find-all-people-with-secret.js)|Hard| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| 2099|[Find Subsequence of Length K With the Largest Sum](./solutions/2099-find-subsequence-of-length-k-with-the-largest-sum.js)|Medium| 2114|[Maximum Number of Words Found in Sentences](./solutions/2114-maximum-number-of-words-found-in-sentences.js)|Easy| diff --git a/solutions/2092-find-all-people-with-secret.js b/solutions/2092-find-all-people-with-secret.js new file mode 100644 index 00000000..f5fecbdc --- /dev/null +++ b/solutions/2092-find-all-people-with-secret.js @@ -0,0 +1,73 @@ +/** + * 2092. Find All People With Secret + * https://leetcode.com/problems/find-all-people-with-secret/ + * Difficulty: Hard + * + * You are given an integer n indicating there are n people numbered from 0 to n - 1. You are also + * given a 0-indexed 2D integer array meetings where meetings[i] = [xi, yi, timei] indicates that + * person xi and person yi have a meeting at timei. A person may attend multiple meetings at the + * same time. Finally, you are given an integer firstPerson. + * + * Person 0 has a secret and initially shares the secret with a person firstPerson at time 0. This + * secret is then shared every time a meeting takes place with a person that has the secret. More + * formally, for every meeting, if a person xi has the secret at timei, then they will share the + * secret with person yi, and vice versa. + * + * The secrets are shared instantaneously. That is, a person may receive the secret and share it + * with people in other meetings within the same time frame. + * + * Return a list of all the people that have the secret after all the meetings have taken place. + * You may return the answer in any order. + */ + +/** + * @param {number} n + * @param {number[][]} meetings + * @param {number} firstPerson + * @return {number[]} + */ +var findAllPeople = function(n, meetings, firstPerson) { + const parent = Array.from({ length: n }, (_, i) => i); + + union(0, firstPerson); + meetings.sort((a, b) => a[2] - b[2]); + + let i = 0; + while (i < meetings.length) { + const currentTime = meetings[i][2]; + const group = []; + + while (i < meetings.length && meetings[i][2] === currentTime) { + const [x, y] = meetings[i]; + group.push(x, y); + union(x, y); + i++; + } + + for (const person of group) { + if (find(person) !== find(0)) { + parent[person] = person; + } + } + } + + const result = []; + for (let j = 0; j < n; j++) { + if (find(j) === find(0)) { + result.push(j); + } + } + + return result; + + function find(x) { + if (parent[x] !== x) { + parent[x] = find(parent[x]); + } + return parent[x]; + } + + function union(x, y) { + parent[find(x)] = find(y); + } +}; From be2fea9b7d363b98e65cbe09526691d71edf6bd5 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sun, 11 May 2025 22:08:58 -0500 Subject: [PATCH 033/571] Add solution #2094 --- README.md | 3 +- .../2094-finding-3-digit-even-numbers.js | 51 +++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 solutions/2094-finding-3-digit-even-numbers.js diff --git a/README.md b/README.md index b0bd05db..4156b28f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,741 LeetCode solutions in JavaScript +# 1,742 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1603,6 +1603,7 @@ 2090|[K Radius Subarray Averages](./solutions/2090-k-radius-subarray-averages.js)|Medium| 2091|[Removing Minimum and Maximum From Array](./solutions/2091-removing-minimum-and-maximum-from-array.js)|Medium| 2092|[Find All People With Secret](./solutions/2092-find-all-people-with-secret.js)|Hard| +2094|[Finding 3-Digit Even Numbers](./solutions/2094-finding-3-digit-even-numbers.js)|Easy| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| 2099|[Find Subsequence of Length K With the Largest Sum](./solutions/2099-find-subsequence-of-length-k-with-the-largest-sum.js)|Medium| 2114|[Maximum Number of Words Found in Sentences](./solutions/2114-maximum-number-of-words-found-in-sentences.js)|Easy| diff --git a/solutions/2094-finding-3-digit-even-numbers.js b/solutions/2094-finding-3-digit-even-numbers.js new file mode 100644 index 00000000..f021bdff --- /dev/null +++ b/solutions/2094-finding-3-digit-even-numbers.js @@ -0,0 +1,51 @@ +/** + * 2094. Finding 3-Digit Even Numbers + * https://leetcode.com/problems/finding-3-digit-even-numbers/ + * Difficulty: Easy + * + * You are given an integer array digits, where each element is a digit. The array may contain + * duplicates. + * + * You need to find all the unique integers that follow the given requirements: + * - The integer consists of the concatenation of three elements from digits in any arbitrary order. + * - The integer does not have leading zeros. + * - The integer is even. + * + * For example, if the given digits were [1, 2, 3], integers 132 and 312 follow the requirements. + * + * Return a sorted array of the unique integers. + */ + +/** + * @param {number[]} digits + * @return {number[]} + */ +var findEvenNumbers = function(digits) { + const frequency = new Array(10).fill(0); + const uniqueNumbers = new Set(); + + for (const digit of digits) { + frequency[digit]++; + } + + for (let hundreds = 1; hundreds <= 9; hundreds++) { + if (frequency[hundreds] === 0) continue; + frequency[hundreds]--; + + for (let tens = 0; tens <= 9; tens++) { + if (frequency[tens] === 0) continue; + frequency[tens]--; + + for (let ones = 0; ones <= 8; ones += 2) { + if (frequency[ones] === 0) continue; + uniqueNumbers.add(hundreds * 100 + tens * 10 + ones); + } + + frequency[tens]++; + } + + frequency[hundreds]++; + } + + return Array.from(uniqueNumbers).sort((a, b) => a - b); +}; From f222dd292e9f8f6e9eeddfe14668d606b7eddc07 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sun, 11 May 2025 22:10:46 -0500 Subject: [PATCH 034/571] Add solution #2096 --- README.md | 3 +- ...ions-from-a-binary-tree-node-to-another.js | 65 +++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 solutions/2096-step-by-step-directions-from-a-binary-tree-node-to-another.js diff --git a/README.md b/README.md index 4156b28f..e0d000fe 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,742 LeetCode solutions in JavaScript +# 1,743 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1605,6 +1605,7 @@ 2092|[Find All People With Secret](./solutions/2092-find-all-people-with-secret.js)|Hard| 2094|[Finding 3-Digit Even Numbers](./solutions/2094-finding-3-digit-even-numbers.js)|Easy| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| +2096|[Step-By-Step Directions From a Binary Tree Node to Another](./solutions/2096-step-by-step-directions-from-a-binary-tree-node-to-another.js)|Medium| 2099|[Find Subsequence of Length K With the Largest Sum](./solutions/2099-find-subsequence-of-length-k-with-the-largest-sum.js)|Medium| 2114|[Maximum Number of Words Found in Sentences](./solutions/2114-maximum-number-of-words-found-in-sentences.js)|Easy| 2115|[Find All Possible Recipes from Given Supplies](./solutions/2115-find-all-possible-recipes-from-given-supplies.js)|Medium| diff --git a/solutions/2096-step-by-step-directions-from-a-binary-tree-node-to-another.js b/solutions/2096-step-by-step-directions-from-a-binary-tree-node-to-another.js new file mode 100644 index 00000000..4eb7d4e9 --- /dev/null +++ b/solutions/2096-step-by-step-directions-from-a-binary-tree-node-to-another.js @@ -0,0 +1,65 @@ +/** + * 2096. Step-By-Step Directions From a Binary Tree Node to Another + * https://leetcode.com/problems/step-by-step-directions-from-a-binary-tree-node-to-another/ + * Difficulty: Medium + * + * You are given the root of a binary tree with n nodes. Each node is uniquely assigned a value + * from 1 to n. You are also given an integer startValue representing the value of the start node + * s, and a different integer destValue representing the value of the destination node t. + * + * Find the shortest path starting from node s and ending at node t. Generate step-by-step + * directions of such path as a string consisting of only the uppercase letters 'L', 'R', and + * 'U'. Each letter indicates a specific direction: + * - 'L' means to go from a node to its left child node. + * - 'R' means to go from a node to its right child node. + * - 'U' means to go from a node to its parent node. + * + * Return the step-by-step directions of the shortest path from node s to node t. + */ + +/** + * Definition for a binary tree node. + * function TreeNode(val, left, right) { + * this.val = (val===undefined ? 0 : val) + * this.left = (left===undefined ? null : left) + * this.right = (right===undefined ? null : right) + * } + */ +/** + * @param {TreeNode} root + * @param {number} startValue + * @param {number} destValue + * @return {string} + */ +var getDirections = function(root, startValue, destValue) { + const startPath = []; + const destPath = []; + + findPath(root, startValue, startPath); + findPath(root, destValue, destPath); + + let i = 0; + while (i < startPath.length && i < destPath.length && startPath[i] === destPath[i]) { + i++; + } + + const upMoves = 'U'.repeat(startPath.length - i); + const downMoves = destPath.slice(i).join(''); + + return upMoves + downMoves; + + function findPath(node, value, path) { + if (!node) return false; + if (node.val === value) return true; + + path.push('L'); + if (findPath(node.left, value, path)) return true; + path.pop(); + + path.push('R'); + if (findPath(node.right, value, path)) return true; + path.pop(); + + return false; + } +}; From bbd19a6e18ec4151bdc37c63ac5211688f2b06b0 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sun, 11 May 2025 22:12:11 -0500 Subject: [PATCH 035/571] Add solution #2097 --- README.md | 3 +- solutions/2097-valid-arrangement-of-pairs.js | 50 ++++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 solutions/2097-valid-arrangement-of-pairs.js diff --git a/README.md b/README.md index e0d000fe..46598faa 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,743 LeetCode solutions in JavaScript +# 1,744 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1606,6 +1606,7 @@ 2094|[Finding 3-Digit Even Numbers](./solutions/2094-finding-3-digit-even-numbers.js)|Easy| 2095|[Delete the Middle Node of a Linked List](./solutions/2095-delete-the-middle-node-of-a-linked-list.js)|Medium| 2096|[Step-By-Step Directions From a Binary Tree Node to Another](./solutions/2096-step-by-step-directions-from-a-binary-tree-node-to-another.js)|Medium| +2097|[Valid Arrangement of Pairs](./solutions/2097-valid-arrangement-of-pairs.js)|Hard| 2099|[Find Subsequence of Length K With the Largest Sum](./solutions/2099-find-subsequence-of-length-k-with-the-largest-sum.js)|Medium| 2114|[Maximum Number of Words Found in Sentences](./solutions/2114-maximum-number-of-words-found-in-sentences.js)|Easy| 2115|[Find All Possible Recipes from Given Supplies](./solutions/2115-find-all-possible-recipes-from-given-supplies.js)|Medium| diff --git a/solutions/2097-valid-arrangement-of-pairs.js b/solutions/2097-valid-arrangement-of-pairs.js new file mode 100644 index 00000000..d3c5ee1c --- /dev/null +++ b/solutions/2097-valid-arrangement-of-pairs.js @@ -0,0 +1,50 @@ +/** + * 2097. Valid Arrangement of Pairs + * https://leetcode.com/problems/valid-arrangement-of-pairs/ + * Difficulty: Hard + * + * You are given a 0-indexed 2D integer array pairs where pairs[i] = [starti, endi]. An arrangement + * of pairs is valid if for every index i where 1 <= i < pairs.length, we have endi-1 == starti. + * + * Return any valid arrangement of pairs. + * + * Note: The inputs will be generated such that there exists a valid arrangement of pairs. + */ + +/** + * @param {number[][]} pairs + * @return {number[][]} + */ +var validArrangement = function(pairs) { + const graph = new Map(); + const degree = new Map(); + + for (const [start, end] of pairs) { + if (!graph.has(start)) graph.set(start, []); + graph.get(start).push(end); + + degree.set(start, (degree.get(start) || 0) + 1); + degree.set(end, (degree.get(end) || 0) - 1); + } + + let startNode = pairs[0][0]; + for (const [node, deg] of degree) { + if (deg > 0) { + startNode = node; + break; + } + } + + const result = []; + helper(startNode); + + return result.reverse(); + + function helper(node) { + while (graph.get(node)?.length) { + const next = graph.get(node).pop(); + helper(next); + result.push([node, next]); + } + } +}; From 952b4b802ff03908f9874faea2654ce15e5b824e Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Sun, 11 May 2025 22:14:02 -0500 Subject: [PATCH 036/571] Add solution #2100 --- README.md | 3 +- .../2100-find-good-days-to-rob-the-bank.js | 50 +++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 solutions/2100-find-good-days-to-rob-the-bank.js diff --git a/README.md b/README.md index 46598faa..01efa306 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,744 LeetCode solutions in JavaScript +# 1,745 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1608,6 +1608,7 @@ 2096|[Step-By-Step Directions From a Binary Tree Node to Another](./solutions/2096-step-by-step-directions-from-a-binary-tree-node-to-another.js)|Medium| 2097|[Valid Arrangement of Pairs](./solutions/2097-valid-arrangement-of-pairs.js)|Hard| 2099|[Find Subsequence of Length K With the Largest Sum](./solutions/2099-find-subsequence-of-length-k-with-the-largest-sum.js)|Medium| +2100|[Find Good Days to Rob the Bank](./solutions/2100-find-good-days-to-rob-the-bank.js)|Medium| 2114|[Maximum Number of Words Found in Sentences](./solutions/2114-maximum-number-of-words-found-in-sentences.js)|Easy| 2115|[Find All Possible Recipes from Given Supplies](./solutions/2115-find-all-possible-recipes-from-given-supplies.js)|Medium| 2116|[Check if a Parentheses String Can Be Valid](./solutions/2116-check-if-a-parentheses-string-can-be-valid.js)|Medium| diff --git a/solutions/2100-find-good-days-to-rob-the-bank.js b/solutions/2100-find-good-days-to-rob-the-bank.js new file mode 100644 index 00000000..1dc59611 --- /dev/null +++ b/solutions/2100-find-good-days-to-rob-the-bank.js @@ -0,0 +1,50 @@ +/** + * 2100. Find Good Days to Rob the Bank + * https://leetcode.com/problems/find-good-days-to-rob-the-bank/ + * Difficulty: Medium + * + * You and a gang of thieves are planning on robbing a bank. You are given a 0-indexed integer + * array security, where security[i] is the number of guards on duty on the ith day. The days + * are numbered starting from 0. You are also given an integer time. + * + * The ith day is a good day to rob the bank if: + * - There are at least time days before and after the ith day, + * - The number of guards at the bank for the time days before i are non-increasing, and + * - The number of guards at the bank for the time days after i are non-decreasing. + * + * More formally, this means day i is a good day to rob the bank if and only if + * security[i - time] >= security[i - time + 1] >= ... >= security[i] + * <= ... <= security[i + time - 1] <= security[i + time]. + * + * Return a list of all days (0-indexed) that are good days to rob the bank. The order that the + * days are returned in does not matter. + */ + +/** + * @param {number[]} security + * @param {number} time + * @return {number[]} + */ +var goodDaysToRobBank = function(security, time) { + const n = security.length; + const nonIncreasing = new Array(n).fill(0); + const nonDecreasing = new Array(n).fill(0); + const result = []; + + for (let i = 1; i < n; i++) { + if (security[i] <= security[i - 1]) { + nonIncreasing[i] = nonIncreasing[i - 1] + 1; + } + if (security[n - i - 1] <= security[n - i]) { + nonDecreasing[n - i - 1] = nonDecreasing[n - i] + 1; + } + } + + for (let i = time; i < n - time; i++) { + if (nonIncreasing[i] >= time && nonDecreasing[i] >= time) { + result.push(i); + } + } + + return result; +}; From d31482340034a2680a256db71dafae06b05ca252 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Mon, 12 May 2025 08:12:00 -0500 Subject: [PATCH 037/571] Add solution #2101 --- README.md | 3 +- solutions/2101-detonate-the-maximum-bombs.js | 57 ++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 solutions/2101-detonate-the-maximum-bombs.js diff --git a/README.md b/README.md index 01efa306..46d7bd18 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,745 LeetCode solutions in JavaScript +# 1,746 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1609,6 +1609,7 @@ 2097|[Valid Arrangement of Pairs](./solutions/2097-valid-arrangement-of-pairs.js)|Hard| 2099|[Find Subsequence of Length K With the Largest Sum](./solutions/2099-find-subsequence-of-length-k-with-the-largest-sum.js)|Medium| 2100|[Find Good Days to Rob the Bank](./solutions/2100-find-good-days-to-rob-the-bank.js)|Medium| +2101|[Detonate the Maximum Bombs](./solutions/2101-detonate-the-maximum-bombs.js)|Medium| 2114|[Maximum Number of Words Found in Sentences](./solutions/2114-maximum-number-of-words-found-in-sentences.js)|Easy| 2115|[Find All Possible Recipes from Given Supplies](./solutions/2115-find-all-possible-recipes-from-given-supplies.js)|Medium| 2116|[Check if a Parentheses String Can Be Valid](./solutions/2116-check-if-a-parentheses-string-can-be-valid.js)|Medium| diff --git a/solutions/2101-detonate-the-maximum-bombs.js b/solutions/2101-detonate-the-maximum-bombs.js new file mode 100644 index 00000000..11069857 --- /dev/null +++ b/solutions/2101-detonate-the-maximum-bombs.js @@ -0,0 +1,57 @@ +/** + * 2101. Detonate the Maximum Bombs + * https://leetcode.com/problems/detonate-the-maximum-bombs/ + * Difficulty: Medium + * + * You are given a list of bombs. The range of a bomb is defined as the area where its effect + * can be felt. This area is in the shape of a circle with the center as the location of the bomb. + * + * The bombs are represented by a 0-indexed 2D integer array bombs where bombs[i] = [xi, yi, ri]. + * xi and yi denote the X-coordinate and Y-coordinate of the location of the ith bomb, whereas ri + * denotes the radius of its range. + * + * You may choose to detonate a single bomb. When a bomb is detonated, it will detonate all bombs + * that lie in its range. These bombs will further detonate the bombs that lie in their ranges. + * + * Given the list of bombs, return the maximum number of bombs that can be detonated if you are + * allowed to detonate only one bomb. + */ + +/** + * @param {number[][]} bombs + * @return {number} + */ +var maximumDetonation = function(bombs) { + const n = bombs.length; + const graph = Array.from({ length: n }, () => []); + + for (let i = 0; i < n; i++) { + const [x1, y1, r1] = bombs[i]; + for (let j = 0; j < n; j++) { + if (i === j) continue; + const [x2, y2] = bombs[j]; + const distance = Math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2); + if (distance <= r1) { + graph[i].push(j); + } + } + } + + let result = 0; + for (let i = 0; i < n; i++) { + result = Math.max(result, dfs(i, new Set())); + } + + return result; + + function dfs(node, visited) { + visited.add(node); + let count = 1; + for (const neighbor of graph[node]) { + if (!visited.has(neighbor)) { + count += dfs(neighbor, visited); + } + } + return count; + } +}; From 05f52643b7ee3b73901dd92af71c920bde1453f0 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Mon, 12 May 2025 08:13:44 -0500 Subject: [PATCH 038/571] Add solution #2103 --- README.md | 3 ++- solutions/2103-rings-and-rods.js | 42 ++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 solutions/2103-rings-and-rods.js diff --git a/README.md b/README.md index 46d7bd18..797e1157 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,746 LeetCode solutions in JavaScript +# 1,747 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1610,6 +1610,7 @@ 2099|[Find Subsequence of Length K With the Largest Sum](./solutions/2099-find-subsequence-of-length-k-with-the-largest-sum.js)|Medium| 2100|[Find Good Days to Rob the Bank](./solutions/2100-find-good-days-to-rob-the-bank.js)|Medium| 2101|[Detonate the Maximum Bombs](./solutions/2101-detonate-the-maximum-bombs.js)|Medium| +2103|[Rings and Rods](./solutions/2103-rings-and-rods.js)|Easy| 2114|[Maximum Number of Words Found in Sentences](./solutions/2114-maximum-number-of-words-found-in-sentences.js)|Easy| 2115|[Find All Possible Recipes from Given Supplies](./solutions/2115-find-all-possible-recipes-from-given-supplies.js)|Medium| 2116|[Check if a Parentheses String Can Be Valid](./solutions/2116-check-if-a-parentheses-string-can-be-valid.js)|Medium| diff --git a/solutions/2103-rings-and-rods.js b/solutions/2103-rings-and-rods.js new file mode 100644 index 00000000..b7cc219e --- /dev/null +++ b/solutions/2103-rings-and-rods.js @@ -0,0 +1,42 @@ +/** + * 2103. Rings and Rods + * https://leetcode.com/problems/rings-and-rods/ + * Difficulty: Easy + * + * There are n rings and each ring is either red, green, or blue. The rings are distributed across + * ten rods labeled from 0 to 9. + * + * You are given a string rings of length 2n that describes the n rings that are placed onto the + * rods. Every two characters in rings forms a color-position pair that is used to describe each + * ring where: + * - The first character of the ith pair denotes the ith ring's color ('R', 'G', 'B'). + * - The second character of the ith pair denotes the rod that the ith ring is placed on + * ('0' to '9'). + * + * For example, "R3G2B1" describes n == 3 rings: a red ring placed onto the rod labeled 3, a green + * ring placed onto the rod labeled 2, and a blue ring placed onto the rod labeled 1. + * + * Return the number of rods that have all three colors of rings on them. + */ + +/** + * @param {string} rings + * @return {number} + */ +var countPoints = function(rings) { + const map = new Map(); + + for (let i = 0; i < rings.length; i += 2) { + const color = rings[i]; + const rod = rings[i + 1]; + if (!map.has(rod)) map.set(rod, new Set()); + map.get(rod).add(color); + } + + let result = 0; + for (const colors of map.values()) { + if (colors.size === 3) result++; + } + + return result; +}; From dc08ccadafae200205d3e8e2ef2065abc92f5c5d Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Mon, 12 May 2025 08:16:56 -0500 Subject: [PATCH 039/571] Add solution #2104 --- README.md | 3 ++- solutions/2104-sum-of-subarray-ranges.js | 33 ++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 solutions/2104-sum-of-subarray-ranges.js diff --git a/README.md b/README.md index 797e1157..00486aa9 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,747 LeetCode solutions in JavaScript +# 1,748 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1611,6 +1611,7 @@ 2100|[Find Good Days to Rob the Bank](./solutions/2100-find-good-days-to-rob-the-bank.js)|Medium| 2101|[Detonate the Maximum Bombs](./solutions/2101-detonate-the-maximum-bombs.js)|Medium| 2103|[Rings and Rods](./solutions/2103-rings-and-rods.js)|Easy| +2104|[Sum of Subarray Ranges](./solutions/2104-sum-of-subarray-ranges.js)|Medium| 2114|[Maximum Number of Words Found in Sentences](./solutions/2114-maximum-number-of-words-found-in-sentences.js)|Easy| 2115|[Find All Possible Recipes from Given Supplies](./solutions/2115-find-all-possible-recipes-from-given-supplies.js)|Medium| 2116|[Check if a Parentheses String Can Be Valid](./solutions/2116-check-if-a-parentheses-string-can-be-valid.js)|Medium| diff --git a/solutions/2104-sum-of-subarray-ranges.js b/solutions/2104-sum-of-subarray-ranges.js new file mode 100644 index 00000000..0efaf1d7 --- /dev/null +++ b/solutions/2104-sum-of-subarray-ranges.js @@ -0,0 +1,33 @@ +/** + * 2104. Sum of Subarray Ranges + * https://leetcode.com/problems/sum-of-subarray-ranges/ + * Difficulty: Medium + * + * You are given an integer array nums. The range of a subarray of nums is the difference between + * the largest and smallest element in the subarray. + * + * Return the sum of all subarray ranges of nums. + * + * A subarray is a contiguous non-empty sequence of elements within an array. + */ + +/** + * @param {number[]} nums + * @return {number} + */ +var subArrayRanges = function(nums) { + let result = 0; + + for (let i = 0; i < nums.length; i++) { + let min = nums[i]; + let max = nums[i]; + + for (let j = i; j < nums.length; j++) { + min = Math.min(min, nums[j]); + max = Math.max(max, nums[j]); + result += max - min; + } + } + + return result; +}; From 19e669ae90eb553a4c9548c877f146848fc35ab8 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Mon, 12 May 2025 08:19:10 -0500 Subject: [PATCH 040/571] Add solution #2105 --- README.md | 3 +- solutions/2105-watering-plants-ii.js | 61 ++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 solutions/2105-watering-plants-ii.js diff --git a/README.md b/README.md index 00486aa9..88f126ac 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,748 LeetCode solutions in JavaScript +# 1,749 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1612,6 +1612,7 @@ 2101|[Detonate the Maximum Bombs](./solutions/2101-detonate-the-maximum-bombs.js)|Medium| 2103|[Rings and Rods](./solutions/2103-rings-and-rods.js)|Easy| 2104|[Sum of Subarray Ranges](./solutions/2104-sum-of-subarray-ranges.js)|Medium| +2105|[Watering Plants II](./solutions/2105-watering-plants-ii.js)|Medium| 2114|[Maximum Number of Words Found in Sentences](./solutions/2114-maximum-number-of-words-found-in-sentences.js)|Easy| 2115|[Find All Possible Recipes from Given Supplies](./solutions/2115-find-all-possible-recipes-from-given-supplies.js)|Medium| 2116|[Check if a Parentheses String Can Be Valid](./solutions/2116-check-if-a-parentheses-string-can-be-valid.js)|Medium| diff --git a/solutions/2105-watering-plants-ii.js b/solutions/2105-watering-plants-ii.js new file mode 100644 index 00000000..dcdaf994 --- /dev/null +++ b/solutions/2105-watering-plants-ii.js @@ -0,0 +1,61 @@ +/** + * 2105. Watering Plants II + * https://leetcode.com/problems/watering-plants-ii/ + * Difficulty: Medium + * + * Alice and Bob want to water n plants in their garden. The plants are arranged in a row and are + * labeled from 0 to n - 1 from left to right where the ith plant is located at x = i. + * + * Each plant needs a specific amount of water. Alice and Bob have a watering can each, initially + * full. They water the plants in the following way: + * - Alice waters the plants in order from left to right, starting from the 0th plant. Bob waters + * the plants in order from right to left, starting from the (n - 1)th plant. They begin watering + * the plants simultaneously. + * - It takes the same amount of time to water each plant regardless of how much water it needs. + * - Alice/Bob must water the plant if they have enough in their can to fully water it. Otherwise, + * they first refill their can (instantaneously) then water the plant. + * - In case both Alice and Bob reach the same plant, the one with more water currently in his/her + * watering can should water this plant. If they have the same amount of water, then Alice should + * water this plant. + * + * Given a 0-indexed integer array plants of n integers, where plants[i] is the amount of water the + * ith plant needs, and two integers capacityA and capacityB representing the capacities of Alice's + * and Bob's watering cans respectively, return the number of times they have to refill to water all + * the plants. + */ + +/** + * @param {number[]} plants + * @param {number} capacityA + * @param {number} capacityB + * @return {number} + */ +var minimumRefill = function(plants, capacityA, capacityB) { + let result = 0; + let left = 0; + let right = plants.length - 1; + let waterA = capacityA; + let waterB = capacityB; + + while (left <= right) { + if (left === right) { + if (waterA >= waterB && waterA < plants[left]) result++; + if (waterB > waterA && waterB < plants[right]) result++; + break; + } + + if (waterA < plants[left]) { + waterA = capacityA; + result++; + } + waterA -= plants[left++]; + + if (waterB < plants[right]) { + waterB = capacityB; + result++; + } + waterB -= plants[right--]; + } + + return result; +}; From 44a71e2bec2b93b1a975a6400fa7577fd91b7698 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Mon, 12 May 2025 08:20:35 -0500 Subject: [PATCH 041/571] Add solution #2106 --- README.md | 3 +- ...-fruits-harvested-after-at-most-k-steps.js | 52 +++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 solutions/2106-maximum-fruits-harvested-after-at-most-k-steps.js diff --git a/README.md b/README.md index 88f126ac..229c57ee 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,749 LeetCode solutions in JavaScript +# 1,750 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1613,6 +1613,7 @@ 2103|[Rings and Rods](./solutions/2103-rings-and-rods.js)|Easy| 2104|[Sum of Subarray Ranges](./solutions/2104-sum-of-subarray-ranges.js)|Medium| 2105|[Watering Plants II](./solutions/2105-watering-plants-ii.js)|Medium| +2106|[Maximum Fruits Harvested After at Most K Steps](./solutions/2106-maximum-fruits-harvested-after-at-most-k-steps.js)|Hard| 2114|[Maximum Number of Words Found in Sentences](./solutions/2114-maximum-number-of-words-found-in-sentences.js)|Easy| 2115|[Find All Possible Recipes from Given Supplies](./solutions/2115-find-all-possible-recipes-from-given-supplies.js)|Medium| 2116|[Check if a Parentheses String Can Be Valid](./solutions/2116-check-if-a-parentheses-string-can-be-valid.js)|Medium| diff --git a/solutions/2106-maximum-fruits-harvested-after-at-most-k-steps.js b/solutions/2106-maximum-fruits-harvested-after-at-most-k-steps.js new file mode 100644 index 00000000..bd81e17e --- /dev/null +++ b/solutions/2106-maximum-fruits-harvested-after-at-most-k-steps.js @@ -0,0 +1,52 @@ +/** + * 2106. Maximum Fruits Harvested After at Most K Steps + * https://leetcode.com/problems/maximum-fruits-harvested-after-at-most-k-steps/ + * Difficulty: Hard + * + * Fruits are available at some positions on an infinite x-axis. You are given a 2D integer array + * fruits where fruits[i] = [positioni, amounti] depicts amounti fruits at the position positioni. + * fruits is already sorted by positioni in ascending order, and each positioni is unique. + * + * You are also given an integer startPos and an integer k. Initially, you are at the position + * startPos. From any position, you can either walk to the left or right. It takes one step to + * move one unit on the x-axis, and you can walk at most k steps in total. For every position + * you reach, you harvest all the fruits at that position, and the fruits will disappear from + * that position. + * + * Return the maximum total number of fruits you can harvest. + */ + +/** + * @param {number[][]} fruits + * @param {number} startPos + * @param {number} k + * @return {number} + */ +var maxTotalFruits = function(fruits, startPos, k) { + let result = 0; + let left = 0; + let currentSum = 0; + + for (let right = 0; right < fruits.length; right++) { + currentSum += fruits[right][1]; + + while (left <= right) { + const minPos = fruits[left][0]; + const maxPos = fruits[right][0]; + const steps = Math.min( + Math.abs(startPos - minPos) + (maxPos - minPos), + Math.abs(startPos - maxPos) + (maxPos - minPos) + ); + + if (steps <= k) break; + currentSum -= fruits[left][1]; + left++; + } + + if (left <= right) { + result = Math.max(result, currentSum); + } + } + + return result; +}; From 81be90b55e61f11c3c932e2becb322ff0767a035 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Mon, 12 May 2025 19:11:01 -0500 Subject: [PATCH 042/571] Add solution #3335 --- README.md | 3 +- ...cters-in-string-after-transformations-i.js | 47 +++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 solutions/3335-total-characters-in-string-after-transformations-i.js diff --git a/README.md b/README.md index 229c57ee..019ad017 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,750 LeetCode solutions in JavaScript +# 1,751 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1741,6 +1741,7 @@ 3223|[Minimum Length of String After Operations](./solutions/3223-minimum-length-of-string-after-operations.js)|Medium| 3272|[Find the Count of Good Integers](./solutions/3272-find-the-count-of-good-integers.js)|Hard| 3306|[Count of Substrings Containing Every Vowel and K Consonants II](./solutions/3306-count-of-substrings-containing-every-vowel-and-k-consonants-ii.js)|Medium| +3335|[Total Characters in String After Transformations I](./solutions/3335-total-characters-in-string-after-transformations-i.js)|Medium| 3341|[Find Minimum Time to Reach Last Room I](./solutions/3341-find-minimum-time-to-reach-last-room-i.js)|Medium| 3342|[Find Minimum Time to Reach Last Room II](./solutions/3342-find-minimum-time-to-reach-last-room-ii.js)|Medium| 3343|[Count Number of Balanced Permutations](./solutions/3343-count-number-of-balanced-permutations.js)|Hard| diff --git a/solutions/3335-total-characters-in-string-after-transformations-i.js b/solutions/3335-total-characters-in-string-after-transformations-i.js new file mode 100644 index 00000000..e62e76ea --- /dev/null +++ b/solutions/3335-total-characters-in-string-after-transformations-i.js @@ -0,0 +1,47 @@ +/** + * 3335. Total Characters in String After Transformations I + * https://leetcode.com/problems/total-characters-in-string-after-transformations-i/ + * Difficulty: Medium + * + * You are given a string s and an integer t, representing the number of transformations to + * perform. In one transformation, every character in s is replaced according to the following + * rules: + * - If the character is 'z', replace it with the string "ab". + * - Otherwise, replace it with the next character in the alphabet. For example, 'a' is replaced + * with 'b', 'b' is replaced with 'c', and so on. + * + * Return the length of the resulting string after exactly t transformations. + * + * Since the answer may be very large, return it modulo 109 + 7. + */ + +/** + * @param {string} s + * @param {number} t + * @return {number} + */ +var lengthAfterTransformations = function(s, t) { + const MOD = 1e9 + 7; + const freq = new Array(26).fill(0); + + for (const char of s) { + freq[char.charCodeAt(0) - 97]++; + } + + for (let i = 0; i < t; i++) { + const newFreq = new Array(26).fill(0); + for (let j = 0; j < 25; j++) { + newFreq[j + 1] = freq[j]; + } + newFreq[0] = (newFreq[0] + freq[25]) % MOD; + newFreq[1] = (newFreq[1] + freq[25]) % MOD; + freq.splice(0, 26, ...newFreq); + } + + let result = 0; + for (const count of freq) { + result = (result + count) % MOD; + } + + return result; +}; From 5b2bf975ab2b91679942fc129a50cd00bf28f8fb Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Mon, 12 May 2025 19:14:50 -0500 Subject: [PATCH 043/571] Add solution #2108 --- README.md | 3 ++- ...d-first-palindromic-string-in-the-array.js | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 solutions/2108-find-first-palindromic-string-in-the-array.js diff --git a/README.md b/README.md index 019ad017..edb79c5e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,751 LeetCode solutions in JavaScript +# 1,752 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1614,6 +1614,7 @@ 2104|[Sum of Subarray Ranges](./solutions/2104-sum-of-subarray-ranges.js)|Medium| 2105|[Watering Plants II](./solutions/2105-watering-plants-ii.js)|Medium| 2106|[Maximum Fruits Harvested After at Most K Steps](./solutions/2106-maximum-fruits-harvested-after-at-most-k-steps.js)|Hard| +2108|[Find First Palindromic String in the Array](./solutions/2108-find-first-palindromic-string-in-the-array.js)|Easy| 2114|[Maximum Number of Words Found in Sentences](./solutions/2114-maximum-number-of-words-found-in-sentences.js)|Easy| 2115|[Find All Possible Recipes from Given Supplies](./solutions/2115-find-all-possible-recipes-from-given-supplies.js)|Medium| 2116|[Check if a Parentheses String Can Be Valid](./solutions/2116-check-if-a-parentheses-string-can-be-valid.js)|Medium| diff --git a/solutions/2108-find-first-palindromic-string-in-the-array.js b/solutions/2108-find-first-palindromic-string-in-the-array.js new file mode 100644 index 00000000..a72a02b0 --- /dev/null +++ b/solutions/2108-find-first-palindromic-string-in-the-array.js @@ -0,0 +1,23 @@ +/** + * 2108. Find First Palindromic String in the Array + * https://leetcode.com/problems/find-first-palindromic-string-in-the-array/ + * Difficulty: Easy + * + * Given an array of strings words, return the first palindromic string in the array. If there is + * no such string, return an empty string "". + * + * A string is palindromic if it reads the same forward and backward. + */ + +/** + * @param {string[]} words + * @return {string} + */ +var firstPalindrome = function(words) { + for (const word of words) { + if (word === word.split('').reverse().join('')) { + return word; + } + } + return ''; +}; From d167a4b7cd2d9bc11fec36478ff40c388a7a2107 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Mon, 12 May 2025 19:15:46 -0500 Subject: [PATCH 044/571] Add solution #2109 --- README.md | 3 +- solutions/2109-adding-spaces-to-a-string.js | 33 +++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 solutions/2109-adding-spaces-to-a-string.js diff --git a/README.md b/README.md index edb79c5e..87fe45d8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,752 LeetCode solutions in JavaScript +# 1,753 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1615,6 +1615,7 @@ 2105|[Watering Plants II](./solutions/2105-watering-plants-ii.js)|Medium| 2106|[Maximum Fruits Harvested After at Most K Steps](./solutions/2106-maximum-fruits-harvested-after-at-most-k-steps.js)|Hard| 2108|[Find First Palindromic String in the Array](./solutions/2108-find-first-palindromic-string-in-the-array.js)|Easy| +2109|[Adding Spaces to a String](./solutions/2109-adding-spaces-to-a-string.js)|Medium| 2114|[Maximum Number of Words Found in Sentences](./solutions/2114-maximum-number-of-words-found-in-sentences.js)|Easy| 2115|[Find All Possible Recipes from Given Supplies](./solutions/2115-find-all-possible-recipes-from-given-supplies.js)|Medium| 2116|[Check if a Parentheses String Can Be Valid](./solutions/2116-check-if-a-parentheses-string-can-be-valid.js)|Medium| diff --git a/solutions/2109-adding-spaces-to-a-string.js b/solutions/2109-adding-spaces-to-a-string.js new file mode 100644 index 00000000..7f4a85ba --- /dev/null +++ b/solutions/2109-adding-spaces-to-a-string.js @@ -0,0 +1,33 @@ +/** + * 2109. Adding Spaces to a String + * https://leetcode.com/problems/adding-spaces-to-a-string/ + * Difficulty: Medium + * + * You are given a 0-indexed string s and a 0-indexed integer array spaces that describes the + * indices in the original string where spaces will be added. Each space should be inserted + * before the character at the given index. + * - For example, given s = "EnjoyYourCoffee" and spaces = [5, 9], we place spaces before 'Y' + * and 'C', which are at indices 5 and 9 respectively. Thus, we obtain "Enjoy Your Coffee". + * + * Return the modified string after the spaces have been added. + */ + +/** + * @param {string} s + * @param {number[]} spaces + * @return {string} + */ +var addSpaces = function(s, spaces) { + let result = ''; + let spaceIndex = 0; + + for (let i = 0; i < s.length; i++) { + if (spaceIndex < spaces.length && i === spaces[spaceIndex]) { + result += ' '; + spaceIndex++; + } + result += s[i]; + } + + return result; +}; From bede0a05617f8d14bf55d812a7fe9f975db32406 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Mon, 12 May 2025 19:16:59 -0500 Subject: [PATCH 045/571] Add solution #2110 --- README.md | 3 +- ...er-of-smooth-descent-periods-of-a-stock.js | 34 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 solutions/2110-number-of-smooth-descent-periods-of-a-stock.js diff --git a/README.md b/README.md index 87fe45d8..17d6608c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,753 LeetCode solutions in JavaScript +# 1,754 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1616,6 +1616,7 @@ 2106|[Maximum Fruits Harvested After at Most K Steps](./solutions/2106-maximum-fruits-harvested-after-at-most-k-steps.js)|Hard| 2108|[Find First Palindromic String in the Array](./solutions/2108-find-first-palindromic-string-in-the-array.js)|Easy| 2109|[Adding Spaces to a String](./solutions/2109-adding-spaces-to-a-string.js)|Medium| +2110|[Number of Smooth Descent Periods of a Stock](./solutions/2110-number-of-smooth-descent-periods-of-a-stock.js)|Medium| 2114|[Maximum Number of Words Found in Sentences](./solutions/2114-maximum-number-of-words-found-in-sentences.js)|Easy| 2115|[Find All Possible Recipes from Given Supplies](./solutions/2115-find-all-possible-recipes-from-given-supplies.js)|Medium| 2116|[Check if a Parentheses String Can Be Valid](./solutions/2116-check-if-a-parentheses-string-can-be-valid.js)|Medium| diff --git a/solutions/2110-number-of-smooth-descent-periods-of-a-stock.js b/solutions/2110-number-of-smooth-descent-periods-of-a-stock.js new file mode 100644 index 00000000..09a08e95 --- /dev/null +++ b/solutions/2110-number-of-smooth-descent-periods-of-a-stock.js @@ -0,0 +1,34 @@ +/** + * 2110. Number of Smooth Descent Periods of a Stock + * https://leetcode.com/problems/number-of-smooth-descent-periods-of-a-stock/ + * Difficulty: Medium + * + * You are given an integer array prices representing the daily price history of a stock, + * where prices[i] is the stock price on the ith day. + * + * A smooth descent period of a stock consists of one or more contiguous days such that the + * price on each day is lower than the price on the preceding day by exactly 1. The first + * day of the period is exempted from this rule. + * + * Return the number of smooth descent periods. + */ + +/** + * @param {number[]} prices + * @return {number} + */ +var getDescentPeriods = function(prices) { + let result = 1; + let currentLength = 1; + + for (let i = 1; i < prices.length; i++) { + if (prices[i] === prices[i - 1] - 1) { + currentLength++; + } else { + currentLength = 1; + } + result += currentLength; + } + + return result; +}; From 458edebd762b05b34d5e3c8f521a2009e6d61d54 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Mon, 12 May 2025 19:18:47 -0500 Subject: [PATCH 046/571] Add solution #2111 --- README.md | 3 +- ...erations-to-make-the-array-k-increasing.js | 58 +++++++++++++++++++ 2 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 solutions/2111-minimum-operations-to-make-the-array-k-increasing.js diff --git a/README.md b/README.md index 17d6608c..f480feef 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,754 LeetCode solutions in JavaScript +# 1,755 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1617,6 +1617,7 @@ 2108|[Find First Palindromic String in the Array](./solutions/2108-find-first-palindromic-string-in-the-array.js)|Easy| 2109|[Adding Spaces to a String](./solutions/2109-adding-spaces-to-a-string.js)|Medium| 2110|[Number of Smooth Descent Periods of a Stock](./solutions/2110-number-of-smooth-descent-periods-of-a-stock.js)|Medium| +2111|[Minimum Operations to Make the Array K-Increasing](./solutions/2111-minimum-operations-to-make-the-array-k-increasing.js)|Hard| 2114|[Maximum Number of Words Found in Sentences](./solutions/2114-maximum-number-of-words-found-in-sentences.js)|Easy| 2115|[Find All Possible Recipes from Given Supplies](./solutions/2115-find-all-possible-recipes-from-given-supplies.js)|Medium| 2116|[Check if a Parentheses String Can Be Valid](./solutions/2116-check-if-a-parentheses-string-can-be-valid.js)|Medium| diff --git a/solutions/2111-minimum-operations-to-make-the-array-k-increasing.js b/solutions/2111-minimum-operations-to-make-the-array-k-increasing.js new file mode 100644 index 00000000..8f861b84 --- /dev/null +++ b/solutions/2111-minimum-operations-to-make-the-array-k-increasing.js @@ -0,0 +1,58 @@ +/** + * 2111. Minimum Operations to Make the Array K-Increasing + * https://leetcode.com/problems/minimum-operations-to-make-the-array-k-increasing/ + * Difficulty: Hard + * + * You are given a 0-indexed array arr consisting of n positive integers, and a positive integer k. + * + * The array arr is called K-increasing if arr[i-k] <= arr[i] holds for every index i, where + * k <= i <= n-1. + * + * - For example, arr = [4, 1, 5, 2, 6, 2] is K-increasing for k = 2 because: + * - arr[0] <= arr[2] (4 <= 5) + * - arr[1] <= arr[3] (1 <= 2) + * - arr[2] <= arr[4] (5 <= 6) + * - arr[3] <= arr[5] (2 <= 2) + * - However, the same arr is not K-increasing for k = 1 (because arr[0] > arr[1]) or k = 3 (because + * arr[0] > arr[3]). + * + * In one operation, you can choose an index i and change arr[i] into any positive integer. + * + * Return the minimum number of operations required to make the array K-increasing for the given k. + */ + +/** + * @param {number[]} arr + * @param {number} k + * @return {number} + */ +var kIncreasing = function(arr, k) { + let result = 0; + for (let i = 0; i < k; i++) { + const subsequence = []; + for (let j = i; j < arr.length; j += k) { + subsequence.push(arr[j]); + } + result += longestNonDecreasingSubsequence(subsequence); + } + + return result; + + function longestNonDecreasingSubsequence(nums) { + const tails = []; + for (const num of nums) { + let left = 0; + let right = tails.length; + while (left < right) { + const mid = Math.floor((left + right) / 2); + if (tails[mid] <= num) { + left = mid + 1; + } else { + right = mid; + } + } + tails[left] = num; + } + return nums.length - tails.length; + } +}; From 25d7607fb2b8f2cb93d6aaab7d340a8c5d8a6bb6 Mon Sep 17 00:00:00 2001 From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com> Date: Mon, 12 May 2025 19:56:06 -0500 Subject: [PATCH 047/571] Add solution #2117 --- README.md | 3 +- ...117-abbreviating-the-product-of-a-range.js | 91 +++++++++++++++++++ 2 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 solutions/2117-abbreviating-the-product-of-a-range.js diff --git a/README.md b/README.md index f480feef..8789cfd9 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1,755 LeetCode solutions in JavaScript +# 1,756 LeetCode solutions in JavaScript [https://leetcodejavascript.com](https://leetcodejavascript.com) @@ -1621,6 +1621,7 @@ 2114|[Maximum Number of Words Found in Sentences](./solutions/2114-maximum-number-of-words-found-in-sentences.js)|Easy| 2115|[Find All Possible Recipes from Given Supplies](./solutions/2115-find-all-possible-recipes-from-given-supplies.js)|Medium| 2116|[Check if a Parentheses String Can Be Valid](./solutions/2116-check-if-a-parentheses-string-can-be-valid.js)|Medium| +2117|[Abbreviating the Product of a Range](./solutions/2117-abbreviating-the-product-of-a-range.js)|Hard| 2127|[Maximum Employees to Be Invited to a Meeting](./solutions/2127-maximum-employees-to-be-invited-to-a-meeting.js)|Hard| 2129|[Capitalize the Title](./solutions/2129-capitalize-the-title.js)|Easy| 2130|[Maximum Twin Sum of a Linked List](./solutions/2130-maximum-twin-sum-of-a-linked-list.js)|Medium| diff --git a/solutions/2117-abbreviating-the-product-of-a-range.js b/solutions/2117-abbreviating-the-product-of-a-range.js new file mode 100644 index 00000000..4334b25b --- /dev/null +++ b/solutions/2117-abbreviating-the-product-of-a-range.js @@ -0,0 +1,91 @@ +/** + * 2117. Abbreviating the Product of a Range + * https://leetcode.com/problems/abbreviating-the-product-of-a-range/ + * Difficulty: Hard + * + * You are given two positive integers left and right with left <= right. Calculate the product of + * all integers in the inclusive range [left, right]. + * + * Since the product may be very large, you will abbreviate it following these steps: + * 1. Count all trailing zeros in the product and remove them. Let us denote this count as C. + * - For example, there are 3 trailing zeros in 1000, and there are 0 trailing zeros in 546. + * 2. Denote the remaining number of digits in the product as d. If d > 10, then express the product + * as
... where 
 denotes the first 5 digits of the product, and  denotes the
+ *    last 5 digits of the product after removing all trailing zeros. If d <= 10, we keep it
+ *    unchanged.
+ *    - For example, we express 1234567654321 as 12345...54321, but 1234567 is represented as
+ *      1234567.
+ * 3. Finally, represent the product as a string "
...eC".
+ *    - For example, 12345678987600000 will be represented as "12345...89876e5".
+ *
+ * Return a string denoting the abbreviated product of all integers in the inclusive range [left,
+ * right].
+ */
+
+/**
+ * @param {number} left
+ * @param {number} right
+ * @return {string}
+ */
+var abbreviateProduct = function(left, right) {
+  let zeros = 0;
+  let count2 = 0;
+  let count5 = 0;
+
+  for (let i = left; i <= right; i++) {
+    let n = i;
+    while (n % 2 === 0) {
+      count2++;
+      n = Math.floor(n / 2);
+    }
+    n = i;
+    while (n % 5 === 0) {
+      count5++;
+      n = Math.floor(n / 5);
+    }
+  }
+  zeros = Math.min(count2, count5);
+
+  let digits = 0;
+  for (let i = left; i <= right; i++) {
+    digits += Math.log10(i);
+  }
+  digits = Math.floor(digits) + 1;
+
+  if (digits - zeros <= 10) {
+    let product = 1n;
+    for (let i = left; i <= right; i++) {
+      product *= BigInt(i);
+    }
+    for (let i = 0; i < zeros; i++) {
+      product /= 10n;
+    }
+    return product.toString() + 'e' + zeros;
+  }
+
+  let prefix = 1;
+  for (let i = left; i <= right; i++) {
+    prefix *= i;
+    while (prefix >= 1e10) {
+      prefix /= 10;
+    }
+  }
+  prefix = prefix.toString().slice(0, 5);
+
+  let suffix = 1n;
+  for (let i = right; i >= left; i--) {
+    suffix = (suffix * BigInt(i));
+    while (suffix % 10n === 0n) {
+      suffix /= 10n;
+    }
+    suffix = suffix % (10n ** 15n);
+  }
+
+  suffix = suffix.toString();
+  while (suffix.length < 5) {
+    suffix = '0' + suffix;
+  }
+  suffix = suffix.slice(-5);
+
+  return prefix + '...' + suffix + 'e' + zeros;
+};

From 151962b1a8e1cbaf04792ae24c2871e01d53fd3e Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Mon, 12 May 2025 19:57:17 -0500
Subject: [PATCH 048/571] Add solution #2119

---
 README.md                                     |  3 ++-
 .../2119-a-number-after-a-double-reversal.js  | 20 +++++++++++++++++++
 2 files changed, 22 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2119-a-number-after-a-double-reversal.js

diff --git a/README.md b/README.md
index 8789cfd9..99ce13cb 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,756 LeetCode solutions in JavaScript
+# 1,757 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1622,6 +1622,7 @@
 2115|[Find All Possible Recipes from Given Supplies](./solutions/2115-find-all-possible-recipes-from-given-supplies.js)|Medium|
 2116|[Check if a Parentheses String Can Be Valid](./solutions/2116-check-if-a-parentheses-string-can-be-valid.js)|Medium|
 2117|[Abbreviating the Product of a Range](./solutions/2117-abbreviating-the-product-of-a-range.js)|Hard|
+2119|[A Number After a Double Reversal](./solutions/2119-a-number-after-a-double-reversal.js)|Easy|
 2127|[Maximum Employees to Be Invited to a Meeting](./solutions/2127-maximum-employees-to-be-invited-to-a-meeting.js)|Hard|
 2129|[Capitalize the Title](./solutions/2129-capitalize-the-title.js)|Easy|
 2130|[Maximum Twin Sum of a Linked List](./solutions/2130-maximum-twin-sum-of-a-linked-list.js)|Medium|
diff --git a/solutions/2119-a-number-after-a-double-reversal.js b/solutions/2119-a-number-after-a-double-reversal.js
new file mode 100644
index 00000000..efc1d321
--- /dev/null
+++ b/solutions/2119-a-number-after-a-double-reversal.js
@@ -0,0 +1,20 @@
+/**
+ * 2119. A Number After a Double Reversal
+ * https://leetcode.com/problems/a-number-after-a-double-reversal/
+ * Difficulty: Easy
+ *
+ * Reversing an integer means to reverse all its digits.
+ * - For example, reversing 2021 gives 1202. Reversing 12300 gives 321 as the leading zeros
+ *   are not retained.
+ *
+ * Given an integer num, reverse num to get reversed1, then reverse reversed1 to get reversed2.
+ * Return true if reversed2 equals num. Otherwise return false.
+ */
+
+/**
+ * @param {number} num
+ * @return {boolean}
+ */
+var isSameAfterReversals = function(num) {
+  return num === 0 || num % 10 !== 0;
+};

From 8b2704be3d061138c4e543ae1eac0b1b97cd83ee Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Mon, 12 May 2025 19:58:36 -0500
Subject: [PATCH 049/571] Add solution #2120

---
 README.md                                     |  3 +-
 ...l-suffix-instructions-staying-in-a-grid.js | 51 +++++++++++++++++++
 2 files changed, 53 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2120-execution-of-all-suffix-instructions-staying-in-a-grid.js

diff --git a/README.md b/README.md
index 99ce13cb..179b55d7 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,757 LeetCode solutions in JavaScript
+# 1,758 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1623,6 +1623,7 @@
 2116|[Check if a Parentheses String Can Be Valid](./solutions/2116-check-if-a-parentheses-string-can-be-valid.js)|Medium|
 2117|[Abbreviating the Product of a Range](./solutions/2117-abbreviating-the-product-of-a-range.js)|Hard|
 2119|[A Number After a Double Reversal](./solutions/2119-a-number-after-a-double-reversal.js)|Easy|
+2120|[Execution of All Suffix Instructions Staying in a Grid](./solutions/2120-execution-of-all-suffix-instructions-staying-in-a-grid.js)|Medium|
 2127|[Maximum Employees to Be Invited to a Meeting](./solutions/2127-maximum-employees-to-be-invited-to-a-meeting.js)|Hard|
 2129|[Capitalize the Title](./solutions/2129-capitalize-the-title.js)|Easy|
 2130|[Maximum Twin Sum of a Linked List](./solutions/2130-maximum-twin-sum-of-a-linked-list.js)|Medium|
diff --git a/solutions/2120-execution-of-all-suffix-instructions-staying-in-a-grid.js b/solutions/2120-execution-of-all-suffix-instructions-staying-in-a-grid.js
new file mode 100644
index 00000000..940ddc72
--- /dev/null
+++ b/solutions/2120-execution-of-all-suffix-instructions-staying-in-a-grid.js
@@ -0,0 +1,51 @@
+/**
+ * 2120. Execution of All Suffix Instructions Staying in a Grid
+ * https://leetcode.com/problems/execution-of-all-suffix-instructions-staying-in-a-grid/
+ * Difficulty: Medium
+ *
+ * There is an n x n grid, with the top-left cell at (0, 0) and the bottom-right cell at
+ * (n - 1, n - 1). You are given the integer n and an integer array startPos where
+ * startPos = [startrow, startcol] indicates that a robot is initially at cell (startrow, startcol).
+ *
+ * You are also given a 0-indexed string s of length m where s[i] is the ith instruction for the
+ * robot: 'L' (move left), 'R' (move right), 'U' (move up), and 'D' (move down).
+ *
+ * The robot can begin executing from any ith instruction in s. It executes the instructions one
+ * by one towards the end of s but it stops if either of these conditions is met:
+ * - The next instruction will move the robot off the grid.
+ * - There are no more instructions left to execute.
+ *
+ * Return an array answer of length m where answer[i] is the number of instructions the robot can
+ * execute if the robot begins executing from the ith instruction in s.
+ */
+
+/**
+ * @param {number} n
+ * @param {number[]} startPos
+ * @param {string} s
+ * @return {number[]}
+ */
+var executeInstructions = function(n, startPos, s) {
+  const m = s.length;
+  const result = new Array(m).fill(0);
+
+  for (let i = 0; i < m; i++) {
+    let row = startPos[0];
+    let col = startPos[1];
+    let steps = 0;
+
+    for (let j = i; j < m; j++) {
+      if (s[j] === 'L') col--;
+      else if (s[j] === 'R') col++;
+      else if (s[j] === 'U') row--;
+      else row++;
+
+      if (row < 0 || row >= n || col < 0 || col >= n) break;
+      steps++;
+    }
+
+    result[i] = steps;
+  }
+
+  return result;
+};

From 2570aaee4c1f2777519d70fa05a9f42c2d36ebf2 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Mon, 12 May 2025 19:59:49 -0500
Subject: [PATCH 050/571] Add solution #2121

---
 README.md                                     |  3 +-
 ...21-intervals-between-identical-elements.js | 48 +++++++++++++++++++
 2 files changed, 50 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2121-intervals-between-identical-elements.js

diff --git a/README.md b/README.md
index 179b55d7..8b14d40f 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,758 LeetCode solutions in JavaScript
+# 1,759 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1624,6 +1624,7 @@
 2117|[Abbreviating the Product of a Range](./solutions/2117-abbreviating-the-product-of-a-range.js)|Hard|
 2119|[A Number After a Double Reversal](./solutions/2119-a-number-after-a-double-reversal.js)|Easy|
 2120|[Execution of All Suffix Instructions Staying in a Grid](./solutions/2120-execution-of-all-suffix-instructions-staying-in-a-grid.js)|Medium|
+2121|[Intervals Between Identical Elements](./solutions/2121-intervals-between-identical-elements.js)|Medium|
 2127|[Maximum Employees to Be Invited to a Meeting](./solutions/2127-maximum-employees-to-be-invited-to-a-meeting.js)|Hard|
 2129|[Capitalize the Title](./solutions/2129-capitalize-the-title.js)|Easy|
 2130|[Maximum Twin Sum of a Linked List](./solutions/2130-maximum-twin-sum-of-a-linked-list.js)|Medium|
diff --git a/solutions/2121-intervals-between-identical-elements.js b/solutions/2121-intervals-between-identical-elements.js
new file mode 100644
index 00000000..3686726b
--- /dev/null
+++ b/solutions/2121-intervals-between-identical-elements.js
@@ -0,0 +1,48 @@
+/**
+ * 2121. Intervals Between Identical Elements
+ * https://leetcode.com/problems/intervals-between-identical-elements/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed array of n integers arr.
+ *
+ * The interval between two elements in arr is defined as the absolute difference between their
+ * indices. More formally, the interval between arr[i] and arr[j] is |i - j|.
+ *
+ * Return an array intervals of length n where intervals[i] is the sum of intervals between arr[i]
+ * and each element in arr with the same value as arr[i].
+ *
+ * Note: |x| is the absolute value of x.
+ */
+
+/**
+ * @param {number[]} arr
+ * @return {number[]}
+ */
+var getDistances = function(arr) {
+  const valueIndices = new Map();
+  const result = new Array(arr.length).fill(0);
+
+  for (let i = 0; i < arr.length; i++) {
+    if (!valueIndices.has(arr[i])) {
+      valueIndices.set(arr[i], []);
+    }
+    valueIndices.get(arr[i]).push(i);
+  }
+
+  for (const indices of valueIndices.values()) {
+    let prefixSum = 0;
+    for (let i = 1; i < indices.length; i++) {
+      prefixSum += indices[i] - indices[0];
+    }
+
+    result[indices[0]] = prefixSum;
+
+    for (let i = 1; i < indices.length; i++) {
+      const diff = indices[i] - indices[i - 1];
+      prefixSum += diff * (i - (indices.length - i));
+      result[indices[i]] = prefixSum;
+    }
+  }
+
+  return result;
+};

From 1bf168e0c08e3fee91e54730bfa2d26287d30445 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Mon, 12 May 2025 20:00:54 -0500
Subject: [PATCH 051/571] Add solution #2615

---
 README.md                          |  3 +-
 solutions/2615-sum-of-distances.js | 44 ++++++++++++++++++++++++++++++
 2 files changed, 46 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2615-sum-of-distances.js

diff --git a/README.md b/README.md
index 8b14d40f..81579f95 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,759 LeetCode solutions in JavaScript
+# 1,760 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1680,6 +1680,7 @@
 2570|[Merge Two 2D Arrays by Summing Values](./solutions/2570-merge-two-2d-arrays-by-summing-values.js)|Easy|
 2579|[Count Total Number of Colored Cells](./solutions/2579-count-total-number-of-colored-cells.js)|Medium|
 2594|[Minimum Time to Repair Cars](./solutions/2594-minimum-time-to-repair-cars.js)|Medium|
+2615|[Sum of Distances](./solutions/2615-sum-of-distances.js)|Medium|
 2618|[Check if Object Instance of Class](./solutions/2618-check-if-object-instance-of-class.js)|Medium|
 2619|[Array Prototype Last](./solutions/2619-array-prototype-last.js)|Easy|
 2620|[Counter](./solutions/2620-counter.js)|Easy|
diff --git a/solutions/2615-sum-of-distances.js b/solutions/2615-sum-of-distances.js
new file mode 100644
index 00000000..470c10cf
--- /dev/null
+++ b/solutions/2615-sum-of-distances.js
@@ -0,0 +1,44 @@
+/**
+ * 2615. Sum of Distances
+ * https://leetcode.com/problems/sum-of-distances/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed integer array nums. There exists an array arr of length nums.length,
+ * where arr[i] is the sum of |i - j| over all j such that nums[j] == nums[i] and j != i. If there
+ * is no such j, set arr[i] to be 0.
+ *
+ * Return the array arr.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number[]}
+ */
+var distance = function(nums) {
+  const valueIndices = new Map();
+  const result = new Array(nums.length).fill(0);
+
+  for (let i = 0; i < nums.length; i++) {
+    if (!valueIndices.has(nums[i])) {
+      valueIndices.set(nums[i], []);
+    }
+    valueIndices.get(nums[i]).push(i);
+  }
+
+  for (const indices of valueIndices.values()) {
+    let prefixSum = 0;
+    for (let i = 1; i < indices.length; i++) {
+      prefixSum += indices[i] - indices[0];
+    }
+
+    result[indices[0]] = prefixSum;
+
+    for (let i = 1; i < indices.length; i++) {
+      const diff = indices[i] - indices[i - 1];
+      prefixSum += diff * (i - (indices.length - i));
+      result[indices[i]] = prefixSum;
+    }
+  }
+
+  return result;
+};

From 3580cdc2808dd129f3972ecedc95fed51bb4a066 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 13 May 2025 00:17:36 -0500
Subject: [PATCH 052/571] Add solution #2122

---
 README.md                                    |  3 +-
 solutions/2122-recover-the-original-array.js | 55 ++++++++++++++++++++
 2 files changed, 57 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2122-recover-the-original-array.js

diff --git a/README.md b/README.md
index 81579f95..1978614e 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,760 LeetCode solutions in JavaScript
+# 1,761 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1625,6 +1625,7 @@
 2119|[A Number After a Double Reversal](./solutions/2119-a-number-after-a-double-reversal.js)|Easy|
 2120|[Execution of All Suffix Instructions Staying in a Grid](./solutions/2120-execution-of-all-suffix-instructions-staying-in-a-grid.js)|Medium|
 2121|[Intervals Between Identical Elements](./solutions/2121-intervals-between-identical-elements.js)|Medium|
+2122|[Recover the Original Array](./solutions/2122-recover-the-original-array.js)|Hard|
 2127|[Maximum Employees to Be Invited to a Meeting](./solutions/2127-maximum-employees-to-be-invited-to-a-meeting.js)|Hard|
 2129|[Capitalize the Title](./solutions/2129-capitalize-the-title.js)|Easy|
 2130|[Maximum Twin Sum of a Linked List](./solutions/2130-maximum-twin-sum-of-a-linked-list.js)|Medium|
diff --git a/solutions/2122-recover-the-original-array.js b/solutions/2122-recover-the-original-array.js
new file mode 100644
index 00000000..7b6030fb
--- /dev/null
+++ b/solutions/2122-recover-the-original-array.js
@@ -0,0 +1,55 @@
+/**
+ * 2122. Recover the Original Array
+ * https://leetcode.com/problems/recover-the-original-array/
+ * Difficulty: Hard
+ *
+ * Alice had a 0-indexed array arr consisting of n positive integers. She chose an arbitrary
+ * positive integer k and created two new 0-indexed integer arrays lower and higher in the
+ * following manner:
+ * 1. lower[i] = arr[i] - k, for every index i where 0 <= i < n
+ * 2. higher[i] = arr[i] + k, for every index i where 0 <= i < n
+ *
+ * Unfortunately, Alice lost all three arrays. However, she remembers the integers that were
+ * present in the arrays lower and higher, but not the array each integer belonged to. Help
+ * Alice and recover the original array.
+ *
+ * Given an array nums consisting of 2n integers, where exactly n of the integers were present
+ * in lower and the remaining in higher, return the original array arr. In case the answer is
+ * not unique, return any valid array.
+ *
+ * Note: The test cases are generated such that there exists at least one valid array arr.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number[]}
+ */
+var recoverArray = function(nums) {
+  const n = nums.length / 2;
+  nums.sort((a, b) => a - b);
+
+  for (let i = 1; i < 2 * n; i++) {
+    const k = nums[i] - nums[0];
+    if (k <= 0 || k % 2 !== 0) continue;
+
+    const original = [];
+    const used = new Array(2 * n).fill(false);
+    let count = 0;
+
+    for (let left = 0, right = i; right < 2 * n && count < n; right++) {
+      while (left < right && used[left]) left++;
+      if (left >= right) continue;
+
+      if (nums[right] - nums[left] === k) {
+        original.push(nums[left] + k / 2);
+        used[left] = used[right] = true;
+        count++;
+        left++;
+      }
+    }
+
+    if (count === n) return original;
+  }
+
+  return [];
+};

From b43b927771047729bd9e241628de85b69cdfed48 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 13 May 2025 00:19:10 -0500
Subject: [PATCH 053/571] Add solution #2124

---
 README.md                                     |  3 ++-
 ...4-check-if-all-as-appears-before-all-bs.js | 23 +++++++++++++++++++
 2 files changed, 25 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2124-check-if-all-as-appears-before-all-bs.js

diff --git a/README.md b/README.md
index 1978614e..71ae28ae 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,761 LeetCode solutions in JavaScript
+# 1,762 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1626,6 +1626,7 @@
 2120|[Execution of All Suffix Instructions Staying in a Grid](./solutions/2120-execution-of-all-suffix-instructions-staying-in-a-grid.js)|Medium|
 2121|[Intervals Between Identical Elements](./solutions/2121-intervals-between-identical-elements.js)|Medium|
 2122|[Recover the Original Array](./solutions/2122-recover-the-original-array.js)|Hard|
+2124|[Check if All A's Appears Before All B's](./solutions/2124-check-if-all-as-appears-before-all-bs.js)|Easy|
 2127|[Maximum Employees to Be Invited to a Meeting](./solutions/2127-maximum-employees-to-be-invited-to-a-meeting.js)|Hard|
 2129|[Capitalize the Title](./solutions/2129-capitalize-the-title.js)|Easy|
 2130|[Maximum Twin Sum of a Linked List](./solutions/2130-maximum-twin-sum-of-a-linked-list.js)|Medium|
diff --git a/solutions/2124-check-if-all-as-appears-before-all-bs.js b/solutions/2124-check-if-all-as-appears-before-all-bs.js
new file mode 100644
index 00000000..57f06772
--- /dev/null
+++ b/solutions/2124-check-if-all-as-appears-before-all-bs.js
@@ -0,0 +1,23 @@
+/**
+ * 2124. Check if All A's Appears Before All B's
+ * https://leetcode.com/problems/check-if-all-as-appears-before-all-bs/
+ * Difficulty: Easy
+ *
+ * Given a string s consisting of only the characters 'a' and 'b', return true if every 'a' appears
+ * before every 'b' in the string. Otherwise, return false.
+ */
+
+/**
+ * @param {string} s
+ * @return {boolean}
+ */
+var checkString = function(s) {
+  let seen = false;
+
+  for (const char of s) {
+    if (char === 'b') seen = true;
+    else if (seen) return false;
+  }
+
+  return true;
+};

From 0b9fd3855c66959d5f57865c4c4faeb450f5939c Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 13 May 2025 00:20:19 -0500
Subject: [PATCH 054/571] Add solution #2125

---
 README.md                                     |  3 +-
 .../2125-number-of-laser-beams-in-a-bank.js   | 40 +++++++++++++++++++
 2 files changed, 42 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2125-number-of-laser-beams-in-a-bank.js

diff --git a/README.md b/README.md
index 71ae28ae..fb686698 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,762 LeetCode solutions in JavaScript
+# 1,763 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1627,6 +1627,7 @@
 2121|[Intervals Between Identical Elements](./solutions/2121-intervals-between-identical-elements.js)|Medium|
 2122|[Recover the Original Array](./solutions/2122-recover-the-original-array.js)|Hard|
 2124|[Check if All A's Appears Before All B's](./solutions/2124-check-if-all-as-appears-before-all-bs.js)|Easy|
+2125|[Number of Laser Beams in a Bank](./solutions/2125-number-of-laser-beams-in-a-bank.js)|Medium|
 2127|[Maximum Employees to Be Invited to a Meeting](./solutions/2127-maximum-employees-to-be-invited-to-a-meeting.js)|Hard|
 2129|[Capitalize the Title](./solutions/2129-capitalize-the-title.js)|Easy|
 2130|[Maximum Twin Sum of a Linked List](./solutions/2130-maximum-twin-sum-of-a-linked-list.js)|Medium|
diff --git a/solutions/2125-number-of-laser-beams-in-a-bank.js b/solutions/2125-number-of-laser-beams-in-a-bank.js
new file mode 100644
index 00000000..58a8afb7
--- /dev/null
+++ b/solutions/2125-number-of-laser-beams-in-a-bank.js
@@ -0,0 +1,40 @@
+/**
+ * 2125. Number of Laser Beams in a Bank
+ * https://leetcode.com/problems/number-of-laser-beams-in-a-bank/
+ * Difficulty: Medium
+ *
+ * Anti-theft security devices are activated inside a bank. You are given a 0-indexed binary string
+ * array bank representing the floor plan of the bank, which is an m x n 2D matrix. bank[i]
+ * represents the ith row, consisting of '0's and '1's. '0' means the cell is empty, while'1'
+ * means the cell has a security device.
+ *
+ * There is one laser beam between any two security devices if both conditions are met:
+ * - The two devices are located on two different rows: r1 and r2, where r1 < r2.
+ * - For each row i where r1 < i < r2, there are no security devices in the ith row.
+ *
+ * Laser beams are independent, i.e., one beam does not interfere nor join with another.
+ *
+ * Return the total number of laser beams in the bank.
+ */
+
+/**
+ * @param {string[]} bank
+ * @return {number}
+ */
+var numberOfBeams = function(bank) {
+  let result = 0;
+  let prevDevices = 0;
+
+  for (const row of bank) {
+    let currentDevices = 0;
+    for (const cell of row) {
+      if (cell === '1') currentDevices++;
+    }
+    if (currentDevices > 0) {
+      result += prevDevices * currentDevices;
+      prevDevices = currentDevices;
+    }
+  }
+
+  return result;
+};

From d9cda3358c2f90b34e9bfdaf9049855336bcf699 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 13 May 2025 00:21:28 -0500
Subject: [PATCH 055/571] Add solution #2126

---
 README.md                              |  3 ++-
 solutions/2126-destroying-asteroids.js | 31 ++++++++++++++++++++++++++
 2 files changed, 33 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2126-destroying-asteroids.js

diff --git a/README.md b/README.md
index fb686698..1b4606e9 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,763 LeetCode solutions in JavaScript
+# 1,764 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1628,6 +1628,7 @@
 2122|[Recover the Original Array](./solutions/2122-recover-the-original-array.js)|Hard|
 2124|[Check if All A's Appears Before All B's](./solutions/2124-check-if-all-as-appears-before-all-bs.js)|Easy|
 2125|[Number of Laser Beams in a Bank](./solutions/2125-number-of-laser-beams-in-a-bank.js)|Medium|
+2126|[Destroying Asteroids](./solutions/2126-destroying-asteroids.js)|Medium|
 2127|[Maximum Employees to Be Invited to a Meeting](./solutions/2127-maximum-employees-to-be-invited-to-a-meeting.js)|Hard|
 2129|[Capitalize the Title](./solutions/2129-capitalize-the-title.js)|Easy|
 2130|[Maximum Twin Sum of a Linked List](./solutions/2130-maximum-twin-sum-of-a-linked-list.js)|Medium|
diff --git a/solutions/2126-destroying-asteroids.js b/solutions/2126-destroying-asteroids.js
new file mode 100644
index 00000000..8c0ff17e
--- /dev/null
+++ b/solutions/2126-destroying-asteroids.js
@@ -0,0 +1,31 @@
+/**
+ * 2126. Destroying Asteroids
+ * https://leetcode.com/problems/destroying-asteroids/
+ * Difficulty: Medium
+ *
+ * You are given an integer mass, which represents the original mass of a planet. You are further
+ * given an integer array asteroids, where asteroids[i] is the mass of the ith asteroid.
+ *
+ * You can arrange for the planet to collide with the asteroids in any arbitrary order. If the mass
+ * of the planet is greater than or equal to the mass of the asteroid, the asteroid is destroyed
+ * and the planet gains the mass of the asteroid. Otherwise, the planet is destroyed.
+ *
+ * Return true if all asteroids can be destroyed. Otherwise, return false.
+ */
+
+/**
+ * @param {number} mass
+ * @param {number[]} asteroids
+ * @return {boolean}
+ */
+var asteroidsDestroyed = function(mass, asteroids) {
+  asteroids.sort((a, b) => a - b);
+
+  let planetMass = BigInt(mass);
+  for (const asteroid of asteroids) {
+    if (planetMass < BigInt(asteroid)) return false;
+    planetMass += BigInt(asteroid);
+  }
+
+  return true;
+};

From ef07b06672bad4ca9d8c0eddd38b941dd07ea412 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 13 May 2025 00:22:41 -0500
Subject: [PATCH 056/571] Add solution #2131

---
 README.md                                     |  3 +-
 ...drome-by-concatenating-two-letter-words.js | 47 +++++++++++++++++++
 2 files changed, 49 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2131-longest-palindrome-by-concatenating-two-letter-words.js

diff --git a/README.md b/README.md
index 1b4606e9..6c22f9d0 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,764 LeetCode solutions in JavaScript
+# 1,765 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1632,6 +1632,7 @@
 2127|[Maximum Employees to Be Invited to a Meeting](./solutions/2127-maximum-employees-to-be-invited-to-a-meeting.js)|Hard|
 2129|[Capitalize the Title](./solutions/2129-capitalize-the-title.js)|Easy|
 2130|[Maximum Twin Sum of a Linked List](./solutions/2130-maximum-twin-sum-of-a-linked-list.js)|Medium|
+2131|[Longest Palindrome by Concatenating Two Letter Words](./solutions/2131-longest-palindrome-by-concatenating-two-letter-words.js)|Medium|
 2140|[Solving Questions With Brainpower](./solutions/2140-solving-questions-with-brainpower.js)|Medium|
 2145|[Count the Hidden Sequences](./solutions/2145-count-the-hidden-sequences.js)|Medium|
 2154|[Keep Multiplying Found Values by Two](./solutions/2154-keep-multiplying-found-values-by-two.js)|Easy|
diff --git a/solutions/2131-longest-palindrome-by-concatenating-two-letter-words.js b/solutions/2131-longest-palindrome-by-concatenating-two-letter-words.js
new file mode 100644
index 00000000..296b3bd0
--- /dev/null
+++ b/solutions/2131-longest-palindrome-by-concatenating-two-letter-words.js
@@ -0,0 +1,47 @@
+/**
+ * 2131. Longest Palindrome by Concatenating Two Letter Words
+ * https://leetcode.com/problems/longest-palindrome-by-concatenating-two-letter-words/
+ * Difficulty: Medium
+ *
+ * You are given an array of strings words. Each element of words consists of two lowercase
+ * English letters.
+ *
+ * Create the longest possible palindrome by selecting some elements from words and concatenating
+ * them in any order. Each element can be selected at most once.
+ *
+ * Return the length of the longest palindrome that you can create. If it is impossible to create
+ * any palindrome, return 0.
+ *
+ * A palindrome is a string that reads the same forward and backward.
+ */
+
+/**
+ * @param {string[]} words
+ * @return {number}
+ */
+var longestPalindrome = function(words) {
+  const map = new Map();
+  let length = 0;
+  let hasCenter = false;
+
+  for (const word of words) {
+    map.set(word, (map.get(word) || 0) + 1);
+  }
+
+  for (const word of map.keys()) {
+    const reverse = word[1] + word[0];
+
+    if (word === reverse) {
+      const count = map.get(word);
+      length += Math.floor(count / 2) * 4;
+      if (count % 2 === 1) hasCenter = true;
+    } else if (map.has(reverse)) {
+      const pairs = Math.min(map.get(word), map.get(reverse));
+      length += pairs * 4;
+      map.set(word, 0);
+      map.set(reverse, 0);
+    }
+  }
+
+  return hasCenter ? length + 2 : length;
+};

From 10a4ad8b25582161e2613f59b582260f4c14d3e7 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 13 May 2025 22:38:30 -0500
Subject: [PATCH 057/571] Add solution #3337

---
 README.md                                     |  3 +-
 ...ters-in-string-after-transformations-ii.js | 78 +++++++++++++++++++
 2 files changed, 80 insertions(+), 1 deletion(-)
 create mode 100644 solutions/3337-total-characters-in-string-after-transformations-ii.js

diff --git a/README.md b/README.md
index 6c22f9d0..834cbe4f 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,765 LeetCode solutions in JavaScript
+# 1,766 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1756,6 +1756,7 @@
 3272|[Find the Count of Good Integers](./solutions/3272-find-the-count-of-good-integers.js)|Hard|
 3306|[Count of Substrings Containing Every Vowel and K Consonants II](./solutions/3306-count-of-substrings-containing-every-vowel-and-k-consonants-ii.js)|Medium|
 3335|[Total Characters in String After Transformations I](./solutions/3335-total-characters-in-string-after-transformations-i.js)|Medium|
+3337|[Total Characters in String After Transformations II](./solutions/3337-total-characters-in-string-after-transformations-ii.js)|Hard|
 3341|[Find Minimum Time to Reach Last Room I](./solutions/3341-find-minimum-time-to-reach-last-room-i.js)|Medium|
 3342|[Find Minimum Time to Reach Last Room II](./solutions/3342-find-minimum-time-to-reach-last-room-ii.js)|Medium|
 3343|[Count Number of Balanced Permutations](./solutions/3343-count-number-of-balanced-permutations.js)|Hard|
diff --git a/solutions/3337-total-characters-in-string-after-transformations-ii.js b/solutions/3337-total-characters-in-string-after-transformations-ii.js
new file mode 100644
index 00000000..91d4d6aa
--- /dev/null
+++ b/solutions/3337-total-characters-in-string-after-transformations-ii.js
@@ -0,0 +1,78 @@
+/**
+ * 3337. Total Characters in String After Transformations II
+ * https://leetcode.com/problems/total-characters-in-string-after-transformations-ii/
+ * Difficulty: Hard
+ *
+ * You are given a string s consisting of lowercase English letters, an integer t representing
+ * the number of transformations to perform, and an array nums of size 26. In one transformation,
+ * every character in s is replaced according to the following rules:
+ * - Replace s[i] with the next nums[s[i] - 'a'] consecutive characters in the alphabet. For
+ *   example, if s[i] = 'a' and nums[0] = 3, the character 'a' transforms into the next 3
+ *   consecutive characters ahead of it, which results in "bcd".
+ * - The transformation wraps around the alphabet if it exceeds 'z'. For example, if s[i] = 'y'
+ *   and nums[24] = 3, the character 'y' transforms into the next 3 consecutive characters ahead
+ *   of it, which results in "zab".
+ *
+ * Return the length of the resulting string after exactly t transformations.
+ *
+ * Since the answer may be very large, return it modulo 109 + 7.
+ */
+
+/**
+ * @param {string} s
+ * @param {number} t
+ * @param {number[]} nums
+ * @return {number}
+ */
+var lengthAfterTransformations = function(s, t, nums) {
+  const MOD = 1000000007n;
+  const freq = new Array(26).fill(0n);
+
+  for (const char of s) {
+    freq[char.charCodeAt(0) - 97]++;
+  }
+
+  const matrix = new Array(26).fill().map(() => new Array(26).fill(0n));
+  for (let i = 0; i < 26; i++) {
+    for (let j = 0; j < nums[i]; j++) {
+      matrix[(i + j + 1) % 26][i] = 1n;
+    }
+  }
+
+  const finalMatrix = matrixPower(matrix, t);
+  let total = 0n;
+
+  for (let i = 0; i < 26; i++) {
+    let sum = 0n;
+    for (let j = 0; j < 26; j++) {
+      sum = (sum + finalMatrix[i][j] * freq[j]) % MOD;
+    }
+    total = (total + sum) % MOD;
+  }
+
+  return Number(total);
+
+  function matrixMultiply(a, b) {
+    const result = new Array(26).fill().map(() => new Array(26).fill(0n));
+    for (let i = 0; i < 26; i++) {
+      for (let j = 0; j < 26; j++) {
+        for (let k = 0; k < 26; k++) {
+          result[i][j] = (result[i][j] + a[i][k] * b[k][j]) % MOD;
+        }
+      }
+    }
+    return result;
+  }
+
+  function matrixPower(mat, power) {
+    let result = new Array(26).fill().map(() => new Array(26).fill(0n));
+    for (let i = 0; i < 26; i++) result[i][i] = 1n;
+
+    while (power > 0) {
+      if (power & 1) result = matrixMultiply(result, mat);
+      mat = matrixMultiply(mat, mat);
+      power >>= 1;
+    }
+    return result;
+  }
+};

From fbd680b9a64d10897dc776fe728417c84b72a0c1 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 13 May 2025 22:41:44 -0500
Subject: [PATCH 058/571] Add solution #2132

---
 README.md                           |  3 +-
 solutions/2132-stamping-the-grid.js | 64 +++++++++++++++++++++++++++++
 2 files changed, 66 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2132-stamping-the-grid.js

diff --git a/README.md b/README.md
index 834cbe4f..84a5ed76 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,766 LeetCode solutions in JavaScript
+# 1,767 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1633,6 +1633,7 @@
 2129|[Capitalize the Title](./solutions/2129-capitalize-the-title.js)|Easy|
 2130|[Maximum Twin Sum of a Linked List](./solutions/2130-maximum-twin-sum-of-a-linked-list.js)|Medium|
 2131|[Longest Palindrome by Concatenating Two Letter Words](./solutions/2131-longest-palindrome-by-concatenating-two-letter-words.js)|Medium|
+2132|[Stamping the Grid](./solutions/2132-stamping-the-grid.js)|Hard|
 2140|[Solving Questions With Brainpower](./solutions/2140-solving-questions-with-brainpower.js)|Medium|
 2145|[Count the Hidden Sequences](./solutions/2145-count-the-hidden-sequences.js)|Medium|
 2154|[Keep Multiplying Found Values by Two](./solutions/2154-keep-multiplying-found-values-by-two.js)|Easy|
diff --git a/solutions/2132-stamping-the-grid.js b/solutions/2132-stamping-the-grid.js
new file mode 100644
index 00000000..3143e1e3
--- /dev/null
+++ b/solutions/2132-stamping-the-grid.js
@@ -0,0 +1,64 @@
+/**
+ * 2132. Stamping the Grid
+ * https://leetcode.com/problems/stamping-the-grid/
+ * Difficulty: Hard
+ *
+ * You are given an m x n binary matrix grid where each cell is either 0 (empty) or 1 (occupied).
+ *
+ * You are then given stamps of size stampHeight x stampWidth. We want to fit the stamps such that
+ * they follow the given restrictions and requirements:
+ * 1. Cover all the empty cells.
+ * 2. Do not cover any of the occupied cells.
+ * 3. We can put as many stamps as we want.
+ * 4. Stamps can overlap with each other.
+ * 5. Stamps are not allowed to be rotated.
+ * 6. Stamps must stay completely inside the grid.
+ *
+ * Return true if it is possible to fit the stamps while following the given restrictions and
+ * requirements. Otherwise, return false.
+ */
+
+/**
+ * @param {number[][]} grid
+ * @param {number} stampHeight
+ * @param {number} stampWidth
+ * @return {boolean}
+ */
+var possibleToStamp = function(grid, stampHeight, stampWidth) {
+  const rows = grid.length;
+  const cols = grid[0].length;
+  const prefixSum = new Array(rows + 1).fill().map(() => new Array(cols + 1).fill(0));
+  const diff = new Array(rows + 1).fill().map(() => new Array(cols + 1).fill(0));
+
+  for (let i = 0; i < rows; i++) {
+    for (let j = 0; j < cols; j++) {
+      prefixSum[i + 1][j + 1] = prefixSum[i + 1][j] + prefixSum[i][j + 1]
+        - prefixSum[i][j] + grid[i][j];
+    }
+  }
+
+  for (let i = 0; i <= rows - stampHeight; i++) {
+    for (let j = 0; j <= cols - stampWidth; j++) {
+      const x = i + stampHeight;
+      const y = j + stampWidth;
+      if (prefixSum[x][y] - prefixSum[x][j] - prefixSum[i][y] + prefixSum[i][j] === 0) {
+        diff[i][j]++;
+        diff[i][y]--;
+        diff[x][j]--;
+        diff[x][y]++;
+      }
+    }
+  }
+
+  const covered = new Array(rows).fill().map(() => new Array(cols).fill(0));
+  for (let i = 0; i < rows; i++) {
+    for (let j = 0; j < cols; j++) {
+      covered[i][j] = (i > 0 ? covered[i - 1][j] : 0)
+        + (j > 0 ? covered[i][j - 1] : 0)
+        - (i > 0 && j > 0 ? covered[i - 1][j - 1] : 0) + diff[i][j];
+      if (grid[i][j] === 0 && covered[i][j] === 0) return false;
+    }
+  }
+
+  return true;
+};

From 55482a763f6892f39be071c39b45fb642114b9b5 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 13 May 2025 22:43:06 -0500
Subject: [PATCH 059/571] Add solution #2133

---
 README.md                                     |  3 +-
 ...ery-row-and-column-contains-all-numbers.js | 33 +++++++++++++++++++
 2 files changed, 35 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2133-check-if-every-row-and-column-contains-all-numbers.js

diff --git a/README.md b/README.md
index 84a5ed76..6f3021e2 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,767 LeetCode solutions in JavaScript
+# 1,768 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1634,6 +1634,7 @@
 2130|[Maximum Twin Sum of a Linked List](./solutions/2130-maximum-twin-sum-of-a-linked-list.js)|Medium|
 2131|[Longest Palindrome by Concatenating Two Letter Words](./solutions/2131-longest-palindrome-by-concatenating-two-letter-words.js)|Medium|
 2132|[Stamping the Grid](./solutions/2132-stamping-the-grid.js)|Hard|
+2133|[Check if Every Row and Column Contains All Numbers](./solutions/2133-check-if-every-row-and-column-contains-all-numbers.js)|Easy|
 2140|[Solving Questions With Brainpower](./solutions/2140-solving-questions-with-brainpower.js)|Medium|
 2145|[Count the Hidden Sequences](./solutions/2145-count-the-hidden-sequences.js)|Medium|
 2154|[Keep Multiplying Found Values by Two](./solutions/2154-keep-multiplying-found-values-by-two.js)|Easy|
diff --git a/solutions/2133-check-if-every-row-and-column-contains-all-numbers.js b/solutions/2133-check-if-every-row-and-column-contains-all-numbers.js
new file mode 100644
index 00000000..e8d6990a
--- /dev/null
+++ b/solutions/2133-check-if-every-row-and-column-contains-all-numbers.js
@@ -0,0 +1,33 @@
+/**
+ * 2133. Check if Every Row and Column Contains All Numbers
+ * https://leetcode.com/problems/check-if-every-row-and-column-contains-all-numbers/
+ * Difficulty: Easy
+ *
+ * An n x n matrix is valid if every row and every column contains all the integers from 1
+ * to n (inclusive).
+ *
+ * Given an n x n integer matrix matrix, return true if the matrix is valid. Otherwise,
+ * return false.
+ */
+
+/**
+ * @param {number[][]} matrix
+ * @return {boolean}
+ */
+var checkValid = function(matrix) {
+  const n = matrix.length;
+
+  for (let i = 0; i < n; i++) {
+    const rowSet = new Set();
+    const colSet = new Set();
+
+    for (let j = 0; j < n; j++) {
+      rowSet.add(matrix[i][j]);
+      colSet.add(matrix[j][i]);
+    }
+
+    if (rowSet.size !== n || colSet.size !== n) return false;
+  }
+
+  return true;
+};

From 36c933fb43d8e06de8cb64550320f7ce9f8736a3 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 13 May 2025 22:44:46 -0500
Subject: [PATCH 060/571] Add solution #2134

---
 README.md                                     |  3 +-
 ...nimum-swaps-to-group-all-1s-together-ii.js | 38 +++++++++++++++++++
 2 files changed, 40 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2134-minimum-swaps-to-group-all-1s-together-ii.js

diff --git a/README.md b/README.md
index 6f3021e2..06798418 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,768 LeetCode solutions in JavaScript
+# 1,769 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1635,6 +1635,7 @@
 2131|[Longest Palindrome by Concatenating Two Letter Words](./solutions/2131-longest-palindrome-by-concatenating-two-letter-words.js)|Medium|
 2132|[Stamping the Grid](./solutions/2132-stamping-the-grid.js)|Hard|
 2133|[Check if Every Row and Column Contains All Numbers](./solutions/2133-check-if-every-row-and-column-contains-all-numbers.js)|Easy|
+2134|[Minimum Swaps to Group All 1's Together II](./solutions/2134-minimum-swaps-to-group-all-1s-together-ii.js)|Medium|
 2140|[Solving Questions With Brainpower](./solutions/2140-solving-questions-with-brainpower.js)|Medium|
 2145|[Count the Hidden Sequences](./solutions/2145-count-the-hidden-sequences.js)|Medium|
 2154|[Keep Multiplying Found Values by Two](./solutions/2154-keep-multiplying-found-values-by-two.js)|Easy|
diff --git a/solutions/2134-minimum-swaps-to-group-all-1s-together-ii.js b/solutions/2134-minimum-swaps-to-group-all-1s-together-ii.js
new file mode 100644
index 00000000..1105dced
--- /dev/null
+++ b/solutions/2134-minimum-swaps-to-group-all-1s-together-ii.js
@@ -0,0 +1,38 @@
+/**
+ * 2134. Minimum Swaps to Group All 1's Together II
+ * https://leetcode.com/problems/minimum-swaps-to-group-all-1s-together-ii/
+ * Difficulty: Medium
+ *
+ * A swap is defined as taking two distinct positions in an array and swapping the values in them.
+ *
+ * A circular array is defined as an array where we consider the first element and the last element
+ * to be adjacent.
+ *
+ * Given a binary circular array nums, return the minimum number of swaps required to group all
+ * 1's present in the array together at any location.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var minSwaps = function(nums) {
+  const onesCount = nums.reduce((sum, num) => sum + num, 0);
+  const n = nums.length;
+  let result = Infinity;
+  let currentZeros = 0;
+
+  for (let i = 0; i < onesCount; i++) {
+    if (nums[i] === 0) currentZeros++;
+  }
+
+  result = currentZeros;
+
+  for (let i = 1; i < n; i++) {
+    if (nums[(i - 1) % n] === 0) currentZeros--;
+    if (nums[(i + onesCount - 1) % n] === 0) currentZeros++;
+    result = Math.min(result, currentZeros);
+  }
+
+  return result;
+};

From 817fc0fe6c42b04bdf2d431763c5914705446153 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 13 May 2025 22:46:30 -0500
Subject: [PATCH 061/571] Add solution #2135

---
 README.md                                     |  3 +-
 ...nt-words-obtained-after-adding-a-letter.js | 49 +++++++++++++++++++
 2 files changed, 51 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2135-count-words-obtained-after-adding-a-letter.js

diff --git a/README.md b/README.md
index 06798418..db1aedd3 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,769 LeetCode solutions in JavaScript
+# 1,770 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1636,6 +1636,7 @@
 2132|[Stamping the Grid](./solutions/2132-stamping-the-grid.js)|Hard|
 2133|[Check if Every Row and Column Contains All Numbers](./solutions/2133-check-if-every-row-and-column-contains-all-numbers.js)|Easy|
 2134|[Minimum Swaps to Group All 1's Together II](./solutions/2134-minimum-swaps-to-group-all-1s-together-ii.js)|Medium|
+2135|[Count Words Obtained After Adding a Letter](./solutions/2135-count-words-obtained-after-adding-a-letter.js)|Medium|
 2140|[Solving Questions With Brainpower](./solutions/2140-solving-questions-with-brainpower.js)|Medium|
 2145|[Count the Hidden Sequences](./solutions/2145-count-the-hidden-sequences.js)|Medium|
 2154|[Keep Multiplying Found Values by Two](./solutions/2154-keep-multiplying-found-values-by-two.js)|Easy|
diff --git a/solutions/2135-count-words-obtained-after-adding-a-letter.js b/solutions/2135-count-words-obtained-after-adding-a-letter.js
new file mode 100644
index 00000000..c7b08943
--- /dev/null
+++ b/solutions/2135-count-words-obtained-after-adding-a-letter.js
@@ -0,0 +1,49 @@
+/**
+ * 2135. Count Words Obtained After Adding a Letter
+ * https://leetcode.com/problems/count-words-obtained-after-adding-a-letter/
+ * Difficulty: Medium
+ *
+ * You are given two 0-indexed arrays of strings startWords and targetWords. Each string consists
+ * of lowercase English letters only.
+ *
+ * For each string in targetWords, check if it is possible to choose a string from startWords and
+ * perform a conversion operation on it to be equal to that from targetWords.
+ *
+ * The conversion operation is described in the following two steps:
+ * 1. Append any lowercase letter that is not present in the string to its end.
+ *    - For example, if the string is "abc", the letters 'd', 'e', or 'y' can be added to it, but
+ *      not 'a'. If 'd' is added, the resulting string will be "abcd".
+ * 2. Rearrange the letters of the new string in any arbitrary order.
+ *    - For example, "abcd" can be rearranged to "acbd", "bacd", "cbda", and so on. Note that it
+ *      can also be rearranged to "abcd" itself.
+ *
+ * Return the number of strings in targetWords that can be obtained by performing the operations
+ * on any string of startWords.
+ *
+ * Note that you will only be verifying if the string in targetWords can be obtained from a string
+ * in startWords by performing the operations. The strings in startWords do not actually change
+ * during this process.
+ */
+
+/**
+ * @param {string[]} startWords
+ * @param {string[]} targetWords
+ * @return {number}
+ */
+var wordCount = function(startWords, targetWords) {
+  const sortedStartWords = new Set(startWords.map(word => [...word].sort().join('')));
+  let result = 0;
+
+  for (const target of targetWords) {
+    const sortedTarget = [...target].sort().join('');
+    for (let i = 0; i < target.length; i++) {
+      const candidate = sortedTarget.slice(0, i) + sortedTarget.slice(i + 1);
+      if (sortedStartWords.has(candidate)) {
+        result++;
+        break;
+      }
+    }
+  }
+
+  return result;
+};

From c77d264e7f0dc2056d86a17c5e67da84897aa529 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 13 May 2025 22:55:56 -0500
Subject: [PATCH 062/571] Add solution #2136

---
 README.md                                     |  3 +-
 ...136-earliest-possible-day-of-full-bloom.js | 39 +++++++++++++++++++
 2 files changed, 41 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2136-earliest-possible-day-of-full-bloom.js

diff --git a/README.md b/README.md
index db1aedd3..60db9fc9 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,770 LeetCode solutions in JavaScript
+# 1,771 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1637,6 +1637,7 @@
 2133|[Check if Every Row and Column Contains All Numbers](./solutions/2133-check-if-every-row-and-column-contains-all-numbers.js)|Easy|
 2134|[Minimum Swaps to Group All 1's Together II](./solutions/2134-minimum-swaps-to-group-all-1s-together-ii.js)|Medium|
 2135|[Count Words Obtained After Adding a Letter](./solutions/2135-count-words-obtained-after-adding-a-letter.js)|Medium|
+2136|[Earliest Possible Day of Full Bloom](./solutions/2136-earliest-possible-day-of-full-bloom.js)|Hard|
 2140|[Solving Questions With Brainpower](./solutions/2140-solving-questions-with-brainpower.js)|Medium|
 2145|[Count the Hidden Sequences](./solutions/2145-count-the-hidden-sequences.js)|Medium|
 2154|[Keep Multiplying Found Values by Two](./solutions/2154-keep-multiplying-found-values-by-two.js)|Easy|
diff --git a/solutions/2136-earliest-possible-day-of-full-bloom.js b/solutions/2136-earliest-possible-day-of-full-bloom.js
new file mode 100644
index 00000000..e4a07b6c
--- /dev/null
+++ b/solutions/2136-earliest-possible-day-of-full-bloom.js
@@ -0,0 +1,39 @@
+/**
+ * 2136. Earliest Possible Day of Full Bloom
+ * https://leetcode.com/problems/earliest-possible-day-of-full-bloom/
+ * Difficulty: Hard
+ *
+ * You have n flower seeds. Every seed must be planted first before it can begin to grow, then
+ * bloom. Planting a seed takes time and so does the growth of a seed. You are given two 0-indexed
+ * integer arrays plantTime and growTime, of length n each:
+ * - plantTime[i] is the number of full days it takes you to plant the ith seed. Every day, you can
+ *   work on planting exactly one seed. You do not have to work on planting the same seed on
+ *   consecutive days, but the planting of a seed is not complete until you have worked plantTime[i]
+ *   days on planting it in total.
+ * - growTime[i] is the number of full days it takes the ith seed to grow after being completely
+ *   planted. After the last day of its growth, the flower blooms and stays bloomed forever.
+ *
+ * From the beginning of day 0, you can plant the seeds in any order.
+ *
+ * Return the earliest possible day where all seeds are blooming.
+ */
+
+/**
+ * @param {number[]} plantTime
+ * @param {number[]} growTime
+ * @return {number}
+ */
+var earliestFullBloom = function(plantTime, growTime) {
+  const seeds = plantTime.map((plant, index) => ({ plant, grow: growTime[index] }));
+  seeds.sort((a, b) => b.grow - a.grow);
+
+  let plantingDays = 0;
+  let result = 0;
+
+  for (const { plant, grow } of seeds) {
+    plantingDays += plant;
+    result = Math.max(result, plantingDays + grow);
+  }
+
+  return result;
+};

From ec1b489e0c85cc53ac0844bd79fe15fd606d3a85 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 13 May 2025 22:58:55 -0500
Subject: [PATCH 063/571] Add solution #2138

---
 README.md                                     |  3 +-
 ...8-divide-a-string-into-groups-of-size-k.js | 35 +++++++++++++++++++
 2 files changed, 37 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2138-divide-a-string-into-groups-of-size-k.js

diff --git a/README.md b/README.md
index 60db9fc9..52a2f60d 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,771 LeetCode solutions in JavaScript
+# 1,772 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1638,6 +1638,7 @@
 2134|[Minimum Swaps to Group All 1's Together II](./solutions/2134-minimum-swaps-to-group-all-1s-together-ii.js)|Medium|
 2135|[Count Words Obtained After Adding a Letter](./solutions/2135-count-words-obtained-after-adding-a-letter.js)|Medium|
 2136|[Earliest Possible Day of Full Bloom](./solutions/2136-earliest-possible-day-of-full-bloom.js)|Hard|
+2138|[Divide a String Into Groups of Size k](./solutions/2138-divide-a-string-into-groups-of-size-k.js)|Easy|
 2140|[Solving Questions With Brainpower](./solutions/2140-solving-questions-with-brainpower.js)|Medium|
 2145|[Count the Hidden Sequences](./solutions/2145-count-the-hidden-sequences.js)|Medium|
 2154|[Keep Multiplying Found Values by Two](./solutions/2154-keep-multiplying-found-values-by-two.js)|Easy|
diff --git a/solutions/2138-divide-a-string-into-groups-of-size-k.js b/solutions/2138-divide-a-string-into-groups-of-size-k.js
new file mode 100644
index 00000000..24d0197f
--- /dev/null
+++ b/solutions/2138-divide-a-string-into-groups-of-size-k.js
@@ -0,0 +1,35 @@
+/**
+ * 2138. Divide a String Into Groups of Size k
+ * https://leetcode.com/problems/divide-a-string-into-groups-of-size-k/
+ * Difficulty: Easy
+ *
+ * A string s can be partitioned into groups of size k using the following procedure:
+ * - The first group consists of the first k characters of the string, the second group consists
+ *   of the next k characters of the string, and so on. Each element can be a part of exactly one
+ *   group.
+ * - For the last group, if the string does not have k characters remaining, a character fill is
+ *   used to complete the group.
+ *
+ * Note that the partition is done so that after removing the fill character from the last group
+ * (if it exists) and concatenating all the groups in order, the resultant string should be s.
+ *
+ * Given the string s, the size of each group k and the character fill, return a string array
+ * denoting the composition of every group s has been divided into, using the above procedure.
+ */
+
+/**
+ * @param {string} s
+ * @param {number} k
+ * @param {character} fill
+ * @return {string[]}
+ */
+var divideString = function(s, k, fill) {
+  const paddedString = s + fill.repeat((k - s.length % k) % k);
+  const result = [];
+
+  for (let i = 0; i < paddedString.length; i += k) {
+    result.push(paddedString.slice(i, i + k));
+  }
+
+  return result;
+};

From b048eebe95d542450b54c124e5d054d18bdcb6a4 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 13 May 2025 23:01:50 -0500
Subject: [PATCH 064/571] Add solution #2139

---
 README.md                                     |  3 +-
 ...139-minimum-moves-to-reach-target-score.js | 40 +++++++++++++++++++
 2 files changed, 42 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2139-minimum-moves-to-reach-target-score.js

diff --git a/README.md b/README.md
index 52a2f60d..656bb447 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,772 LeetCode solutions in JavaScript
+# 1,773 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1639,6 +1639,7 @@
 2135|[Count Words Obtained After Adding a Letter](./solutions/2135-count-words-obtained-after-adding-a-letter.js)|Medium|
 2136|[Earliest Possible Day of Full Bloom](./solutions/2136-earliest-possible-day-of-full-bloom.js)|Hard|
 2138|[Divide a String Into Groups of Size k](./solutions/2138-divide-a-string-into-groups-of-size-k.js)|Easy|
+2139|[Minimum Moves to Reach Target Score](./solutions/2139-minimum-moves-to-reach-target-score.js)|Medium|
 2140|[Solving Questions With Brainpower](./solutions/2140-solving-questions-with-brainpower.js)|Medium|
 2145|[Count the Hidden Sequences](./solutions/2145-count-the-hidden-sequences.js)|Medium|
 2154|[Keep Multiplying Found Values by Two](./solutions/2154-keep-multiplying-found-values-by-two.js)|Easy|
diff --git a/solutions/2139-minimum-moves-to-reach-target-score.js b/solutions/2139-minimum-moves-to-reach-target-score.js
new file mode 100644
index 00000000..a074595f
--- /dev/null
+++ b/solutions/2139-minimum-moves-to-reach-target-score.js
@@ -0,0 +1,40 @@
+/**
+ * 2139. Minimum Moves to Reach Target Score
+ * https://leetcode.com/problems/minimum-moves-to-reach-target-score/
+ * Difficulty: Medium
+ *
+ * You are playing a game with integers. You start with the integer 1 and you want to reach
+ * the integer target.
+ *
+ * In one move, you can either:
+ * - Increment the current integer by one (i.e., x = x + 1).
+ * - Double the current integer (i.e., x = 2 * x).
+ *
+ * You can use the increment operation any number of times, however, you can only use the double
+ * operation at most maxDoubles times.
+ *
+ * Given the two integers target and maxDoubles, return the minimum number of moves needed to
+ * reach target starting with 1.
+ */
+
+/**
+ * @param {number} target
+ * @param {number} maxDoubles
+ * @return {number}
+ */
+var minMoves = function(target, maxDoubles) {
+  let moves = 0;
+  let current = target;
+
+  while (current > 1 && maxDoubles > 0) {
+    if (current % 2 === 0) {
+      current /= 2;
+      maxDoubles--;
+    } else {
+      current--;
+    }
+    moves++;
+  }
+
+  return moves + (current - 1);
+};

From bc30ef9836e85609cb68daca41d535b4db23f2b5 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 13 May 2025 23:04:46 -0500
Subject: [PATCH 065/571] Add solution #2141

---
 README.md                                     |  3 +-
 ...141-maximum-running-time-of-n-computers.js | 41 +++++++++++++++++++
 2 files changed, 43 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2141-maximum-running-time-of-n-computers.js

diff --git a/README.md b/README.md
index 656bb447..7d99e579 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,773 LeetCode solutions in JavaScript
+# 1,774 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1641,6 +1641,7 @@
 2138|[Divide a String Into Groups of Size k](./solutions/2138-divide-a-string-into-groups-of-size-k.js)|Easy|
 2139|[Minimum Moves to Reach Target Score](./solutions/2139-minimum-moves-to-reach-target-score.js)|Medium|
 2140|[Solving Questions With Brainpower](./solutions/2140-solving-questions-with-brainpower.js)|Medium|
+2141|[Maximum Running Time of N Computers](./solutions/2141-maximum-running-time-of-n-computers.js)|Hard|
 2145|[Count the Hidden Sequences](./solutions/2145-count-the-hidden-sequences.js)|Medium|
 2154|[Keep Multiplying Found Values by Two](./solutions/2154-keep-multiplying-found-values-by-two.js)|Easy|
 2161|[Partition Array According to Given Pivot](./solutions/2161-partition-array-according-to-given-pivot.js)|Medium|
diff --git a/solutions/2141-maximum-running-time-of-n-computers.js b/solutions/2141-maximum-running-time-of-n-computers.js
new file mode 100644
index 00000000..b5f7b090
--- /dev/null
+++ b/solutions/2141-maximum-running-time-of-n-computers.js
@@ -0,0 +1,41 @@
+/**
+ * 2141. Maximum Running Time of N Computers
+ * https://leetcode.com/problems/maximum-running-time-of-n-computers/
+ * Difficulty: Hard
+ *
+ * You have n computers. You are given the integer n and a 0-indexed integer array batteries
+ * where the ith battery can run a computer for batteries[i] minutes. You are interested in
+ * running all n computers simultaneously using the given batteries.
+ *
+ * Initially, you can insert at most one battery into each computer. After that and at any
+ * integer time moment, you can remove a battery from a computer and insert another battery
+ * any number of times. The inserted battery can be a totally new battery or a battery from
+ * another computer. You may assume that the removing and inserting processes take no time.
+ *
+ * Note that the batteries cannot be recharged.
+ *
+ * Return the maximum number of minutes you can run all the n computers simultaneously.
+ */
+
+/**
+ * @param {number} n
+ * @param {number[]} batteries
+ * @return {number}
+ */
+var maxRunTime = function(n, batteries) {
+  let left = 1;
+  let right = Math.floor(batteries.reduce((sum, battery) => sum + battery, 0) / n);
+
+  while (left < right) {
+    const mid = Math.floor((left + right + 1) / 2);
+    const total = batteries.reduce((sum, battery) => sum + Math.min(battery, mid), 0);
+
+    if (total >= n * mid) {
+      left = mid;
+    } else {
+      right = mid - 1;
+    }
+  }
+
+  return left;
+};

From d6aa3c91cd89784af0acb5f3dfa9b99ffedcc2a9 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 13 May 2025 23:06:23 -0500
Subject: [PATCH 066/571] Add solution #2144

---
 README.md                                     |  3 +-
 ...um-cost-of-buying-candies-with-discount.js | 33 +++++++++++++++++++
 2 files changed, 35 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2144-minimum-cost-of-buying-candies-with-discount.js

diff --git a/README.md b/README.md
index 7d99e579..03f965e4 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,774 LeetCode solutions in JavaScript
+# 1,775 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1642,6 +1642,7 @@
 2139|[Minimum Moves to Reach Target Score](./solutions/2139-minimum-moves-to-reach-target-score.js)|Medium|
 2140|[Solving Questions With Brainpower](./solutions/2140-solving-questions-with-brainpower.js)|Medium|
 2141|[Maximum Running Time of N Computers](./solutions/2141-maximum-running-time-of-n-computers.js)|Hard|
+2144|[Minimum Cost of Buying Candies With Discount](./solutions/2144-minimum-cost-of-buying-candies-with-discount.js)|Easy|
 2145|[Count the Hidden Sequences](./solutions/2145-count-the-hidden-sequences.js)|Medium|
 2154|[Keep Multiplying Found Values by Two](./solutions/2154-keep-multiplying-found-values-by-two.js)|Easy|
 2161|[Partition Array According to Given Pivot](./solutions/2161-partition-array-according-to-given-pivot.js)|Medium|
diff --git a/solutions/2144-minimum-cost-of-buying-candies-with-discount.js b/solutions/2144-minimum-cost-of-buying-candies-with-discount.js
new file mode 100644
index 00000000..86eca1e2
--- /dev/null
+++ b/solutions/2144-minimum-cost-of-buying-candies-with-discount.js
@@ -0,0 +1,33 @@
+/**
+ * 2144. Minimum Cost of Buying Candies With Discount
+ * https://leetcode.com/problems/minimum-cost-of-buying-candies-with-discount/
+ * Difficulty: Easy
+ *
+ * A shop is selling candies at a discount. For every two candies sold, the shop gives a
+ * third candy for free.
+ *
+ * The customer can choose any candy to take away for free as long as the cost of the
+ * chosen candy is less than or equal to the minimum cost of the two candies bought.
+ *
+ * - For example, if there are 4 candies with costs 1, 2, 3, and 4, and the customer buys
+ *   candies with costs 2 and 3, they can take the candy with cost 1 for free, but not the
+ *   candy with cost 4.
+ *
+ * Given a 0-indexed integer array cost, where cost[i] denotes the cost of the ith candy,
+ * return the minimum cost of buying all the candies.
+ */
+
+/**
+ * @param {number[]} cost
+ * @return {number}
+ */
+var minimumCost = function(cost) {
+  cost.sort((a, b) => b - a);
+  let result = 0;
+
+  for (let i = 0; i < cost.length; i += 3) {
+    result += cost[i] + (cost[i + 1] || 0);
+  }
+
+  return result;
+};

From f435a3cbe826339f660883e12ffd04a991cd439c Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 00:05:52 -0500
Subject: [PATCH 067/571] Add solution #2147

---
 README.md                                     |  3 +-
 ...umber-of-ways-to-divide-a-long-corridor.js | 58 +++++++++++++++++++
 2 files changed, 60 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2147-number-of-ways-to-divide-a-long-corridor.js

diff --git a/README.md b/README.md
index 03f965e4..9fa70bf5 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,775 LeetCode solutions in JavaScript
+# 1,776 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1644,6 +1644,7 @@
 2141|[Maximum Running Time of N Computers](./solutions/2141-maximum-running-time-of-n-computers.js)|Hard|
 2144|[Minimum Cost of Buying Candies With Discount](./solutions/2144-minimum-cost-of-buying-candies-with-discount.js)|Easy|
 2145|[Count the Hidden Sequences](./solutions/2145-count-the-hidden-sequences.js)|Medium|
+2147|[Number of Ways to Divide a Long Corridor](./solutions/2147-number-of-ways-to-divide-a-long-corridor.js)|Hard|
 2154|[Keep Multiplying Found Values by Two](./solutions/2154-keep-multiplying-found-values-by-two.js)|Easy|
 2161|[Partition Array According to Given Pivot](./solutions/2161-partition-array-according-to-given-pivot.js)|Medium|
 2176|[Count Equal and Divisible Pairs in an Array](./solutions/2176-count-equal-and-divisible-pairs-in-an-array.js)|Easy|
diff --git a/solutions/2147-number-of-ways-to-divide-a-long-corridor.js b/solutions/2147-number-of-ways-to-divide-a-long-corridor.js
new file mode 100644
index 00000000..e504b765
--- /dev/null
+++ b/solutions/2147-number-of-ways-to-divide-a-long-corridor.js
@@ -0,0 +1,58 @@
+/**
+ * 2147. Number of Ways to Divide a Long Corridor
+ * https://leetcode.com/problems/number-of-ways-to-divide-a-long-corridor/
+ * Difficulty: Hard
+ *
+ * Along a long library corridor, there is a line of seats and decorative plants. You are given
+ * a 0-indexed string corridor of length n consisting of letters 'S' and 'P' where each 'S'
+ * represents a seat and each 'P' represents a plant.
+ *
+ * One room divider has already been installed to the left of index 0, and another to the right
+ * of index n - 1. Additional room dividers can be installed. For each position between indices
+ * i - 1 and i (1 <= i <= n - 1), at most one divider can be installed.
+ *
+ * Divide the corridor into non-overlapping sections, where each section has exactly two seats
+ * with any number of plants. There may be multiple ways to perform the division. Two ways are
+ * different if there is a position with a room divider installed in the first way but not in
+ * the second way.
+ *
+ * Return the number of ways to divide the corridor. Since the answer may be very large, return
+ * it modulo 109 + 7. If there is no way, return 0.
+ */
+
+/**
+ * @param {string} corridor
+ * @return {number}
+ */
+var numberOfWays = function(corridor) {
+  const MOD = 1e9 + 7;
+  let seatCount = 0;
+  let result = 1;
+  let lastPairEnd = -1;
+
+  for (let i = 0; i < corridor.length; i++) {
+    if (corridor[i] === 'S') {
+      seatCount++;
+    }
+  }
+  if (seatCount === 0 || seatCount % 2 !== 0) {
+    return 0;
+  }
+
+  seatCount = 0;
+
+  for (let i = 0; i < corridor.length; i++) {
+    if (corridor[i] === 'S') {
+      seatCount++;
+
+      if (seatCount % 2 === 0) {
+        lastPairEnd = i;
+      } else if (seatCount > 1) {
+        const plantsCount = i - lastPairEnd - 1;
+        result = (result * (plantsCount + 1)) % MOD;
+      }
+    }
+  }
+
+  return result;
+};

From 59d562e261ff4a3eb800fbf60d99fa3883e1ebbf Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 00:07:15 -0500
Subject: [PATCH 068/571] Add solution #2148

---
 README.md                                     |  3 ++-
 ...h-strictly-smaller-and-greater-elements.js | 25 +++++++++++++++++++
 2 files changed, 27 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2148-count-elements-with-strictly-smaller-and-greater-elements.js

diff --git a/README.md b/README.md
index 9fa70bf5..6742d0f5 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,776 LeetCode solutions in JavaScript
+# 1,777 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1645,6 +1645,7 @@
 2144|[Minimum Cost of Buying Candies With Discount](./solutions/2144-minimum-cost-of-buying-candies-with-discount.js)|Easy|
 2145|[Count the Hidden Sequences](./solutions/2145-count-the-hidden-sequences.js)|Medium|
 2147|[Number of Ways to Divide a Long Corridor](./solutions/2147-number-of-ways-to-divide-a-long-corridor.js)|Hard|
+2148|[Count Elements With Strictly Smaller and Greater Elements](./solutions/2148-count-elements-with-strictly-smaller-and-greater-elements.js)|Easy|
 2154|[Keep Multiplying Found Values by Two](./solutions/2154-keep-multiplying-found-values-by-two.js)|Easy|
 2161|[Partition Array According to Given Pivot](./solutions/2161-partition-array-according-to-given-pivot.js)|Medium|
 2176|[Count Equal and Divisible Pairs in an Array](./solutions/2176-count-equal-and-divisible-pairs-in-an-array.js)|Easy|
diff --git a/solutions/2148-count-elements-with-strictly-smaller-and-greater-elements.js b/solutions/2148-count-elements-with-strictly-smaller-and-greater-elements.js
new file mode 100644
index 00000000..194880af
--- /dev/null
+++ b/solutions/2148-count-elements-with-strictly-smaller-and-greater-elements.js
@@ -0,0 +1,25 @@
+/**
+ * 2148. Count Elements With Strictly Smaller and Greater Elements
+ * https://leetcode.com/problems/count-elements-with-strictly-smaller-and-greater-elements/
+ * Difficulty: Easy
+ *
+ * Given an integer array nums, return the number of elements that have both a strictly
+ * smaller and a strictly greater element appear in nums.
+ */
+
+/**
+* @param {number[]} nums
+* @return {number}
+*/
+var countElements = function(nums) {
+  let result = 0;
+
+  if (nums.length <= 2) return 0;
+  for (const num of nums) {
+    if (num > Math.min(...nums) && num < Math.max(...nums)) {
+      result++;
+    }
+  }
+
+  return result;
+};

From bbef6109c02ab5b1e00ce0d671a461940c6f7de8 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 00:08:30 -0500
Subject: [PATCH 069/571] Add solution #2149

---
 README.md                                     |  3 +-
 .../2149-rearrange-array-elements-by-sign.js  | 33 +++++++++++++++++++
 2 files changed, 35 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2149-rearrange-array-elements-by-sign.js

diff --git a/README.md b/README.md
index 6742d0f5..25992b29 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,777 LeetCode solutions in JavaScript
+# 1,778 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1646,6 +1646,7 @@
 2145|[Count the Hidden Sequences](./solutions/2145-count-the-hidden-sequences.js)|Medium|
 2147|[Number of Ways to Divide a Long Corridor](./solutions/2147-number-of-ways-to-divide-a-long-corridor.js)|Hard|
 2148|[Count Elements With Strictly Smaller and Greater Elements](./solutions/2148-count-elements-with-strictly-smaller-and-greater-elements.js)|Easy|
+2149|[Rearrange Array Elements by Sign](./solutions/2149-rearrange-array-elements-by-sign.js)|Medium|
 2154|[Keep Multiplying Found Values by Two](./solutions/2154-keep-multiplying-found-values-by-two.js)|Easy|
 2161|[Partition Array According to Given Pivot](./solutions/2161-partition-array-according-to-given-pivot.js)|Medium|
 2176|[Count Equal and Divisible Pairs in an Array](./solutions/2176-count-equal-and-divisible-pairs-in-an-array.js)|Easy|
diff --git a/solutions/2149-rearrange-array-elements-by-sign.js b/solutions/2149-rearrange-array-elements-by-sign.js
new file mode 100644
index 00000000..7979e5ef
--- /dev/null
+++ b/solutions/2149-rearrange-array-elements-by-sign.js
@@ -0,0 +1,33 @@
+/**
+ * 2149. Rearrange Array Elements by Sign
+ * https://leetcode.com/problems/rearrange-array-elements-by-sign/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed integer array nums of even length consisting of an equal number
+ * of positive and negative integers.
+ *
+ * You should return the array of nums such that the the array follows the given conditions:
+ * 1. Every consecutive pair of integers have opposite signs.
+ * 2. For all integers with the same sign, the order in which they were present in nums is
+ *    preserved.
+ * 3. The rearranged array begins with a positive integer.
+ *
+ * Return the modified array after rearranging the elements to satisfy the aforementioned
+ * conditions.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number[]}
+ */
+var rearrangeArray = function(nums) {
+  const positives = nums.filter(num => num > 0);
+  const negatives = nums.filter(num => num < 0);
+  const result = [];
+
+  for (let i = 0; i < positives.length; i++) {
+    result.push(positives[i], negatives[i]);
+  }
+
+  return result;
+};

From 5b9bfa32c1b3c1800453621bbab6a2db7fe807d6 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 00:09:41 -0500
Subject: [PATCH 070/571] Add solution #2150

---
 README.md                                     |  3 +-
 ...50-find-all-lonely-numbers-in-the-array.js | 31 +++++++++++++++++++
 2 files changed, 33 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2150-find-all-lonely-numbers-in-the-array.js

diff --git a/README.md b/README.md
index 25992b29..65ff2cb8 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,778 LeetCode solutions in JavaScript
+# 1,779 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1647,6 +1647,7 @@
 2147|[Number of Ways to Divide a Long Corridor](./solutions/2147-number-of-ways-to-divide-a-long-corridor.js)|Hard|
 2148|[Count Elements With Strictly Smaller and Greater Elements](./solutions/2148-count-elements-with-strictly-smaller-and-greater-elements.js)|Easy|
 2149|[Rearrange Array Elements by Sign](./solutions/2149-rearrange-array-elements-by-sign.js)|Medium|
+2150|[Find All Lonely Numbers in the Array](./solutions/2150-find-all-lonely-numbers-in-the-array.js)|Medium|
 2154|[Keep Multiplying Found Values by Two](./solutions/2154-keep-multiplying-found-values-by-two.js)|Easy|
 2161|[Partition Array According to Given Pivot](./solutions/2161-partition-array-according-to-given-pivot.js)|Medium|
 2176|[Count Equal and Divisible Pairs in an Array](./solutions/2176-count-equal-and-divisible-pairs-in-an-array.js)|Easy|
diff --git a/solutions/2150-find-all-lonely-numbers-in-the-array.js b/solutions/2150-find-all-lonely-numbers-in-the-array.js
new file mode 100644
index 00000000..676badc6
--- /dev/null
+++ b/solutions/2150-find-all-lonely-numbers-in-the-array.js
@@ -0,0 +1,31 @@
+/**
+ * 2150. Find All Lonely Numbers in the Array
+ * https://leetcode.com/problems/find-all-lonely-numbers-in-the-array/
+ * Difficulty: Medium
+ *
+ * You are given an integer array nums. A number x is lonely when it appears only once, and
+ * no adjacent numbers (i.e. x + 1 and x - 1) appear in the array.
+ *
+ * Return all lonely numbers in nums. You may return the answer in any order.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number[]}
+ */
+var findLonely = function(nums) {
+  const map = new Map();
+
+  for (const num of nums) {
+    map.set(num, (map.get(num) || 0) + 1);
+  }
+
+  const result = [];
+  for (const [num, count] of map) {
+    if (count === 1 && !map.has(num - 1) && !map.has(num + 1)) {
+      result.push(num);
+    }
+  }
+
+  return result;
+};

From 6845bfe190d87233ca12a9dee627be91a83566e2 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 00:14:07 -0500
Subject: [PATCH 071/571] Add solution #2151

---
 README.md                                     |  3 +-
 ...maximum-good-people-based-on-statements.js | 59 +++++++++++++++++++
 2 files changed, 61 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2151-maximum-good-people-based-on-statements.js

diff --git a/README.md b/README.md
index 65ff2cb8..2d622581 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,779 LeetCode solutions in JavaScript
+# 1,780 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1648,6 +1648,7 @@
 2148|[Count Elements With Strictly Smaller and Greater Elements](./solutions/2148-count-elements-with-strictly-smaller-and-greater-elements.js)|Easy|
 2149|[Rearrange Array Elements by Sign](./solutions/2149-rearrange-array-elements-by-sign.js)|Medium|
 2150|[Find All Lonely Numbers in the Array](./solutions/2150-find-all-lonely-numbers-in-the-array.js)|Medium|
+2151|[Maximum Good People Based on Statements](./solutions/2151-maximum-good-people-based-on-statements.js)|Hard|
 2154|[Keep Multiplying Found Values by Two](./solutions/2154-keep-multiplying-found-values-by-two.js)|Easy|
 2161|[Partition Array According to Given Pivot](./solutions/2161-partition-array-according-to-given-pivot.js)|Medium|
 2176|[Count Equal and Divisible Pairs in an Array](./solutions/2176-count-equal-and-divisible-pairs-in-an-array.js)|Easy|
diff --git a/solutions/2151-maximum-good-people-based-on-statements.js b/solutions/2151-maximum-good-people-based-on-statements.js
new file mode 100644
index 00000000..9a5d71cd
--- /dev/null
+++ b/solutions/2151-maximum-good-people-based-on-statements.js
@@ -0,0 +1,59 @@
+/**
+ * 2151. Maximum Good People Based on Statements
+ * https://leetcode.com/problems/maximum-good-people-based-on-statements/
+ * Difficulty: Hard
+ *
+ * There are two types of persons:
+ * - The good person: The person who always tells the truth.
+ * - The bad person: The person who might tell the truth and might lie.
+ *
+ * You are given a 0-indexed 2D integer array statements of size n x n that represents the
+ * statements made by n people about each other. More specifically, statements[i][j] could
+ * be one of the following:
+ * - 0 which represents a statement made by person i that person j is a bad person.
+ * - 1 which represents a statement made by person i that person j is a good person.
+ * - 2 represents that no statement is made by person i about person j.
+ *
+ * Additionally, no person ever makes a statement about themselves. Formally, we have that
+ * statements[i][i] = 2 for all 0 <= i < n.
+ *
+ * Return the maximum number of people who can be good based on the statements made by the
+ * n people.
+ */
+
+/**
+ * @param {number[][]} statements
+ * @return {number}
+ */
+var maximumGood = function(statements) {
+  const n = statements.length;
+  let result = 0;
+
+  backtrack(0, new Array(n).fill(false), 0);
+  return result;
+
+  function isValid(goodPeople) {
+    for (let i = 0; i < n; i++) {
+      if (!goodPeople[i]) continue;
+      for (let j = 0; j < n; j++) {
+        if (statements[i][j] === 0 && goodPeople[j]) return false;
+        if (statements[i][j] === 1 && !goodPeople[j]) return false;
+      }
+    }
+    return true;
+  }
+
+  function backtrack(index, goodPeople, goodCount) {
+    if (index === n) {
+      if (isValid(goodPeople)) {
+        result = Math.max(result, goodCount);
+      }
+      return;
+    }
+
+    goodPeople[index] = true;
+    backtrack(index + 1, goodPeople, goodCount + 1);
+    goodPeople[index] = false;
+    backtrack(index + 1, goodPeople, goodCount);
+  }
+};

From 8ab9d01e01124a314dcc1ea3344067a911597b30 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 00:17:01 -0500
Subject: [PATCH 072/571] Add solution #2155

---
 README.md                                     |  3 +-
 ...ith-the-highest-score-of-a-binary-array.js | 45 +++++++++++++++++++
 2 files changed, 47 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2155-all-divisions-with-the-highest-score-of-a-binary-array.js

diff --git a/README.md b/README.md
index 2d622581..64bc7152 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,780 LeetCode solutions in JavaScript
+# 1,781 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1650,6 +1650,7 @@
 2150|[Find All Lonely Numbers in the Array](./solutions/2150-find-all-lonely-numbers-in-the-array.js)|Medium|
 2151|[Maximum Good People Based on Statements](./solutions/2151-maximum-good-people-based-on-statements.js)|Hard|
 2154|[Keep Multiplying Found Values by Two](./solutions/2154-keep-multiplying-found-values-by-two.js)|Easy|
+2155|[All Divisions With the Highest Score of a Binary Array](./solutions/2155-all-divisions-with-the-highest-score-of-a-binary-array.js)|Medium|
 2161|[Partition Array According to Given Pivot](./solutions/2161-partition-array-according-to-given-pivot.js)|Medium|
 2176|[Count Equal and Divisible Pairs in an Array](./solutions/2176-count-equal-and-divisible-pairs-in-an-array.js)|Easy|
 2179|[Count Good Triplets in an Array](./solutions/2179-count-good-triplets-in-an-array.js)|Hard|
diff --git a/solutions/2155-all-divisions-with-the-highest-score-of-a-binary-array.js b/solutions/2155-all-divisions-with-the-highest-score-of-a-binary-array.js
new file mode 100644
index 00000000..66db5b2f
--- /dev/null
+++ b/solutions/2155-all-divisions-with-the-highest-score-of-a-binary-array.js
@@ -0,0 +1,45 @@
+/**
+ * 2155. All Divisions With the Highest Score of a Binary Array
+ * https://leetcode.com/problems/all-divisions-with-the-highest-score-of-a-binary-array/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed binary array nums of length n. nums can be divided at index i
+ * (where 0 <= i <= n) into two arrays (possibly empty) numsleft and numsright:
+ * - numsleft has all the elements of nums between index 0 and i - 1 (inclusive), while numsright
+ *   has all the elements of nums between index i and n - 1 (inclusive).
+ * - If i == 0, numsleft is empty, while numsright has all the elements of nums.
+ * - If i == n, numsleft has all the elements of nums, while numsright is empty.
+ *
+ * The division score of an index i is the sum of the number of 0's in numsleft and the number
+ * of 1's in numsright.
+ *
+ * Return all distinct indices that have the highest possible division score. You may return
+ * the answer in any order.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number[]}
+ */
+var maxScoreIndices = function(nums) {
+  const result = [0];
+  let leftZeros = 0;
+  let rightOnes = nums.reduce((sum, num) => sum + num, 0);
+  let maxScore = rightOnes;
+
+  for (let i = 0; i < nums.length; i++) {
+    leftZeros += nums[i] === 0 ? 1 : 0;
+    rightOnes -= nums[i];
+    const score = leftZeros + rightOnes;
+
+    if (score > maxScore) {
+      maxScore = score;
+      result.length = 0;
+      result.push(i + 1);
+    } else if (score === maxScore) {
+      result.push(i + 1);
+    }
+  }
+
+  return result;
+};

From 1fbf170622b4318bf680887b4171bd6eae60c53a Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 00:35:10 -0500
Subject: [PATCH 073/571] Add solution #2156

---
 README.md                                     |  3 +-
 ...56-find-substring-with-given-hash-value.js | 51 +++++++++++++++++++
 2 files changed, 53 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2156-find-substring-with-given-hash-value.js

diff --git a/README.md b/README.md
index 64bc7152..b985d65d 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,781 LeetCode solutions in JavaScript
+# 1,782 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1651,6 +1651,7 @@
 2151|[Maximum Good People Based on Statements](./solutions/2151-maximum-good-people-based-on-statements.js)|Hard|
 2154|[Keep Multiplying Found Values by Two](./solutions/2154-keep-multiplying-found-values-by-two.js)|Easy|
 2155|[All Divisions With the Highest Score of a Binary Array](./solutions/2155-all-divisions-with-the-highest-score-of-a-binary-array.js)|Medium|
+2156|[Find Substring With Given Hash Value](./solutions/2156-find-substring-with-given-hash-value.js)|Hard|
 2161|[Partition Array According to Given Pivot](./solutions/2161-partition-array-according-to-given-pivot.js)|Medium|
 2176|[Count Equal and Divisible Pairs in an Array](./solutions/2176-count-equal-and-divisible-pairs-in-an-array.js)|Easy|
 2179|[Count Good Triplets in an Array](./solutions/2179-count-good-triplets-in-an-array.js)|Hard|
diff --git a/solutions/2156-find-substring-with-given-hash-value.js b/solutions/2156-find-substring-with-given-hash-value.js
new file mode 100644
index 00000000..a43f4a10
--- /dev/null
+++ b/solutions/2156-find-substring-with-given-hash-value.js
@@ -0,0 +1,51 @@
+/**
+ * 2156. Find Substring With Given Hash Value
+ * https://leetcode.com/problems/find-substring-with-given-hash-value/
+ * Difficulty: Hard
+ *
+ * The hash of a 0-indexed string s of length k, given integers p and m, is computed using
+ * the following function:
+ * - hash(s, p, m) = (val(s[0]) * p0 + val(s[1]) * p1 + ... + val(s[k-1]) * pk-1) mod m.
+ *
+ * Where val(s[i]) represents the index of s[i] in the alphabet from val('a') = 1 to val('z') = 26.
+ *
+ * You are given a string s and the integers power, modulo, k, and hashValue. Return sub, the
+ * first substring of s of length k such that hash(sub, power, modulo) == hashValue.
+ *
+ * The test cases will be generated such that an answer always exists.
+ *
+ * A substring is a contiguous non-empty sequence of characters within a string.
+ */
+
+/**
+* @param {string} s
+* @param {number} power
+* @param {number} modulo
+* @param {number} k
+* @param {number} hashValue
+* @return {string}
+*/
+var subStrHash = function(s, power, modulo, k, hashValue) {
+  power = BigInt(power);
+  modulo = BigInt(modulo);
+  hashValue = BigInt(hashValue);
+
+  const powers = new Array(k);
+  powers[0] = 1n;
+  for (let i = 1; i < k; i++) {
+    powers[i] = (powers[i - 1] * power) % modulo;
+  }
+
+  for (let start = 0; start <= s.length - k; start++) {
+    let hash = 0n;
+    for (let i = 0; i < k; i++) {
+      const charVal = BigInt(s.charCodeAt(start + i) - 'a'.charCodeAt(0) + 1);
+      hash = (hash + charVal * powers[i]) % modulo;
+    }
+    if (hash === hashValue) {
+      return s.substring(start, start + k);
+    }
+  }
+
+  return '';
+};

From d2ea5b5535964dcd1cba214b0eb390742a68edf9 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 00:45:27 -0500
Subject: [PATCH 074/571] Add solution #2157

---
 README.md                           |   3 +-
 solutions/2157-groups-of-strings.js | 140 ++++++++++++++++++++++++++++
 2 files changed, 142 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2157-groups-of-strings.js

diff --git a/README.md b/README.md
index b985d65d..453530ee 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,782 LeetCode solutions in JavaScript
+# 1,783 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1652,6 +1652,7 @@
 2154|[Keep Multiplying Found Values by Two](./solutions/2154-keep-multiplying-found-values-by-two.js)|Easy|
 2155|[All Divisions With the Highest Score of a Binary Array](./solutions/2155-all-divisions-with-the-highest-score-of-a-binary-array.js)|Medium|
 2156|[Find Substring With Given Hash Value](./solutions/2156-find-substring-with-given-hash-value.js)|Hard|
+2157|[Groups of Strings](./solutions/2157-groups-of-strings.js)|Hard|
 2161|[Partition Array According to Given Pivot](./solutions/2161-partition-array-according-to-given-pivot.js)|Medium|
 2176|[Count Equal and Divisible Pairs in an Array](./solutions/2176-count-equal-and-divisible-pairs-in-an-array.js)|Easy|
 2179|[Count Good Triplets in an Array](./solutions/2179-count-good-triplets-in-an-array.js)|Hard|
diff --git a/solutions/2157-groups-of-strings.js b/solutions/2157-groups-of-strings.js
new file mode 100644
index 00000000..8af51c12
--- /dev/null
+++ b/solutions/2157-groups-of-strings.js
@@ -0,0 +1,140 @@
+/**
+ * 2157. Groups of Strings
+ * https://leetcode.com/problems/groups-of-strings/
+ * Difficulty: Hard
+ *
+ * You are given a 0-indexed array of strings words. Each string consists of lowercase English
+ * letters only. No letter occurs more than once in any string of words.
+ *
+ * Two strings s1 and s2 are said to be connected if the set of letters of s2 can be obtained
+ * from the set of letters of s1 by any one of the following operations:
+ * - Adding exactly one letter to the set of the letters of s1.
+ * - Deleting exactly one letter from the set of the letters of s1.
+ * - Replacing exactly one letter from the set of the letters of s1 with any letter, including
+ *   itself.
+ *
+ * The array words can be divided into one or more non-intersecting groups. A string belongs
+ * to a group if any one of the following is true:
+ * - It is connected to at least one other string of the group.
+ * - It is the only string present in the group.
+ *
+ * Note that the strings in words should be grouped in such a manner that a string belonging
+ * to a group cannot be connected to a string present in any other group. It can be proved
+ * that such an arrangement is always unique.
+ *
+ * Return an array ans of size 2 where:
+ * - ans[0] is the maximum number of groups words can be divided into, and
+ * - ans[1] is the size of the largest group.
+ */
+
+/**
+ * @param {string[]} words
+ * @return {number[]}
+ */
+var groupStrings = function(words) {
+  const n = words.length;
+  const masks = words.map(word => {
+    let mask = 0;
+    for (let i = 0; i < word.length; i++) {
+      mask |= (1 << (word.charCodeAt(i) - 'a'.charCodeAt(0)));
+    }
+    return mask;
+  });
+  const uf = new UnionFind(n);
+  const maskToIndex = new Map();
+  for (let i = 0; i < n; i++) {
+    if (maskToIndex.has(masks[i])) {
+      uf.union(maskToIndex.get(masks[i]), i);
+    } else {
+      maskToIndex.set(masks[i], i);
+    }
+  }
+  const processed = new Set();
+
+  for (let i = 0; i < n; i++) {
+    const mask = masks[i];
+    if (processed.has(mask)) continue;
+    processed.add(mask);
+
+    for (let bit = 0; bit < 26; bit++) {
+      if ((mask & (1 << bit)) === 0) {
+        const newMask = mask | (1 << bit);
+        if (maskToIndex.has(newMask)) {
+          uf.union(i, maskToIndex.get(newMask));
+        }
+      }
+    }
+
+    for (let bit = 0; bit < 26; bit++) {
+      if ((mask & (1 << bit)) !== 0) {
+        const newMask = mask & ~(1 << bit);
+        if (maskToIndex.has(newMask)) {
+          uf.union(i, maskToIndex.get(newMask));
+        }
+      }
+    }
+
+    for (let remove = 0; remove < 26; remove++) {
+      if ((mask & (1 << remove)) !== 0) {
+        for (let add = 0; add < 26; add++) {
+          if ((mask & (1 << add)) === 0) {
+            const newMask = (mask & ~(1 << remove)) | (1 << add);
+            if (maskToIndex.has(newMask)) {
+              uf.union(i, maskToIndex.get(newMask));
+            }
+          }
+        }
+      }
+    }
+  }
+
+  return [uf.count, uf.getMaxSize()];
+};
+
+class UnionFind {
+  constructor(n) {
+    this.parent = Array(n).fill().map((_, i) => i);
+    this.rank = Array(n).fill(0);
+    this.count = n;
+    this.sizes = Array(n).fill(1);
+  }
+
+  find(x) {
+    if (this.parent[x] !== x) {
+      this.parent[x] = this.find(this.parent[x]);
+    }
+    return this.parent[x];
+  }
+
+  union(x, y) {
+    const rootX = this.find(x);
+    const rootY = this.find(y);
+
+    if (rootX === rootY) return false;
+
+    if (this.rank[rootX] < this.rank[rootY]) {
+      this.parent[rootX] = rootY;
+      this.sizes[rootY] += this.sizes[rootX];
+    } else if (this.rank[rootX] > this.rank[rootY]) {
+      this.parent[rootY] = rootX;
+      this.sizes[rootX] += this.sizes[rootY];
+    } else {
+      this.parent[rootY] = rootX;
+      this.rank[rootX]++;
+      this.sizes[rootX] += this.sizes[rootY];
+    }
+
+    this.count--;
+    return true;
+  }
+
+  getMaxSize() {
+    let maxSize = 0;
+    for (let i = 0; i < this.parent.length; i++) {
+      if (this.parent[i] === i) {
+        maxSize = Math.max(maxSize, this.sizes[i]);
+      }
+    }
+    return maxSize;
+  }
+}

From 4ac50a7a701573b37bfeeecead1d0a42a7e2e07b Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 00:46:44 -0500
Subject: [PATCH 075/571] Add solution #2160

---
 README.md                                     |  3 ++-
 ...our-digit-number-after-splitting-digits.js | 22 +++++++++++++++++++
 2 files changed, 24 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2160-minimum-sum-of-four-digit-number-after-splitting-digits.js

diff --git a/README.md b/README.md
index 453530ee..75413a3f 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,783 LeetCode solutions in JavaScript
+# 1,784 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1653,6 +1653,7 @@
 2155|[All Divisions With the Highest Score of a Binary Array](./solutions/2155-all-divisions-with-the-highest-score-of-a-binary-array.js)|Medium|
 2156|[Find Substring With Given Hash Value](./solutions/2156-find-substring-with-given-hash-value.js)|Hard|
 2157|[Groups of Strings](./solutions/2157-groups-of-strings.js)|Hard|
+2160|[Minimum Sum of Four Digit Number After Splitting Digits](./solutions/2160-minimum-sum-of-four-digit-number-after-splitting-digits.js)|Easy|
 2161|[Partition Array According to Given Pivot](./solutions/2161-partition-array-according-to-given-pivot.js)|Medium|
 2176|[Count Equal and Divisible Pairs in an Array](./solutions/2176-count-equal-and-divisible-pairs-in-an-array.js)|Easy|
 2179|[Count Good Triplets in an Array](./solutions/2179-count-good-triplets-in-an-array.js)|Hard|
diff --git a/solutions/2160-minimum-sum-of-four-digit-number-after-splitting-digits.js b/solutions/2160-minimum-sum-of-four-digit-number-after-splitting-digits.js
new file mode 100644
index 00000000..fa3b9b86
--- /dev/null
+++ b/solutions/2160-minimum-sum-of-four-digit-number-after-splitting-digits.js
@@ -0,0 +1,22 @@
+/**
+ * 2160. Minimum Sum of Four Digit Number After Splitting Digits
+ * https://leetcode.com/problems/minimum-sum-of-four-digit-number-after-splitting-digits/
+ * Difficulty: Easy
+ *
+ * You are given a positive integer num consisting of exactly four digits. Split num into two
+ * new integers new1 and new2 by using the digits found in num. Leading zeros are allowed in
+ * new1 and new2, and all the digits found in num must be used.
+ * - For example, given num = 2932, you have the following digits: two 2's, one 9 and one 3.
+ *   Some of the possible pairs [new1, new2] are [22, 93], [23, 92], [223, 9] and [2, 329].
+ *
+ * Return the minimum possible sum of new1 and new2.
+ */
+
+/**
+ * @param {number} num
+ * @return {number}
+ */
+var minimumSum = function(num) {
+  const digits = String(num).split('').map(Number).sort((a, b) => a - b);
+  return (digits[0] * 10 + digits[2]) + (digits[1] * 10 + digits[3]);
+};

From 4b614dffcd7fa9fcd186dea800c5437178b03327 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 00:51:18 -0500
Subject: [PATCH 076/571] Add solution #2162

---
 README.md                                     |  3 +-
 .../2162-minimum-cost-to-set-cooking-time.js  | 90 +++++++++++++++++++
 2 files changed, 92 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2162-minimum-cost-to-set-cooking-time.js

diff --git a/README.md b/README.md
index 75413a3f..13c33f3c 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,784 LeetCode solutions in JavaScript
+# 1,785 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1655,6 +1655,7 @@
 2157|[Groups of Strings](./solutions/2157-groups-of-strings.js)|Hard|
 2160|[Minimum Sum of Four Digit Number After Splitting Digits](./solutions/2160-minimum-sum-of-four-digit-number-after-splitting-digits.js)|Easy|
 2161|[Partition Array According to Given Pivot](./solutions/2161-partition-array-according-to-given-pivot.js)|Medium|
+2162|[Minimum Cost to Set Cooking Time](./solutions/2162-minimum-cost-to-set-cooking-time.js)|Medium|
 2176|[Count Equal and Divisible Pairs in an Array](./solutions/2176-count-equal-and-divisible-pairs-in-an-array.js)|Easy|
 2179|[Count Good Triplets in an Array](./solutions/2179-count-good-triplets-in-an-array.js)|Hard|
 2185|[Counting Words With a Given Prefix](./solutions/2185-counting-words-with-a-given-prefix.js)|Easy|
diff --git a/solutions/2162-minimum-cost-to-set-cooking-time.js b/solutions/2162-minimum-cost-to-set-cooking-time.js
new file mode 100644
index 00000000..e1c51c1b
--- /dev/null
+++ b/solutions/2162-minimum-cost-to-set-cooking-time.js
@@ -0,0 +1,90 @@
+/**
+ * 2162. Minimum Cost to Set Cooking Time
+ * https://leetcode.com/problems/minimum-cost-to-set-cooking-time/
+ * Difficulty: Medium
+ *
+ * A generic microwave supports cooking times for:
+ * - at least 1 second.
+ * - at most 99 minutes and 99 seconds.
+ *
+ * To set the cooking time, you push at most four digits. The microwave normalizes what you push
+ * as four digits by prepending zeroes. It interprets the first two digits as the minutes and
+ * the last two digits as the seconds. It then adds them up as the cooking time. For example,
+ * - You push 9 5 4 (three digits). It is normalized as 0954 and interpreted as 9 minutes and
+ *   54 seconds.
+ * - You push 0 0 0 8 (four digits). It is interpreted as 0 minutes and 8 seconds.
+ * - You push 8 0 9 0. It is interpreted as 80 minutes and 90 seconds.
+ * - You push 8 1 3 0. It is interpreted as 81 minutes and 30 seconds.
+ *
+ * You are given integers startAt, moveCost, pushCost, and targetSeconds. Initially, your finger
+ * is on the digit startAt. Moving the finger above any specific digit costs moveCost units of
+ * fatigue. Pushing the digit below the finger once costs pushCost units of fatigue.
+ *
+ * There can be multiple ways to set the microwave to cook for targetSeconds seconds but you are
+ * interested in the way with the minimum cost.
+ *
+ * Return the minimum cost to set targetSeconds seconds of cooking time.
+ *
+ * Remember that one minute consists of 60 seconds.
+ */
+
+/**
+ * @param {number} startAt
+ * @param {number} moveCost
+ * @param {number} pushCost
+ * @param {number} targetSeconds
+ * @return {number}
+ */
+var minCostSetTime = function(startAt, moveCost, pushCost, targetSeconds) {
+  const minutes1 = Math.floor(targetSeconds / 60);
+  const seconds1 = targetSeconds % 60;
+  let result = Infinity;
+
+  if (minutes1 <= 99) {
+    const digits1 = getDigits(minutes1, seconds1);
+    result = Math.min(result, calculateCost(digits1));
+  }
+
+  const minutes2 = Math.floor(targetSeconds / 60) - 1;
+  const seconds2 = targetSeconds % 60 + 60;
+  if (minutes2 >= 0 && minutes2 <= 99 && seconds2 <= 99) {
+    const digits2 = getDigits(minutes2, seconds2);
+    result = Math.min(result, calculateCost(digits2));
+  }
+
+  return result;
+
+  function calculateCost(digits) {
+    let totalCost = 0;
+    let currentDigit = startAt;
+
+    for (const digit of digits) {
+      if (digit !== currentDigit) {
+        totalCost += moveCost;
+        currentDigit = digit;
+      }
+      totalCost += pushCost;
+    }
+
+    return totalCost;
+  }
+
+  function getDigits(minutes, seconds) {
+    const result = [];
+
+    if (minutes > 0) {
+      if (minutes >= 10) {
+        result.push(Math.floor(minutes / 10));
+      }
+      result.push(minutes % 10);
+    }
+
+    if (minutes > 0 || seconds >= 10) {
+      result.push(Math.floor(seconds / 10));
+    }
+
+    result.push(seconds % 10);
+
+    return result;
+  }
+};

From dfcd6a2e3bed6be3e90f52c5287b993a2864ed66 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 19:04:45 -0500
Subject: [PATCH 077/571] Add solution #2900

---
 README.md                                     |  3 +-
 ...t-unequal-adjacent-groups-subsequence-i.js | 40 +++++++++++++++++++
 2 files changed, 42 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2900-longest-unequal-adjacent-groups-subsequence-i.js

diff --git a/README.md b/README.md
index 13c33f3c..ef853b16 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,785 LeetCode solutions in JavaScript
+# 1,786 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1755,6 +1755,7 @@
 2845|[Count of Interesting Subarrays](./solutions/2845-count-of-interesting-subarrays.js)|Medium|
 2873|[Maximum Value of an Ordered Triplet I](./solutions/2873-maximum-value-of-an-ordered-triplet-i.js)|Easy|
 2874|[Maximum Value of an Ordered Triplet II](./solutions/2874-maximum-value-of-an-ordered-triplet-ii.js)|Medium|
+2900|[Longest Unequal Adjacent Groups Subsequence I](./solutions/2900-longest-unequal-adjacent-groups-subsequence-i.js)|Easy|
 2918|[Minimum Equal Sum of Two Arrays After Replacing Zeros](./solutions/2918-minimum-equal-sum-of-two-arrays-after-replacing-zeros.js)|Medium|
 2948|[Make Lexicographically Smallest Array by Swapping Elements](./solutions/2948-make-lexicographically-smallest-array-by-swapping-elements.js)|Medium|
 2962|[Count Subarrays Where Max Element Appears at Least K Times](./solutions/2962-count-subarrays-where-max-element-appears-at-least-k-times.js)|Medium|
diff --git a/solutions/2900-longest-unequal-adjacent-groups-subsequence-i.js b/solutions/2900-longest-unequal-adjacent-groups-subsequence-i.js
new file mode 100644
index 00000000..b4df7c52
--- /dev/null
+++ b/solutions/2900-longest-unequal-adjacent-groups-subsequence-i.js
@@ -0,0 +1,40 @@
+/**
+ * 2900. Longest Unequal Adjacent Groups Subsequence I
+ * https://leetcode.com/problems/longest-unequal-adjacent-groups-subsequence-i/
+ * Difficulty: Easy
+ *
+ * You are given a string array words and a binary array groups both of length n, where words[i]
+ * is associated with groups[i].
+ *
+ * Your task is to select the longest alternating subsequence from words. A subsequence of words
+ * is alternating if for any two consecutive strings in the sequence, their corresponding elements
+ * in the binary array groups differ. Essentially, you are to choose strings such that adjacent
+ * elements have non-matching corresponding bits in the groups array.
+ *
+ * Formally, you need to find the longest subsequence of an array of indices [0, 1, ..., n - 1]
+ * denoted as [i0, i1, ..., ik-1], such that groups[ij] != groups[ij+1] for each 0 <= j < k - 1
+ * and then find the words corresponding to these indices.
+ *
+ * Return the selected subsequence. If there are multiple answers, return any of them.
+ *
+ * Note: The elements in words are distinct.
+ */
+
+/**
+ * @param {string[]} words
+ * @param {number[]} groups
+ * @return {string[]}
+ */
+var getLongestSubsequence = function(words, groups) {
+  const result = [words[0]];
+  let lastGroup = groups[0];
+
+  for (let i = 1; i < words.length; i++) {
+    if (groups[i] !== lastGroup) {
+      result.push(words[i]);
+      lastGroup = groups[i];
+    }
+  }
+
+  return result;
+};

From e4dfc44a21f320f6fd9ed4eac9969ffc5f9ff92d Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 19:06:27 -0500
Subject: [PATCH 078/571] Add solution #2164

---
 README.md                                     |  3 +-
 ...sort-even-and-odd-indices-independently.js | 50 +++++++++++++++++++
 2 files changed, 52 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2164-sort-even-and-odd-indices-independently.js

diff --git a/README.md b/README.md
index ef853b16..4dfacef7 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,786 LeetCode solutions in JavaScript
+# 1,787 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1656,6 +1656,7 @@
 2160|[Minimum Sum of Four Digit Number After Splitting Digits](./solutions/2160-minimum-sum-of-four-digit-number-after-splitting-digits.js)|Easy|
 2161|[Partition Array According to Given Pivot](./solutions/2161-partition-array-according-to-given-pivot.js)|Medium|
 2162|[Minimum Cost to Set Cooking Time](./solutions/2162-minimum-cost-to-set-cooking-time.js)|Medium|
+2164|[Sort Even and Odd Indices Independently](./solutions/2164-sort-even-and-odd-indices-independently.js)|Easy|
 2176|[Count Equal and Divisible Pairs in an Array](./solutions/2176-count-equal-and-divisible-pairs-in-an-array.js)|Easy|
 2179|[Count Good Triplets in an Array](./solutions/2179-count-good-triplets-in-an-array.js)|Hard|
 2185|[Counting Words With a Given Prefix](./solutions/2185-counting-words-with-a-given-prefix.js)|Easy|
diff --git a/solutions/2164-sort-even-and-odd-indices-independently.js b/solutions/2164-sort-even-and-odd-indices-independently.js
new file mode 100644
index 00000000..ed9322c6
--- /dev/null
+++ b/solutions/2164-sort-even-and-odd-indices-independently.js
@@ -0,0 +1,50 @@
+/**
+ * 2164. Sort Even and Odd Indices Independently
+ * https://leetcode.com/problems/sort-even-and-odd-indices-independently/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed integer array nums. Rearrange the values of nums according to the
+ * following rules:
+ * 1. Sort the values at odd indices of nums in non-increasing order.
+ *    - For example, if nums = [4,1,2,3] before this step, it becomes [4,3,2,1] after. The values
+ *      at odd indices 1 and 3 are sorted in non-increasing order.
+ * 2. Sort the values at even indices of nums in non-decreasing order.
+ *    - For example, if nums = [4,1,2,3] before this step, it becomes [2,1,4,3] after. The values
+ *      at even indices 0 and 2 are sorted in non-decreasing order.
+ *
+ * Return the array formed after rearranging the values of nums.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number[]}
+ */
+var sortEvenOdd = function(nums) {
+  const evens = [];
+  const odds = [];
+
+  for (let i = 0; i < nums.length; i++) {
+    if (i % 2 === 0) {
+      evens.push(nums[i]);
+    } else {
+      odds.push(nums[i]);
+    }
+  }
+
+  evens.sort((a, b) => a - b);
+  odds.sort((a, b) => b - a);
+
+  const result = [];
+  let evenIndex = 0;
+  let oddIndex = 0;
+
+  for (let i = 0; i < nums.length; i++) {
+    if (i % 2 === 0) {
+      result.push(evens[evenIndex++]);
+    } else {
+      result.push(odds[oddIndex++]);
+    }
+  }
+
+  return result;
+};

From 70a639e7d5e88132cce3cabcb9b2737538725903 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 19:07:34 -0500
Subject: [PATCH 079/571] Add solution #2165

---
 README.md                                     |  3 +-
 ...smallest-value-of-the-rearranged-number.js | 34 +++++++++++++++++++
 2 files changed, 36 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2165-smallest-value-of-the-rearranged-number.js

diff --git a/README.md b/README.md
index 4dfacef7..31a480ea 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,787 LeetCode solutions in JavaScript
+# 1,788 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1657,6 +1657,7 @@
 2161|[Partition Array According to Given Pivot](./solutions/2161-partition-array-according-to-given-pivot.js)|Medium|
 2162|[Minimum Cost to Set Cooking Time](./solutions/2162-minimum-cost-to-set-cooking-time.js)|Medium|
 2164|[Sort Even and Odd Indices Independently](./solutions/2164-sort-even-and-odd-indices-independently.js)|Easy|
+2165|[Smallest Value of the Rearranged Number](./solutions/2165-smallest-value-of-the-rearranged-number.js)|Medium|
 2176|[Count Equal and Divisible Pairs in an Array](./solutions/2176-count-equal-and-divisible-pairs-in-an-array.js)|Easy|
 2179|[Count Good Triplets in an Array](./solutions/2179-count-good-triplets-in-an-array.js)|Hard|
 2185|[Counting Words With a Given Prefix](./solutions/2185-counting-words-with-a-given-prefix.js)|Easy|
diff --git a/solutions/2165-smallest-value-of-the-rearranged-number.js b/solutions/2165-smallest-value-of-the-rearranged-number.js
new file mode 100644
index 00000000..c3226062
--- /dev/null
+++ b/solutions/2165-smallest-value-of-the-rearranged-number.js
@@ -0,0 +1,34 @@
+/**
+ * 2165. Smallest Value of the Rearranged Number
+ * https://leetcode.com/problems/smallest-value-of-the-rearranged-number/
+ * Difficulty: Medium
+ *
+ * You are given an integer num. Rearrange the digits of num such that its value is minimized
+ * and it does not contain any leading zeros.
+ *
+ * Return the rearranged number with minimal value.
+ *
+ * Note that the sign of the number does not change after rearranging the digits.
+ */
+
+/**
+ * @param {number} num
+ * @return {number}
+ */
+var smallestNumber = function(num) {
+  const isNegative = num < 0;
+  const digits = Math.abs(num).toString().split('').map(Number);
+
+  if (isNegative) {
+    digits.sort((a, b) => b - a);
+    return -parseInt(digits.join(''), 10);
+  }
+
+  digits.sort((a, b) => a - b);
+  const firstNonZero = digits.findIndex(d => d !== 0);
+
+  if (firstNonZero === -1) return 0;
+
+  [digits[0], digits[firstNonZero]] = [digits[firstNonZero], digits[0]];
+  return parseInt(digits.join(''), 10);
+};

From 700eabcdb667ea7b54ce6d69c702786e33a21317 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 19:09:15 -0500
Subject: [PATCH 080/571] Add solution #2166

---
 README.md                       |   3 +-
 solutions/2166-design-bitset.js | 109 ++++++++++++++++++++++++++++++++
 2 files changed, 111 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2166-design-bitset.js

diff --git a/README.md b/README.md
index 31a480ea..f5523ebf 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,788 LeetCode solutions in JavaScript
+# 1,789 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1658,6 +1658,7 @@
 2162|[Minimum Cost to Set Cooking Time](./solutions/2162-minimum-cost-to-set-cooking-time.js)|Medium|
 2164|[Sort Even and Odd Indices Independently](./solutions/2164-sort-even-and-odd-indices-independently.js)|Easy|
 2165|[Smallest Value of the Rearranged Number](./solutions/2165-smallest-value-of-the-rearranged-number.js)|Medium|
+2166|[Design Bitset](./solutions/2166-design-bitset.js)|Medium|
 2176|[Count Equal and Divisible Pairs in an Array](./solutions/2176-count-equal-and-divisible-pairs-in-an-array.js)|Easy|
 2179|[Count Good Triplets in an Array](./solutions/2179-count-good-triplets-in-an-array.js)|Hard|
 2185|[Counting Words With a Given Prefix](./solutions/2185-counting-words-with-a-given-prefix.js)|Easy|
diff --git a/solutions/2166-design-bitset.js b/solutions/2166-design-bitset.js
new file mode 100644
index 00000000..155fe39b
--- /dev/null
+++ b/solutions/2166-design-bitset.js
@@ -0,0 +1,109 @@
+/**
+ * 2166. Design Bitset
+ * https://leetcode.com/problems/design-bitset/
+ * Difficulty: Medium
+ *
+ * A Bitset is a data structure that compactly stores bits.
+ *
+ * Implement the Bitset class:
+ * - Bitset(int size) Initializes the Bitset with size bits, all of which are 0.
+ * - void fix(int idx) Updates the value of the bit at the index idx to 1. If the value was
+ *   already 1, no change occurs.
+ * - void unfix(int idx) Updates the value of the bit at the index idx to 0. If the value
+ *   was already 0, no change occurs.
+ * - void flip() Flips the values of each bit in the Bitset. In other words, all bits with
+ *   value 0 will now have value 1 and vice versa.
+ * - boolean all() Checks if the value of each bit in the Bitset is 1. Returns true if it
+ *   satisfies the condition, false otherwise.
+ * - boolean one() Checks if there is at least one bit in the Bitset with value 1. Returns
+ *   true if it satisfies the condition, false otherwise.
+ * - int count() Returns the total number of bits in the Bitset which have value 1.
+ * - String toString() Returns the current composition of the Bitset. Note that in the
+ *   resultant string, the character at the ith index should coincide with the value at
+ *   the ith bit of the Bitset.
+ */
+
+/**
+ * @param {number} size
+ */
+var Bitset = function(size) {
+  this.bits = new Uint8Array(size);
+  this.ones = 0;
+  this.flipped = false;
+};
+
+/**
+ * @param {number} idx
+ * @return {void}
+ */
+Bitset.prototype.fix = function(idx) {
+  if (this.flipped) {
+    if (this.bits[idx] === 1) {
+      this.bits[idx] = 0;
+      this.ones++;
+    }
+  } else {
+    if (this.bits[idx] === 0) {
+      this.bits[idx] = 1;
+      this.ones++;
+    }
+  }
+};
+
+/**
+ * @param {number} idx
+ * @return {void}
+ */
+Bitset.prototype.unfix = function(idx) {
+  if (this.flipped) {
+    if (this.bits[idx] === 0) {
+      this.bits[idx] = 1;
+      this.ones--;
+    }
+  } else {
+    if (this.bits[idx] === 1) {
+      this.bits[idx] = 0;
+      this.ones--;
+    }
+  }
+};
+
+/**
+ * @return {void}
+ */
+Bitset.prototype.flip = function() {
+  this.flipped = !this.flipped;
+  this.ones = this.bits.length - this.ones;
+};
+
+/**
+ * @return {boolean}
+ */
+Bitset.prototype.all = function() {
+  return this.ones === this.bits.length;
+};
+
+/**
+ * @return {boolean}
+ */
+Bitset.prototype.one = function() {
+  return this.ones > 0;
+};
+
+/**
+ * @return {number}
+ */
+Bitset.prototype.count = function() {
+  return this.ones;
+};
+
+/**
+ * @return {string}
+ */
+Bitset.prototype.toString = function() {
+  let result = '';
+  for (let i = 0; i < this.bits.length; i++) {
+    result += this.flipped ? 1 - this.bits[i] : this.bits[i];
+  }
+  return result;
+};

From 0f6c0fcdc3c122ce6f85145a517bd4e2739e5c0b Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 19:10:46 -0500
Subject: [PATCH 081/571] Add solution #2167

---
 README.md                                     |  3 +-
 ...emove-all-cars-containing-illegal-goods.js | 37 +++++++++++++++++++
 2 files changed, 39 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2167-minimum-time-to-remove-all-cars-containing-illegal-goods.js

diff --git a/README.md b/README.md
index f5523ebf..8b522d77 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,789 LeetCode solutions in JavaScript
+# 1,790 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1659,6 +1659,7 @@
 2164|[Sort Even and Odd Indices Independently](./solutions/2164-sort-even-and-odd-indices-independently.js)|Easy|
 2165|[Smallest Value of the Rearranged Number](./solutions/2165-smallest-value-of-the-rearranged-number.js)|Medium|
 2166|[Design Bitset](./solutions/2166-design-bitset.js)|Medium|
+2167|[Minimum Time to Remove All Cars Containing Illegal Goods](./solutions/2167-minimum-time-to-remove-all-cars-containing-illegal-goods.js)|Hard|
 2176|[Count Equal and Divisible Pairs in an Array](./solutions/2176-count-equal-and-divisible-pairs-in-an-array.js)|Easy|
 2179|[Count Good Triplets in an Array](./solutions/2179-count-good-triplets-in-an-array.js)|Hard|
 2185|[Counting Words With a Given Prefix](./solutions/2185-counting-words-with-a-given-prefix.js)|Easy|
diff --git a/solutions/2167-minimum-time-to-remove-all-cars-containing-illegal-goods.js b/solutions/2167-minimum-time-to-remove-all-cars-containing-illegal-goods.js
new file mode 100644
index 00000000..4877a0de
--- /dev/null
+++ b/solutions/2167-minimum-time-to-remove-all-cars-containing-illegal-goods.js
@@ -0,0 +1,37 @@
+/**
+ * 2167. Minimum Time to Remove All Cars Containing Illegal Goods
+ * https://leetcode.com/problems/minimum-time-to-remove-all-cars-containing-illegal-goods/
+ * Difficulty: Hard
+ *
+ * You are given a 0-indexed binary string s which represents a sequence of train cars. s[i] = '0'
+ * denotes that the ith car does not contain illegal goods and s[i] = '1' denotes that the ith car
+ * does contain illegal goods.
+ *
+ * As the train conductor, you would like to get rid of all the cars containing illegal goods.
+ * You can do any of the following three operations any number of times:
+ * 1. Remove a train car from the left end (i.e., remove s[0]) which takes 1 unit of time.
+ * 2. Remove a train car from the right end (i.e., remove s[s.length - 1]) which takes 1 unit
+ *    of time.
+ * 3. Remove a train car from anywhere in the sequence which takes 2 units of time.
+ *
+ * Return the minimum time to remove all the cars containing illegal goods.
+ *
+ * Note that an empty sequence of cars is considered to have no cars containing illegal goods.
+ */
+
+/**
+ * @param {string} s
+ * @return {number}
+ */
+var minimumTime = function(s) {
+  let leftCost = 0;
+  let result = s.length;
+
+  for (let i = 0; i < s.length; i++) {
+    leftCost = Math.min(leftCost + (s[i] === '1' ? 2 : 0), i + 1);
+    const rightCost = s.length - i - 1;
+    result = Math.min(result, leftCost + rightCost);
+  }
+
+  return result;
+};

From 034afefc63b99b475e164648d74afc69848148b3 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 19:20:27 -0500
Subject: [PATCH 082/571] Add solution #2169

---
 README.md                                     |  3 +-
 .../2169-count-operations-to-obtain-zero.js   | 34 +++++++++++++++++++
 2 files changed, 36 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2169-count-operations-to-obtain-zero.js

diff --git a/README.md b/README.md
index 8b522d77..aa6f989f 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,790 LeetCode solutions in JavaScript
+# 1,791 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1660,6 +1660,7 @@
 2165|[Smallest Value of the Rearranged Number](./solutions/2165-smallest-value-of-the-rearranged-number.js)|Medium|
 2166|[Design Bitset](./solutions/2166-design-bitset.js)|Medium|
 2167|[Minimum Time to Remove All Cars Containing Illegal Goods](./solutions/2167-minimum-time-to-remove-all-cars-containing-illegal-goods.js)|Hard|
+2169|[Count Operations to Obtain Zero](./solutions/2169-count-operations-to-obtain-zero.js)|Easy|
 2176|[Count Equal and Divisible Pairs in an Array](./solutions/2176-count-equal-and-divisible-pairs-in-an-array.js)|Easy|
 2179|[Count Good Triplets in an Array](./solutions/2179-count-good-triplets-in-an-array.js)|Hard|
 2185|[Counting Words With a Given Prefix](./solutions/2185-counting-words-with-a-given-prefix.js)|Easy|
diff --git a/solutions/2169-count-operations-to-obtain-zero.js b/solutions/2169-count-operations-to-obtain-zero.js
new file mode 100644
index 00000000..428bd42a
--- /dev/null
+++ b/solutions/2169-count-operations-to-obtain-zero.js
@@ -0,0 +1,34 @@
+/**
+ * 2169. Count Operations to Obtain Zero
+ * https://leetcode.com/problems/count-operations-to-obtain-zero/
+ * Difficulty: Easy
+ *
+ * You are given two non-negative integers num1 and num2.
+ *
+ * In one operation, if num1 >= num2, you must subtract num2 from num1, otherwise subtract num1
+ * from num2.
+ * - For example, if num1 = 5 and num2 = 4, subtract num2 from num1, thus obtaining num1 = 1 and
+ *   num2 = 4. However, if num1 = 4 and num2 = 5, after one operation, num1 = 4 and num2 = 1.
+ *
+ * Return the number of operations required to make either num1 = 0 or num2 = 0.
+ */
+
+/**
+ * @param {number} num1
+ * @param {number} num2
+ * @return {number}
+ */
+var countOperations = function(num1, num2) {
+  let operations = 0;
+
+  while (num1 !== 0 && num2 !== 0) {
+    if (num1 >= num2) {
+      num1 -= num2;
+    } else {
+      num2 -= num1;
+    }
+    operations++;
+  }
+
+  return operations;
+};

From 939b77385efb954d3384f7e27038f2a67a3eaea8 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 19:24:48 -0500
Subject: [PATCH 083/571] Add solution #2170

---
 README.md                                     |  3 +-
 ...perations-to-make-the-array-alternating.js | 49 +++++++++++++++++++
 2 files changed, 51 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2170-minimum-operations-to-make-the-array-alternating.js

diff --git a/README.md b/README.md
index aa6f989f..822b4e21 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,791 LeetCode solutions in JavaScript
+# 1,792 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1661,6 +1661,7 @@
 2166|[Design Bitset](./solutions/2166-design-bitset.js)|Medium|
 2167|[Minimum Time to Remove All Cars Containing Illegal Goods](./solutions/2167-minimum-time-to-remove-all-cars-containing-illegal-goods.js)|Hard|
 2169|[Count Operations to Obtain Zero](./solutions/2169-count-operations-to-obtain-zero.js)|Easy|
+2170|[Minimum Operations to Make the Array Alternating](./solutions/2170-minimum-operations-to-make-the-array-alternating.js)|Medium|
 2176|[Count Equal and Divisible Pairs in an Array](./solutions/2176-count-equal-and-divisible-pairs-in-an-array.js)|Easy|
 2179|[Count Good Triplets in an Array](./solutions/2179-count-good-triplets-in-an-array.js)|Hard|
 2185|[Counting Words With a Given Prefix](./solutions/2185-counting-words-with-a-given-prefix.js)|Easy|
diff --git a/solutions/2170-minimum-operations-to-make-the-array-alternating.js b/solutions/2170-minimum-operations-to-make-the-array-alternating.js
new file mode 100644
index 00000000..770b6d62
--- /dev/null
+++ b/solutions/2170-minimum-operations-to-make-the-array-alternating.js
@@ -0,0 +1,49 @@
+/**
+ * 2170. Minimum Operations to Make the Array Alternating
+ * https://leetcode.com/problems/minimum-operations-to-make-the-array-alternating/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed array nums consisting of n positive integers.
+ *
+ * The array nums is called alternating if:
+ * - nums[i - 2] == nums[i], where 2 <= i <= n - 1.
+ * - nums[i - 1] != nums[i], where 1 <= i <= n - 1.
+ *
+ * In one operation, you can choose an index i and change nums[i] into any positive integer.
+ *
+ * Return the minimum number of operations required to make the array alternating.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var minimumOperations = function(nums) {
+  const evenFreq = new Map();
+  const oddFreq = new Map();
+
+  if (nums.length <= 1) return 0;
+  for (let i = 0; i < nums.length; i++) {
+    if (i % 2 === 0) {
+      evenFreq.set(nums[i], (evenFreq.get(nums[i]) || 0) + 1);
+    } else {
+      oddFreq.set(nums[i], (oddFreq.get(nums[i]) || 0) + 1);
+    }
+  }
+
+  const evenTop = [...evenFreq.entries()].sort((a, b) => b[1] - a[1]).slice(0, 2);
+  const oddTop = [...oddFreq.entries()].sort((a, b) => b[1] - a[1]).slice(0, 2);
+  const evenTotal = Math.ceil(nums.length / 2);
+  const oddTotal = Math.floor(nums.length / 2);
+  let minOps = nums.length;
+
+  for (const [evenNum, evenCount] of evenTop.length ? evenTop : [[0, 0]]) {
+    for (const [oddNum, oddCount] of oddTop.length ? oddTop : [[0, 0]]) {
+      if (evenNum !== oddNum || evenNum === 0) {
+        minOps = Math.min(minOps, (evenTotal - evenCount) + (oddTotal - oddCount));
+      }
+    }
+  }
+
+  return minOps === nums.length ? Math.min(evenTotal, oddTotal) : minOps;
+};

From bbe10f7b2a71880e8783fb60cc5a00a23d010992 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 19:25:56 -0500
Subject: [PATCH 084/571] Add solution #2171

---
 README.md                                     |  3 +-
 ...-removing-minimum-number-of-magic-beans.js | 33 +++++++++++++++++++
 2 files changed, 35 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2171-removing-minimum-number-of-magic-beans.js

diff --git a/README.md b/README.md
index 822b4e21..fe0b988c 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,792 LeetCode solutions in JavaScript
+# 1,793 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1662,6 +1662,7 @@
 2167|[Minimum Time to Remove All Cars Containing Illegal Goods](./solutions/2167-minimum-time-to-remove-all-cars-containing-illegal-goods.js)|Hard|
 2169|[Count Operations to Obtain Zero](./solutions/2169-count-operations-to-obtain-zero.js)|Easy|
 2170|[Minimum Operations to Make the Array Alternating](./solutions/2170-minimum-operations-to-make-the-array-alternating.js)|Medium|
+2171|[Removing Minimum Number of Magic Beans](./solutions/2171-removing-minimum-number-of-magic-beans.js)|Medium|
 2176|[Count Equal and Divisible Pairs in an Array](./solutions/2176-count-equal-and-divisible-pairs-in-an-array.js)|Easy|
 2179|[Count Good Triplets in an Array](./solutions/2179-count-good-triplets-in-an-array.js)|Hard|
 2185|[Counting Words With a Given Prefix](./solutions/2185-counting-words-with-a-given-prefix.js)|Easy|
diff --git a/solutions/2171-removing-minimum-number-of-magic-beans.js b/solutions/2171-removing-minimum-number-of-magic-beans.js
new file mode 100644
index 00000000..23fd2236
--- /dev/null
+++ b/solutions/2171-removing-minimum-number-of-magic-beans.js
@@ -0,0 +1,33 @@
+/**
+ * 2171. Removing Minimum Number of Magic Beans
+ * https://leetcode.com/problems/removing-minimum-number-of-magic-beans/
+ * Difficulty: Medium
+ *
+ * You are given an array of positive integers beans, where each integer represents the number
+ * of magic beans found in a particular magic bag.
+ *
+ * Remove any number of beans (possibly none) from each bag such that the number of beans in
+ * each remaining non-empty bag (still containing at least one bean) is equal. Once a bean
+ * has been removed from a bag, you are not allowed to return it to any of the bags.
+ *
+ * Return the minimum number of magic beans that you have to remove.
+ */
+
+/**
+ * @param {number[]} beans
+ * @return {number}
+ */
+var minimumRemoval = function(beans) {
+  const sortedBeans = beans.sort((a, b) => a - b);
+  const totalBeans = sortedBeans.reduce((sum, bean) => sum + bean, 0);
+  let result = totalBeans;
+  let remaining = totalBeans;
+
+  for (let i = 0; i < sortedBeans.length; i++) {
+    remaining -= sortedBeans[i];
+    const equalBags = sortedBeans.length - i;
+    result = Math.min(result, totalBeans - sortedBeans[i] * equalBags);
+  }
+
+  return result;
+};

From 0b09cc8e2097b96bfbd7c5421a0a564cc694c235 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 19:27:25 -0500
Subject: [PATCH 085/571] Add solution #2172

---
 README.md                                  |  3 +-
 solutions/2172-maximum-and-sum-of-array.js | 46 ++++++++++++++++++++++
 2 files changed, 48 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2172-maximum-and-sum-of-array.js

diff --git a/README.md b/README.md
index fe0b988c..821db657 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,793 LeetCode solutions in JavaScript
+# 1,794 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1663,6 +1663,7 @@
 2169|[Count Operations to Obtain Zero](./solutions/2169-count-operations-to-obtain-zero.js)|Easy|
 2170|[Minimum Operations to Make the Array Alternating](./solutions/2170-minimum-operations-to-make-the-array-alternating.js)|Medium|
 2171|[Removing Minimum Number of Magic Beans](./solutions/2171-removing-minimum-number-of-magic-beans.js)|Medium|
+2172|[Maximum AND Sum of Array](./solutions/2172-maximum-and-sum-of-array.js)|Hard|
 2176|[Count Equal and Divisible Pairs in an Array](./solutions/2176-count-equal-and-divisible-pairs-in-an-array.js)|Easy|
 2179|[Count Good Triplets in an Array](./solutions/2179-count-good-triplets-in-an-array.js)|Hard|
 2185|[Counting Words With a Given Prefix](./solutions/2185-counting-words-with-a-given-prefix.js)|Easy|
diff --git a/solutions/2172-maximum-and-sum-of-array.js b/solutions/2172-maximum-and-sum-of-array.js
new file mode 100644
index 00000000..6c9020d6
--- /dev/null
+++ b/solutions/2172-maximum-and-sum-of-array.js
@@ -0,0 +1,46 @@
+/**
+ * 2172. Maximum AND Sum of Array
+ * https://leetcode.com/problems/maximum-and-sum-of-array/
+ * Difficulty: Hard
+ *
+ * You are given an integer array nums of length n and an integer numSlots such that
+ * 2 * numSlots >= n. There are numSlots slots numbered from 1 to numSlots.
+ *
+ * You have to place all n integers into the slots such that each slot contains at most
+ * two numbers. The AND sum of a given placement is the sum of the bitwise AND of every
+ * number with its respective slot number.
+ * - For example, the AND sum of placing the numbers [1, 3] into slot 1 and [4, 6] into
+ *   slot 2 is equal to (1 AND 1) + (3 AND 1) + (4 AND 2) + (6 AND 2) = 1 + 1 + 0 + 2 = 4.
+ *
+ * Return the maximum possible AND sum of nums given numSlots slots.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} numSlots
+ * @return {number}
+ */
+var maximumANDSum = function(nums, numSlots) {
+  const map = new Map();
+
+  return dp(0, new Array(numSlots).fill(0));
+
+  function dp(index, slots) {
+    if (index >= nums.length) return 0;
+
+    const key = `${index},${slots.join(',')}`;
+    if (map.has(key)) return map.get(key);
+
+    let result = 0;
+    for (let i = 0; i < numSlots; i++) {
+      if (slots[i] < 2) {
+        slots[i]++;
+        result = Math.max(result, (nums[index] & (i + 1)) + dp(index + 1, slots));
+        slots[i]--;
+      }
+    }
+
+    map.set(key, result);
+    return result;
+  }
+};

From 82261b0781a2e5eaa32fdeb7882da47d9a39bfc2 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 19:28:25 -0500
Subject: [PATCH 086/571] Add solution #2177

---
 README.md                                     |  3 ++-
 ...ive-integers-that-sum-to-a-given-number.js | 19 +++++++++++++++++++
 2 files changed, 21 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2177-find-three-consecutive-integers-that-sum-to-a-given-number.js

diff --git a/README.md b/README.md
index 821db657..9ce8f877 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,794 LeetCode solutions in JavaScript
+# 1,795 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1665,6 +1665,7 @@
 2171|[Removing Minimum Number of Magic Beans](./solutions/2171-removing-minimum-number-of-magic-beans.js)|Medium|
 2172|[Maximum AND Sum of Array](./solutions/2172-maximum-and-sum-of-array.js)|Hard|
 2176|[Count Equal and Divisible Pairs in an Array](./solutions/2176-count-equal-and-divisible-pairs-in-an-array.js)|Easy|
+2177|[Find Three Consecutive Integers That Sum to a Given Number](./solutions/2177-find-three-consecutive-integers-that-sum-to-a-given-number.js)|Medium|
 2179|[Count Good Triplets in an Array](./solutions/2179-count-good-triplets-in-an-array.js)|Hard|
 2185|[Counting Words With a Given Prefix](./solutions/2185-counting-words-with-a-given-prefix.js)|Easy|
 2206|[Divide Array Into Equal Pairs](./solutions/2206-divide-array-into-equal-pairs.js)|Easy|
diff --git a/solutions/2177-find-three-consecutive-integers-that-sum-to-a-given-number.js b/solutions/2177-find-three-consecutive-integers-that-sum-to-a-given-number.js
new file mode 100644
index 00000000..f77b1221
--- /dev/null
+++ b/solutions/2177-find-three-consecutive-integers-that-sum-to-a-given-number.js
@@ -0,0 +1,19 @@
+/**
+ * 2177. Find Three Consecutive Integers That Sum to a Given Number
+ * https://leetcode.com/problems/find-three-consecutive-integers-that-sum-to-a-given-number/
+ * Difficulty: Medium
+ *
+ * Given an integer num, return three consecutive integers (as a sorted array) that sum to num.
+ * If num cannot be expressed as the sum of three consecutive integers, return an empty array.
+ */
+
+/**
+ * @param {number} num
+ * @return {number[]}
+ */
+var sumOfThree = function(num) {
+  if (num % 3 !== 0) return [];
+
+  const middle = num / 3;
+  return [middle - 1, middle, middle + 1];
+};

From c4ece59b84dd86e47655d0cd53b7bc0e44cf74bf Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 19:30:28 -0500
Subject: [PATCH 087/571] Add solution #2178

---
 README.md                                     |  3 +-
 ...maximum-split-of-positive-even-integers.js | 40 +++++++++++++++++++
 2 files changed, 42 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2178-maximum-split-of-positive-even-integers.js

diff --git a/README.md b/README.md
index 9ce8f877..f7a25ce5 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,795 LeetCode solutions in JavaScript
+# 1,796 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1666,6 +1666,7 @@
 2172|[Maximum AND Sum of Array](./solutions/2172-maximum-and-sum-of-array.js)|Hard|
 2176|[Count Equal and Divisible Pairs in an Array](./solutions/2176-count-equal-and-divisible-pairs-in-an-array.js)|Easy|
 2177|[Find Three Consecutive Integers That Sum to a Given Number](./solutions/2177-find-three-consecutive-integers-that-sum-to-a-given-number.js)|Medium|
+2178|[Maximum Split of Positive Even Integers](./solutions/2178-maximum-split-of-positive-even-integers.js)|Medium|
 2179|[Count Good Triplets in an Array](./solutions/2179-count-good-triplets-in-an-array.js)|Hard|
 2185|[Counting Words With a Given Prefix](./solutions/2185-counting-words-with-a-given-prefix.js)|Easy|
 2206|[Divide Array Into Equal Pairs](./solutions/2206-divide-array-into-equal-pairs.js)|Easy|
diff --git a/solutions/2178-maximum-split-of-positive-even-integers.js b/solutions/2178-maximum-split-of-positive-even-integers.js
new file mode 100644
index 00000000..602b2ab7
--- /dev/null
+++ b/solutions/2178-maximum-split-of-positive-even-integers.js
@@ -0,0 +1,40 @@
+/**
+ * 2178. Maximum Split of Positive Even Integers
+ * https://leetcode.com/problems/maximum-split-of-positive-even-integers/
+ * Difficulty: Medium
+ *
+ * You are given an integer finalSum. Split it into a sum of a maximum number of unique
+ * positive even integers.
+ * - For example, given finalSum = 12, the following splits are valid (unique positive even
+ *   integers summing up to finalSum): (12), (2 + 10), (2 + 4 + 6), and (4 + 8). Among them,
+ *   (2 + 4 + 6) contains the maximum number of integers. Note that finalSum cannot be split
+ *   into (2 + 2 + 4 + 4) as all the numbers should be unique.
+ *
+ * Return a list of integers that represent a valid split containing a maximum number of
+ * integers. If no valid split exists for finalSum, return an empty list. You may return
+ * the integers in any order.
+ */
+
+/**
+ * @param {number} finalSum
+ * @return {number[]}
+ */
+var maximumEvenSplit = function(finalSum) {
+  if (finalSum % 2 !== 0) return [];
+
+  const result = [];
+  let current = 2;
+  let remaining = finalSum;
+
+  while (remaining >= current) {
+    if (remaining - current <= current) {
+      result.push(remaining);
+      return result;
+    }
+    result.push(current);
+    remaining -= current;
+    current += 2;
+  }
+
+  return result;
+};

From 56ee4f0e5cb571732447316ff5467df0d85b956c Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 19:31:37 -0500
Subject: [PATCH 088/571] Add solution #2180

---
 README.md                                     |  3 +-
 ...2180-count-integers-with-even-digit-sum.js | 32 +++++++++++++++++++
 2 files changed, 34 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2180-count-integers-with-even-digit-sum.js

diff --git a/README.md b/README.md
index f7a25ce5..b8019b07 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,796 LeetCode solutions in JavaScript
+# 1,797 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1668,6 +1668,7 @@
 2177|[Find Three Consecutive Integers That Sum to a Given Number](./solutions/2177-find-three-consecutive-integers-that-sum-to-a-given-number.js)|Medium|
 2178|[Maximum Split of Positive Even Integers](./solutions/2178-maximum-split-of-positive-even-integers.js)|Medium|
 2179|[Count Good Triplets in an Array](./solutions/2179-count-good-triplets-in-an-array.js)|Hard|
+2180|[Count Integers With Even Digit Sum](./solutions/2180-count-integers-with-even-digit-sum.js)|Easy|
 2185|[Counting Words With a Given Prefix](./solutions/2185-counting-words-with-a-given-prefix.js)|Easy|
 2206|[Divide Array Into Equal Pairs](./solutions/2206-divide-array-into-equal-pairs.js)|Easy|
 2215|[Find the Difference of Two Arrays](./solutions/2215-find-the-difference-of-two-arrays.js)|Easy|
diff --git a/solutions/2180-count-integers-with-even-digit-sum.js b/solutions/2180-count-integers-with-even-digit-sum.js
new file mode 100644
index 00000000..c1a077e6
--- /dev/null
+++ b/solutions/2180-count-integers-with-even-digit-sum.js
@@ -0,0 +1,32 @@
+/**
+ * 2180. Count Integers With Even Digit Sum
+ * https://leetcode.com/problems/count-integers-with-even-digit-sum/
+ * Difficulty: Easy
+ *
+ * Given a positive integer num, return the number of positive integers less than or equal to num
+ * whose digit sums are even.
+ *
+ * The digit sum of a positive integer is the sum of all its digits.
+ */
+
+/**
+ * @param {number} num
+ * @return {number}
+ */
+var countEven = function(num) {
+  let result = 0;
+
+  for (let i = 1; i <= num; i++) {
+    let sum = 0;
+    let current = i;
+    while (current > 0) {
+      sum += current % 10;
+      current = Math.floor(current / 10);
+    }
+    if (sum % 2 === 0) {
+      result++;
+    }
+  }
+
+  return result;
+};

From f30729031b120d769ef1700e6dc9fcfbf7439fec Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 19:32:44 -0500
Subject: [PATCH 089/571] Add solution #2181

---
 README.md                                     |  3 +-
 .../2181-merge-nodes-in-between-zeros.js      | 46 +++++++++++++++++++
 2 files changed, 48 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2181-merge-nodes-in-between-zeros.js

diff --git a/README.md b/README.md
index b8019b07..a6e929d4 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,797 LeetCode solutions in JavaScript
+# 1,798 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1669,6 +1669,7 @@
 2178|[Maximum Split of Positive Even Integers](./solutions/2178-maximum-split-of-positive-even-integers.js)|Medium|
 2179|[Count Good Triplets in an Array](./solutions/2179-count-good-triplets-in-an-array.js)|Hard|
 2180|[Count Integers With Even Digit Sum](./solutions/2180-count-integers-with-even-digit-sum.js)|Easy|
+2181|[Merge Nodes in Between Zeros](./solutions/2181-merge-nodes-in-between-zeros.js)|Medium|
 2185|[Counting Words With a Given Prefix](./solutions/2185-counting-words-with-a-given-prefix.js)|Easy|
 2206|[Divide Array Into Equal Pairs](./solutions/2206-divide-array-into-equal-pairs.js)|Easy|
 2215|[Find the Difference of Two Arrays](./solutions/2215-find-the-difference-of-two-arrays.js)|Easy|
diff --git a/solutions/2181-merge-nodes-in-between-zeros.js b/solutions/2181-merge-nodes-in-between-zeros.js
new file mode 100644
index 00000000..f5993c27
--- /dev/null
+++ b/solutions/2181-merge-nodes-in-between-zeros.js
@@ -0,0 +1,46 @@
+/**
+ * 2181. Merge Nodes in Between Zeros
+ * https://leetcode.com/problems/merge-nodes-in-between-zeros/
+ * Difficulty: Medium
+ *
+ * You are given the head of a linked list, which contains a series of integers separated
+ * by 0's. The beginning and end of the linked list will have Node.val == 0.
+ *
+ * For every two consecutive 0's, merge all the nodes lying in between them into a single
+ * node whose value is the sum of all the merged nodes. The modified list should not contain
+ * any 0's.
+ *
+ * Return the head of the modified linked list.
+ */
+
+/**
+ * Definition for singly-linked list.
+ * function ListNode(val, next) {
+ *     this.val = (val===undefined ? 0 : val)
+ *     this.next = (next===undefined ? null : next)
+ * }
+ */
+/**
+ * @param {ListNode} head
+ * @return {ListNode}
+ */
+var mergeNodes = function(head) {
+  const result = new ListNode(0);
+  let current = result;
+  let sum = 0;
+
+  head = head.next;
+
+  while (head) {
+    if (head.val === 0) {
+      current.next = new ListNode(sum);
+      current = current.next;
+      sum = 0;
+    } else {
+      sum += head.val;
+    }
+    head = head.next;
+  }
+
+  return result.next;
+};

From bafa902146d4e2564d76fb6ebdbbfaa275acac39 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 19:33:57 -0500
Subject: [PATCH 090/571] Add solution #2183

---
 README.md                                     |  3 +-
 .../2183-count-array-pairs-divisible-by-k.js  | 39 +++++++++++++++++++
 2 files changed, 41 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2183-count-array-pairs-divisible-by-k.js

diff --git a/README.md b/README.md
index a6e929d4..a3e0141d 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,798 LeetCode solutions in JavaScript
+# 1,799 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1670,6 +1670,7 @@
 2179|[Count Good Triplets in an Array](./solutions/2179-count-good-triplets-in-an-array.js)|Hard|
 2180|[Count Integers With Even Digit Sum](./solutions/2180-count-integers-with-even-digit-sum.js)|Easy|
 2181|[Merge Nodes in Between Zeros](./solutions/2181-merge-nodes-in-between-zeros.js)|Medium|
+2183|[Count Array Pairs Divisible by K](./solutions/2183-count-array-pairs-divisible-by-k.js)|Hard|
 2185|[Counting Words With a Given Prefix](./solutions/2185-counting-words-with-a-given-prefix.js)|Easy|
 2206|[Divide Array Into Equal Pairs](./solutions/2206-divide-array-into-equal-pairs.js)|Easy|
 2215|[Find the Difference of Two Arrays](./solutions/2215-find-the-difference-of-two-arrays.js)|Easy|
diff --git a/solutions/2183-count-array-pairs-divisible-by-k.js b/solutions/2183-count-array-pairs-divisible-by-k.js
new file mode 100644
index 00000000..96f923c4
--- /dev/null
+++ b/solutions/2183-count-array-pairs-divisible-by-k.js
@@ -0,0 +1,39 @@
+/**
+ * 2183. Count Array Pairs Divisible by K
+ * https://leetcode.com/problems/count-array-pairs-divisible-by-k/
+ * Difficulty: Hard
+ *
+ * Given a 0-indexed integer array nums of length n and an integer k, return the number
+ * of pairs (i, j) such that:
+ * - 0 <= i < j <= n - 1 and
+ * - nums[i] * nums[j] is divisible by k.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} k
+ * @return {number}
+ */
+var countPairs = function(nums, k) {
+  const map = new Map();
+  let pairs = 0;
+
+  for (const num of nums) {
+    const gcd1 = gcd(num, k);
+    for (const [gcd2, count] of map) {
+      if ((gcd1 * gcd2) % k === 0) {
+        pairs += count;
+      }
+    }
+    map.set(gcd1, (map.get(gcd1) || 0) + 1);
+  }
+
+  return pairs;
+};
+
+function gcd(a, b) {
+  while (b) {
+    [a, b] = [b, a % b];
+  }
+  return a;
+}

From 17517e48ff39964c566b44b3ff155521f57028f7 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 19:35:05 -0500
Subject: [PATCH 091/571] Add solution #2186

---
 README.md                                     |  3 +-
 ...of-steps-to-make-two-strings-anagram-ii.js | 36 +++++++++++++++++++
 2 files changed, 38 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2186-minimum-number-of-steps-to-make-two-strings-anagram-ii.js

diff --git a/README.md b/README.md
index a3e0141d..a85496e7 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,799 LeetCode solutions in JavaScript
+# 1,800 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1672,6 +1672,7 @@
 2181|[Merge Nodes in Between Zeros](./solutions/2181-merge-nodes-in-between-zeros.js)|Medium|
 2183|[Count Array Pairs Divisible by K](./solutions/2183-count-array-pairs-divisible-by-k.js)|Hard|
 2185|[Counting Words With a Given Prefix](./solutions/2185-counting-words-with-a-given-prefix.js)|Easy|
+2186|[Minimum Number of Steps to Make Two Strings Anagram II](./solutions/2186-minimum-number-of-steps-to-make-two-strings-anagram-ii.js)|Medium|
 2206|[Divide Array Into Equal Pairs](./solutions/2206-divide-array-into-equal-pairs.js)|Easy|
 2215|[Find the Difference of Two Arrays](./solutions/2215-find-the-difference-of-two-arrays.js)|Easy|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
diff --git a/solutions/2186-minimum-number-of-steps-to-make-two-strings-anagram-ii.js b/solutions/2186-minimum-number-of-steps-to-make-two-strings-anagram-ii.js
new file mode 100644
index 00000000..2501cbd5
--- /dev/null
+++ b/solutions/2186-minimum-number-of-steps-to-make-two-strings-anagram-ii.js
@@ -0,0 +1,36 @@
+/**
+ * 2186. Minimum Number of Steps to Make Two Strings Anagram II
+ * https://leetcode.com/problems/minimum-number-of-steps-to-make-two-strings-anagram-ii/
+ * Difficulty: Medium
+ *
+ * You are given two strings s and t. In one step, you can append any character to either s or t.
+ *
+ * Return the minimum number of steps to make s and t anagrams of each other.
+ *
+ * An anagram of a string is a string that contains the same characters with a different (or the
+ * same) ordering.
+ */
+
+/**
+ * @param {string} s
+ * @param {string} t
+ * @return {number}
+ */
+var minSteps = function(s, t) {
+  const charCount = new Array(26).fill(0);
+
+  for (const char of s) {
+    charCount[char.charCodeAt(0) - 97]++;
+  }
+
+  for (const char of t) {
+    charCount[char.charCodeAt(0) - 97]--;
+  }
+
+  let result = 0;
+  for (const count of charCount) {
+    result += Math.abs(count);
+  }
+
+  return result;
+};

From 37c1725537c3bec63a2a578e967ded6b18815dbd Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 23:21:39 -0500
Subject: [PATCH 092/571] Add solution #2187

---
 README.md                                     |  3 +-
 .../2187-minimum-time-to-complete-trips.js    | 39 +++++++++++++++++++
 2 files changed, 41 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2187-minimum-time-to-complete-trips.js

diff --git a/README.md b/README.md
index a85496e7..350b9d19 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,800 LeetCode solutions in JavaScript
+# 1,801 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1673,6 +1673,7 @@
 2183|[Count Array Pairs Divisible by K](./solutions/2183-count-array-pairs-divisible-by-k.js)|Hard|
 2185|[Counting Words With a Given Prefix](./solutions/2185-counting-words-with-a-given-prefix.js)|Easy|
 2186|[Minimum Number of Steps to Make Two Strings Anagram II](./solutions/2186-minimum-number-of-steps-to-make-two-strings-anagram-ii.js)|Medium|
+2187|[Minimum Time to Complete Trips](./solutions/2187-minimum-time-to-complete-trips.js)|Medium|
 2206|[Divide Array Into Equal Pairs](./solutions/2206-divide-array-into-equal-pairs.js)|Easy|
 2215|[Find the Difference of Two Arrays](./solutions/2215-find-the-difference-of-two-arrays.js)|Easy|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
diff --git a/solutions/2187-minimum-time-to-complete-trips.js b/solutions/2187-minimum-time-to-complete-trips.js
new file mode 100644
index 00000000..305712f8
--- /dev/null
+++ b/solutions/2187-minimum-time-to-complete-trips.js
@@ -0,0 +1,39 @@
+/**
+ * 2187. Minimum Time to Complete Trips
+ * https://leetcode.com/problems/minimum-time-to-complete-trips/
+ * Difficulty: Medium
+ *
+ * You are given an array time where time[i] denotes the time taken by the ith bus to complete
+ * one trip.
+ *
+ * Each bus can make multiple trips successively; that is, the next trip can start immediately
+ * after completing the current trip. Also, each bus operates independently; that is, the trips
+ * of one bus do not influence the trips of any other bus.
+ *
+ * You are also given an integer totalTrips, which denotes the number of trips all buses should
+ * make in total. Return the minimum time required for all buses to complete at least totalTrips
+ * trips.
+ */
+
+/**
+ * @param {number[]} time
+ * @param {number} totalTrips
+ * @return {number}
+ */
+var minimumTime = function(time, totalTrips) {
+  let left = 1;
+  let right = Math.min(...time) * totalTrips;
+
+  while (left < right) {
+    const mid = Math.floor((left + right) / 2);
+    const trips = time.reduce((sum, t) => sum + Math.floor(mid / t), 0);
+
+    if (trips >= totalTrips) {
+      right = mid;
+    } else {
+      left = mid + 1;
+    }
+  }
+
+  return left;
+};

From 5c3e0d28cd672dacd4bacdd83209e9cf34b901d1 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 23:23:20 -0500
Subject: [PATCH 093/571] Add solution #2188

---
 README.md                                     |  3 +-
 .../2188-minimum-time-to-finish-the-race.js   | 56 +++++++++++++++++++
 2 files changed, 58 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2188-minimum-time-to-finish-the-race.js

diff --git a/README.md b/README.md
index 350b9d19..bb8210f1 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,801 LeetCode solutions in JavaScript
+# 1,802 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1674,6 +1674,7 @@
 2185|[Counting Words With a Given Prefix](./solutions/2185-counting-words-with-a-given-prefix.js)|Easy|
 2186|[Minimum Number of Steps to Make Two Strings Anagram II](./solutions/2186-minimum-number-of-steps-to-make-two-strings-anagram-ii.js)|Medium|
 2187|[Minimum Time to Complete Trips](./solutions/2187-minimum-time-to-complete-trips.js)|Medium|
+2188|[Minimum Time to Finish the Race](./solutions/2188-minimum-time-to-finish-the-race.js)|Hard|
 2206|[Divide Array Into Equal Pairs](./solutions/2206-divide-array-into-equal-pairs.js)|Easy|
 2215|[Find the Difference of Two Arrays](./solutions/2215-find-the-difference-of-two-arrays.js)|Easy|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
diff --git a/solutions/2188-minimum-time-to-finish-the-race.js b/solutions/2188-minimum-time-to-finish-the-race.js
new file mode 100644
index 00000000..fbce3d25
--- /dev/null
+++ b/solutions/2188-minimum-time-to-finish-the-race.js
@@ -0,0 +1,56 @@
+/**
+ * 2188. Minimum Time to Finish the Race
+ * https://leetcode.com/problems/minimum-time-to-finish-the-race/
+ * Difficulty: Hard
+ *
+ * You are given a 0-indexed 2D integer array tires where tires[i] = [fi, ri] indicates that
+ * the ith tire can finish its xth successive lap in fi * ri(x-1) seconds.
+ * - For example, if fi = 3 and ri = 2, then the tire would finish its 1st lap in 3 seconds,
+ *   its 2nd lap in 3 * 2 = 6 seconds, its 3rd lap in 3 * 22 = 12 seconds, etc.
+ *
+ * You are also given an integer changeTime and an integer numLaps.
+ *
+ * The race consists of numLaps laps and you may start the race with any tire. You have an
+ * unlimited supply of each tire and after every lap, you may change to any given tire (including
+ * the current tire type) if you wait changeTime seconds.
+ *
+ * Return the minimum time to finish the race.
+ */
+
+/**
+ * @param {number[][]} tires
+ * @param {number} changeTime
+ * @param {number} numLaps
+ * @return {number}
+ */
+var minimumFinishTime = function(tires, changeTime, numLaps) {
+  const minTimes = new Array(18).fill(Infinity);
+  const bestTime = new Array(numLaps + 1).fill(Infinity);
+
+  for (const [baseTime, multiplier] of tires) {
+    let currentTime = baseTime;
+    let totalTime = baseTime;
+
+    for (let lap = 1; lap <= Math.min(numLaps, 17); lap++) {
+      if (currentTime > changeTime + baseTime) break;
+      minTimes[lap] = Math.min(minTimes[lap], totalTime);
+      currentTime *= multiplier;
+      totalTime += currentTime;
+    }
+  }
+
+  bestTime[0] = 0;
+
+  for (let lap = 1; lap <= numLaps; lap++) {
+    for (let prev = 1; prev <= Math.min(lap, 17); prev++) {
+      if (minTimes[prev] !== Infinity) {
+        bestTime[lap] = Math.min(
+          bestTime[lap],
+          bestTime[lap - prev] + minTimes[prev] + (lap === prev ? 0 : changeTime)
+        );
+      }
+    }
+  }
+
+  return bestTime[numLaps];
+};

From 3772d65f3efc1c9be2f91a9a16cfeaf1279310e3 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 23:25:29 -0500
Subject: [PATCH 094/571] Add solution #2190

---
 README.md                                     |  3 +-
 ...equent-number-following-key-in-an-array.js | 43 +++++++++++++++++++
 2 files changed, 45 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2190-most-frequent-number-following-key-in-an-array.js

diff --git a/README.md b/README.md
index bb8210f1..dc946658 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,802 LeetCode solutions in JavaScript
+# 1,803 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1675,6 +1675,7 @@
 2186|[Minimum Number of Steps to Make Two Strings Anagram II](./solutions/2186-minimum-number-of-steps-to-make-two-strings-anagram-ii.js)|Medium|
 2187|[Minimum Time to Complete Trips](./solutions/2187-minimum-time-to-complete-trips.js)|Medium|
 2188|[Minimum Time to Finish the Race](./solutions/2188-minimum-time-to-finish-the-race.js)|Hard|
+2190|[Most Frequent Number Following Key In an Array](./solutions/2190-most-frequent-number-following-key-in-an-array.js)|Easy|
 2206|[Divide Array Into Equal Pairs](./solutions/2206-divide-array-into-equal-pairs.js)|Easy|
 2215|[Find the Difference of Two Arrays](./solutions/2215-find-the-difference-of-two-arrays.js)|Easy|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
diff --git a/solutions/2190-most-frequent-number-following-key-in-an-array.js b/solutions/2190-most-frequent-number-following-key-in-an-array.js
new file mode 100644
index 00000000..b5485503
--- /dev/null
+++ b/solutions/2190-most-frequent-number-following-key-in-an-array.js
@@ -0,0 +1,43 @@
+/**
+ * 2190. Most Frequent Number Following Key In an Array
+ * https://leetcode.com/problems/most-frequent-number-following-key-in-an-array/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed integer array nums. You are also given an integer key, which is
+ * present in nums.
+ *
+ * For every unique integer target in nums, count the number of times target immediately follows
+ * an occurrence of key in nums. In other words, count the number of indices i such that:
+ * - 0 <= i <= nums.length - 2,
+ * - nums[i] == key and,
+ * - nums[i + 1] == target.
+ *
+ * Return the target with the maximum count. The test cases will be generated such that the target
+ * with maximum count is unique.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} key
+ * @return {number}
+ */
+var mostFrequent = function(nums, key) {
+  const frequency = new Map();
+  let maxCount = 0;
+  let result = 0;
+
+  for (let i = 0; i < nums.length - 1; i++) {
+    if (nums[i] === key) {
+      const target = nums[i + 1];
+      const count = (frequency.get(target) || 0) + 1;
+      frequency.set(target, count);
+
+      if (count > maxCount) {
+        maxCount = count;
+        result = target;
+      }
+    }
+  }
+
+  return result;
+};

From 384eb223846c285fc9f95bd77027f0db9a891413 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 23:29:57 -0500
Subject: [PATCH 095/571] Add solution #2191

---
 README.md                                  |  3 +-
 solutions/2191-sort-the-jumbled-numbers.js | 53 ++++++++++++++++++++++
 2 files changed, 55 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2191-sort-the-jumbled-numbers.js

diff --git a/README.md b/README.md
index dc946658..c16f399b 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,803 LeetCode solutions in JavaScript
+# 1,804 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1676,6 +1676,7 @@
 2187|[Minimum Time to Complete Trips](./solutions/2187-minimum-time-to-complete-trips.js)|Medium|
 2188|[Minimum Time to Finish the Race](./solutions/2188-minimum-time-to-finish-the-race.js)|Hard|
 2190|[Most Frequent Number Following Key In an Array](./solutions/2190-most-frequent-number-following-key-in-an-array.js)|Easy|
+2191|[Sort the Jumbled Numbers](./solutions/2191-sort-the-jumbled-numbers.js)|Medium|
 2206|[Divide Array Into Equal Pairs](./solutions/2206-divide-array-into-equal-pairs.js)|Easy|
 2215|[Find the Difference of Two Arrays](./solutions/2215-find-the-difference-of-two-arrays.js)|Easy|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
diff --git a/solutions/2191-sort-the-jumbled-numbers.js b/solutions/2191-sort-the-jumbled-numbers.js
new file mode 100644
index 00000000..490e1d17
--- /dev/null
+++ b/solutions/2191-sort-the-jumbled-numbers.js
@@ -0,0 +1,53 @@
+/**
+ * 2191. Sort the Jumbled Numbers
+ * https://leetcode.com/problems/sort-the-jumbled-numbers/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed integer array mapping which represents the mapping rule of a shuffled
+ * decimal system. mapping[i] = j means digit i should be mapped to digit j in this system.
+ *
+ * The mapped value of an integer is the new integer obtained by replacing each occurrence of digit
+ * i in the integer with mapping[i] for all 0 <= i <= 9.
+ *
+ * You are also given another integer array nums. Return the array nums sorted in non-decreasing
+ * order based on the mapped values of its elements.
+ *
+ * Notes:
+ * - Elements with the same mapped values should appear in the same relative order as in the input.
+ * - The elements of nums should only be sorted based on their mapped values and not be replaced by
+ *   them.
+ */
+
+/**
+ * @param {number[]} mapping
+ * @param {number[]} nums
+ * @return {number[]}
+ */
+var sortJumbled = function(mapping, nums) {
+  const mapped = nums.map((num, index) => {
+    let mappedNum = 0;
+    let temp = num;
+
+    if (temp === 0) {
+      mappedNum = mapping[0];
+    } else {
+      const digits = [];
+      while (temp > 0) {
+        digits.push(mapping[temp % 10]);
+        temp = Math.floor(temp / 10);
+      }
+      while (digits.length > 0) {
+        mappedNum = mappedNum * 10 + digits.pop();
+      }
+    }
+
+    return { original: num, mapped: mappedNum, index };
+  });
+
+  mapped.sort((a, b) => {
+    if (a.mapped === b.mapped) return a.index - b.index;
+    return a.mapped - b.mapped;
+  });
+
+  return mapped.map(item => item.original);
+};

From ca673593ad0c12fa50bc8df093f32b79279d1dd8 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 14 May 2025 23:33:08 -0500
Subject: [PATCH 096/571] Add solution #2192

---
 README.md                                     |  3 +-
 ...s-of-a-node-in-a-directed-acyclic-graph.js | 48 +++++++++++++++++++
 2 files changed, 50 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2192-all-ancestors-of-a-node-in-a-directed-acyclic-graph.js

diff --git a/README.md b/README.md
index c16f399b..1679c28a 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,804 LeetCode solutions in JavaScript
+# 1,805 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1677,6 +1677,7 @@
 2188|[Minimum Time to Finish the Race](./solutions/2188-minimum-time-to-finish-the-race.js)|Hard|
 2190|[Most Frequent Number Following Key In an Array](./solutions/2190-most-frequent-number-following-key-in-an-array.js)|Easy|
 2191|[Sort the Jumbled Numbers](./solutions/2191-sort-the-jumbled-numbers.js)|Medium|
+2192|[All Ancestors of a Node in a Directed Acyclic Graph](./solutions/2192-all-ancestors-of-a-node-in-a-directed-acyclic-graph.js)|Medium|
 2206|[Divide Array Into Equal Pairs](./solutions/2206-divide-array-into-equal-pairs.js)|Easy|
 2215|[Find the Difference of Two Arrays](./solutions/2215-find-the-difference-of-two-arrays.js)|Easy|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
diff --git a/solutions/2192-all-ancestors-of-a-node-in-a-directed-acyclic-graph.js b/solutions/2192-all-ancestors-of-a-node-in-a-directed-acyclic-graph.js
new file mode 100644
index 00000000..9eeb8509
--- /dev/null
+++ b/solutions/2192-all-ancestors-of-a-node-in-a-directed-acyclic-graph.js
@@ -0,0 +1,48 @@
+/**
+ * 2192. All Ancestors of a Node in a Directed Acyclic Graph
+ * https://leetcode.com/problems/all-ancestors-of-a-node-in-a-directed-acyclic-graph/
+ * Difficulty: Medium
+ *
+ * You are given a positive integer n representing the number of nodes of a Directed Acyclic
+ * Graph (DAG). The nodes are numbered from 0 to n - 1 (inclusive).
+ *
+ * You are also given a 2D integer array edges, where edges[i] = [fromi, toi] denotes that there
+ * is a unidirectional edge from fromi to toi in the graph.
+ *
+ * Return a list answer, where answer[i] is the list of ancestors of the ith node, sorted in
+ * ascending order.
+ *
+ * A node u is an ancestor of another node v if u can reach v via a set of edges.
+ */
+
+/**
+ * @param {number} n
+ * @param {number[][]} edges
+ * @return {number[][]}
+ */
+var getAncestors = function(n, edges) {
+  const graph = Array.from({ length: n }, () => []);
+  const ancestors = Array.from({ length: n }, () => new Set());
+
+  for (const [from, to] of edges) {
+    graph[to].push(from);
+  }
+
+  for (let i = 0; i < n; i++) {
+    findAncestors(i);
+  }
+
+  return ancestors.map(set => [...set].sort((a, b) => a - b));
+
+  function findAncestors(node) {
+    if (ancestors[node].size > 0) return;
+
+    for (const parent of graph[node]) {
+      ancestors[node].add(parent);
+      findAncestors(parent);
+      for (const ancestor of ancestors[parent]) {
+        ancestors[node].add(ancestor);
+      }
+    }
+  }
+};

From 9a6af5df8e74e09e508cc20362c59aa93974d73b Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 15 May 2025 00:19:40 -0500
Subject: [PATCH 097/571] Add solution #2193

---
 README.md                                     |  3 +-
 ...imum-number-of-moves-to-make-palindrome.js | 42 +++++++++++++++++++
 2 files changed, 44 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2193-minimum-number-of-moves-to-make-palindrome.js

diff --git a/README.md b/README.md
index 1679c28a..1e7f1fdf 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,805 LeetCode solutions in JavaScript
+# 1,806 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1678,6 +1678,7 @@
 2190|[Most Frequent Number Following Key In an Array](./solutions/2190-most-frequent-number-following-key-in-an-array.js)|Easy|
 2191|[Sort the Jumbled Numbers](./solutions/2191-sort-the-jumbled-numbers.js)|Medium|
 2192|[All Ancestors of a Node in a Directed Acyclic Graph](./solutions/2192-all-ancestors-of-a-node-in-a-directed-acyclic-graph.js)|Medium|
+2193|[Minimum Number of Moves to Make Palindrome](./solutions/2193-minimum-number-of-moves-to-make-palindrome.js)|Hard|
 2206|[Divide Array Into Equal Pairs](./solutions/2206-divide-array-into-equal-pairs.js)|Easy|
 2215|[Find the Difference of Two Arrays](./solutions/2215-find-the-difference-of-two-arrays.js)|Easy|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
diff --git a/solutions/2193-minimum-number-of-moves-to-make-palindrome.js b/solutions/2193-minimum-number-of-moves-to-make-palindrome.js
new file mode 100644
index 00000000..c25800e2
--- /dev/null
+++ b/solutions/2193-minimum-number-of-moves-to-make-palindrome.js
@@ -0,0 +1,42 @@
+/**
+ * 2193. Minimum Number of Moves to Make Palindrome
+ * https://leetcode.com/problems/minimum-number-of-moves-to-make-palindrome/
+ * Difficulty: Hard
+ *
+ * You are given a string s consisting only of lowercase English letters.
+ *
+ * In one move, you can select any two adjacent characters of s and swap them.
+ *
+ * Return the minimum number of moves needed to make s a palindrome.
+ *
+ * Note that the input will be generated such that s can always be converted to a palindrome.
+ */
+
+/**
+* @param {string} s
+* @return {number}
+*/
+var minMovesToMakePalindrome = function(s) {
+  const chars = s.split('');
+  let moves = 0;
+
+  while (chars.length > 1) {
+    const matchIndex = chars.lastIndexOf(chars[0]);
+
+    if (matchIndex === 0) {
+      const middlePos = Math.floor(chars.length / 2);
+      moves += middlePos;
+      chars.splice(0, 1);
+    } else {
+      for (let i = matchIndex; i < chars.length - 1; i++) {
+        [chars[i], chars[i + 1]] = [chars[i + 1], chars[i]];
+        moves++;
+      }
+
+      chars.pop();
+      chars.shift();
+    }
+  }
+
+  return moves;
+};

From d3f113195721db502d6e8ce3a469445e7770e4ed Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 15 May 2025 00:21:35 -0500
Subject: [PATCH 098/571] Add solution #2194

---
 README.md                                     |  3 +-
 ...2194-cells-in-a-range-on-an-excel-sheet.js | 37 +++++++++++++++++++
 2 files changed, 39 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2194-cells-in-a-range-on-an-excel-sheet.js

diff --git a/README.md b/README.md
index 1e7f1fdf..d572b7c9 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,806 LeetCode solutions in JavaScript
+# 1,807 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1679,6 +1679,7 @@
 2191|[Sort the Jumbled Numbers](./solutions/2191-sort-the-jumbled-numbers.js)|Medium|
 2192|[All Ancestors of a Node in a Directed Acyclic Graph](./solutions/2192-all-ancestors-of-a-node-in-a-directed-acyclic-graph.js)|Medium|
 2193|[Minimum Number of Moves to Make Palindrome](./solutions/2193-minimum-number-of-moves-to-make-palindrome.js)|Hard|
+2194|[Cells in a Range on an Excel Sheet](./solutions/2194-cells-in-a-range-on-an-excel-sheet.js)|Easy|
 2206|[Divide Array Into Equal Pairs](./solutions/2206-divide-array-into-equal-pairs.js)|Easy|
 2215|[Find the Difference of Two Arrays](./solutions/2215-find-the-difference-of-two-arrays.js)|Easy|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
diff --git a/solutions/2194-cells-in-a-range-on-an-excel-sheet.js b/solutions/2194-cells-in-a-range-on-an-excel-sheet.js
new file mode 100644
index 00000000..194c60cc
--- /dev/null
+++ b/solutions/2194-cells-in-a-range-on-an-excel-sheet.js
@@ -0,0 +1,37 @@
+/**
+ * 2194. Cells in a Range on an Excel Sheet
+ * https://leetcode.com/problems/cells-in-a-range-on-an-excel-sheet/
+ * Difficulty: Easy
+ *
+ * A cell (r, c) of an excel sheet is represented as a string "" where:
+ * -  denotes the column number c of the cell. It is represented by alphabetical letters.
+ *   - For example, the 1st column is denoted by 'A', the 2nd by 'B', the 3rd by 'C', and so on.
+ * -  is the row number r of the cell. The rth row is represented by the integer r.
+ *   - You are given a string s in the format ":", where  represents
+ *     the column c1,  represents the row r1,  represents the column c2, and 
+ *     represents the row r2, such that r1 <= r2 and c1 <= c2.
+ *
+ * Return the list of cells (x, y) such that r1 <= x <= r2 and c1 <= y <= c2. The cells should
+ * be represented as strings in the format mentioned above and be sorted in non-decreasing order
+ * first by columns and then by rows.
+ */
+
+/**
+ * @param {string} s
+ * @return {string[]}
+ */
+var cellsInRange = function(s) {
+  const result = [];
+  const startCol = s.charCodeAt(0);
+  const endCol = s.charCodeAt(3);
+  const startRow = parseInt(s[1], 10);
+  const endRow = parseInt(s[4], 10);
+
+  for (let col = startCol; col <= endCol; col++) {
+    for (let row = startRow; row <= endRow; row++) {
+      result.push(String.fromCharCode(col) + row);
+    }
+  }
+
+  return result;
+};

From 8b58825a27fcee635778192e6e2b6bcaf8c12ca6 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 15 May 2025 00:23:06 -0500
Subject: [PATCH 099/571] Add solution #2195

---
 README.md                                     |  3 +-
 ...2195-append-k-integers-with-minimal-sum.js | 40 +++++++++++++++++++
 2 files changed, 42 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2195-append-k-integers-with-minimal-sum.js

diff --git a/README.md b/README.md
index d572b7c9..62a0e019 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,807 LeetCode solutions in JavaScript
+# 1,808 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1680,6 +1680,7 @@
 2192|[All Ancestors of a Node in a Directed Acyclic Graph](./solutions/2192-all-ancestors-of-a-node-in-a-directed-acyclic-graph.js)|Medium|
 2193|[Minimum Number of Moves to Make Palindrome](./solutions/2193-minimum-number-of-moves-to-make-palindrome.js)|Hard|
 2194|[Cells in a Range on an Excel Sheet](./solutions/2194-cells-in-a-range-on-an-excel-sheet.js)|Easy|
+2195|[Append K Integers With Minimal Sum](./solutions/2195-append-k-integers-with-minimal-sum.js)|Medium|
 2206|[Divide Array Into Equal Pairs](./solutions/2206-divide-array-into-equal-pairs.js)|Easy|
 2215|[Find the Difference of Two Arrays](./solutions/2215-find-the-difference-of-two-arrays.js)|Easy|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
diff --git a/solutions/2195-append-k-integers-with-minimal-sum.js b/solutions/2195-append-k-integers-with-minimal-sum.js
new file mode 100644
index 00000000..bc873455
--- /dev/null
+++ b/solutions/2195-append-k-integers-with-minimal-sum.js
@@ -0,0 +1,40 @@
+/**
+ * 2195. Append K Integers With Minimal Sum
+ * https://leetcode.com/problems/append-k-integers-with-minimal-sum/
+ * Difficulty: Medium
+ *
+ * You are given an integer array nums and an integer k. Append k unique positive integers that do
+ * not appear in nums to nums such that the resulting total sum is minimum.
+ *
+ * Return the sum of the k integers appended to nums.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} k
+ * @return {number}
+ */
+var minimalKSum = function(nums, k) {
+  const sortedUnique = [...new Set(nums)].sort((a, b) => a - b);
+  let sum = BigInt(0);
+  let current = 1;
+  let i = 0;
+
+  while (k > 0 && i < sortedUnique.length) {
+    if (current < sortedUnique[i]) {
+      const count = Math.min(k, sortedUnique[i] - current);
+      sum += (BigInt(current) + BigInt(current + count - 1)) * BigInt(count) / BigInt(2);
+      k -= count;
+      current += count;
+    } else {
+      current = sortedUnique[i] + 1;
+      i++;
+    }
+  }
+
+  if (k > 0) {
+    sum += (BigInt(current) + BigInt(current + k - 1)) * BigInt(k) / BigInt(2);
+  }
+
+  return Number(sum);
+};

From 3571aea58fc1fc5332a35e1ce1370184fb366686 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 15 May 2025 00:24:26 -0500
Subject: [PATCH 100/571] Add solution #2196

---
 README.md                                     |  3 +-
 ...96-create-binary-tree-from-descriptions.js | 54 +++++++++++++++++++
 2 files changed, 56 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2196-create-binary-tree-from-descriptions.js

diff --git a/README.md b/README.md
index 62a0e019..da9c9883 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,808 LeetCode solutions in JavaScript
+# 1,809 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1681,6 +1681,7 @@
 2193|[Minimum Number of Moves to Make Palindrome](./solutions/2193-minimum-number-of-moves-to-make-palindrome.js)|Hard|
 2194|[Cells in a Range on an Excel Sheet](./solutions/2194-cells-in-a-range-on-an-excel-sheet.js)|Easy|
 2195|[Append K Integers With Minimal Sum](./solutions/2195-append-k-integers-with-minimal-sum.js)|Medium|
+2196|[Create Binary Tree From Descriptions](./solutions/2196-create-binary-tree-from-descriptions.js)|Medium|
 2206|[Divide Array Into Equal Pairs](./solutions/2206-divide-array-into-equal-pairs.js)|Easy|
 2215|[Find the Difference of Two Arrays](./solutions/2215-find-the-difference-of-two-arrays.js)|Easy|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
diff --git a/solutions/2196-create-binary-tree-from-descriptions.js b/solutions/2196-create-binary-tree-from-descriptions.js
new file mode 100644
index 00000000..67af6416
--- /dev/null
+++ b/solutions/2196-create-binary-tree-from-descriptions.js
@@ -0,0 +1,54 @@
+/**
+ * 2196. Create Binary Tree From Descriptions
+ * https://leetcode.com/problems/create-binary-tree-from-descriptions/
+ * Difficulty: Medium
+ *
+ * You are given a 2D integer array descriptions where descriptions[i] = [parenti, childi, isLefti]
+ * indicates that parenti is the parent of childi in a binary tree of unique values. Furthermore,
+ * - If isLefti == 1, then childi is the left child of parenti.
+ * - If isLefti == 0, then childi is the right child of parenti.
+ *
+ * Construct the binary tree described by descriptions and return its root.
+ *
+ * The test cases will be generated such that the binary tree is valid.
+ */
+
+/**
+ * Definition for a binary tree node.
+ * function TreeNode(val, left, right) {
+ *     this.val = (val===undefined ? 0 : val)
+ *     this.left = (left===undefined ? null : left)
+ *     this.right = (right===undefined ? null : right)
+ * }
+ */
+/**
+ * @param {number[][]} descriptions
+ * @return {TreeNode}
+ */
+var createBinaryTree = function(descriptions) {
+  const nodes = new Map();
+  const children = new Set();
+
+  for (const [parent, child, isLeft] of descriptions) {
+    if (!nodes.has(parent)) {
+      nodes.set(parent, new TreeNode(parent));
+    }
+    if (!nodes.has(child)) {
+      nodes.set(child, new TreeNode(child));
+    }
+    children.add(child);
+    if (isLeft) {
+      nodes.get(parent).left = nodes.get(child);
+    } else {
+      nodes.get(parent).right = nodes.get(child);
+    }
+  }
+
+  for (const [val, node] of nodes) {
+    if (!children.has(val)) {
+      return node;
+    }
+  }
+
+  return null;
+};

From 0e251fcf8b91c606ab6d9e4d0eb7f1971e22d599 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 15 May 2025 00:26:40 -0500
Subject: [PATCH 101/571] Add solution #2197

---
 README.md                                     |  3 +-
 ...97-replace-non-coprime-numbers-in-array.js | 48 +++++++++++++++++++
 2 files changed, 50 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2197-replace-non-coprime-numbers-in-array.js

diff --git a/README.md b/README.md
index da9c9883..7fc7982d 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,809 LeetCode solutions in JavaScript
+# 1,810 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1682,6 +1682,7 @@
 2194|[Cells in a Range on an Excel Sheet](./solutions/2194-cells-in-a-range-on-an-excel-sheet.js)|Easy|
 2195|[Append K Integers With Minimal Sum](./solutions/2195-append-k-integers-with-minimal-sum.js)|Medium|
 2196|[Create Binary Tree From Descriptions](./solutions/2196-create-binary-tree-from-descriptions.js)|Medium|
+2197|[Replace Non-Coprime Numbers in Array](./solutions/2197-replace-non-coprime-numbers-in-array.js)|Hard|
 2206|[Divide Array Into Equal Pairs](./solutions/2206-divide-array-into-equal-pairs.js)|Easy|
 2215|[Find the Difference of Two Arrays](./solutions/2215-find-the-difference-of-two-arrays.js)|Easy|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
diff --git a/solutions/2197-replace-non-coprime-numbers-in-array.js b/solutions/2197-replace-non-coprime-numbers-in-array.js
new file mode 100644
index 00000000..2bc8e2d5
--- /dev/null
+++ b/solutions/2197-replace-non-coprime-numbers-in-array.js
@@ -0,0 +1,48 @@
+/**
+ * 2197. Replace Non-Coprime Numbers in Array
+ * https://leetcode.com/problems/replace-non-coprime-numbers-in-array/
+ * Difficulty: Hard
+ *
+ * You are given an array of integers nums. Perform the following steps:
+ * 1. Find any two adjacent numbers in nums that are non-coprime.
+ * 2. If no such numbers are found, stop the process.
+ * 3. Otherwise, delete the two numbers and replace them with their LCM (Least Common Multiple).
+ * 4. Repeat this process as long as you keep finding two adjacent non-coprime numbers.
+ *
+ * Return the final modified array. It can be shown that replacing adjacent non-coprime numbers in
+ * any arbitrary order will lead to the same result.
+ *
+ * The test cases are generated such that the values in the final array are less than or equal to
+ * 108.
+ *
+ * Two values x and y are non-coprime if GCD(x, y) > 1 where GCD(x, y) is the Greatest Common
+ * Divisor of x and y.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number[]}
+ */
+var replaceNonCoprimes = function(nums) {
+  const result = [];
+
+  for (let num of nums) {
+    while (result.length > 0) {
+      const last = result[result.length - 1];
+      const gcdValue = gcd(last, num);
+      if (gcdValue === 1) break;
+      result.pop();
+      num = (last / gcdValue) * num;
+    }
+    result.push(num);
+  }
+
+  return result;
+};
+
+function gcd(a, b) {
+  while (b) {
+    [a, b] = [b, a % b];
+  }
+  return a;
+}

From 6a18abb9c2ca2bbeece317b236bfb31dde81c070 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 15 May 2025 22:44:07 -0500
Subject: [PATCH 102/571] Add solution #2901

---
 README.md                                     |  3 +-
 ...-unequal-adjacent-groups-subsequence-ii.js | 68 +++++++++++++++++++
 2 files changed, 70 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2901-longest-unequal-adjacent-groups-subsequence-ii.js

diff --git a/README.md b/README.md
index 7fc7982d..172d9d03 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,810 LeetCode solutions in JavaScript
+# 1,811 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1780,6 +1780,7 @@
 2873|[Maximum Value of an Ordered Triplet I](./solutions/2873-maximum-value-of-an-ordered-triplet-i.js)|Easy|
 2874|[Maximum Value of an Ordered Triplet II](./solutions/2874-maximum-value-of-an-ordered-triplet-ii.js)|Medium|
 2900|[Longest Unequal Adjacent Groups Subsequence I](./solutions/2900-longest-unequal-adjacent-groups-subsequence-i.js)|Easy|
+2901|[Longest Unequal Adjacent Groups Subsequence II](./solutions/2901-longest-unequal-adjacent-groups-subsequence-ii.js)|Medium|
 2918|[Minimum Equal Sum of Two Arrays After Replacing Zeros](./solutions/2918-minimum-equal-sum-of-two-arrays-after-replacing-zeros.js)|Medium|
 2948|[Make Lexicographically Smallest Array by Swapping Elements](./solutions/2948-make-lexicographically-smallest-array-by-swapping-elements.js)|Medium|
 2962|[Count Subarrays Where Max Element Appears at Least K Times](./solutions/2962-count-subarrays-where-max-element-appears-at-least-k-times.js)|Medium|
diff --git a/solutions/2901-longest-unequal-adjacent-groups-subsequence-ii.js b/solutions/2901-longest-unequal-adjacent-groups-subsequence-ii.js
new file mode 100644
index 00000000..1a290423
--- /dev/null
+++ b/solutions/2901-longest-unequal-adjacent-groups-subsequence-ii.js
@@ -0,0 +1,68 @@
+/**
+ * 2901. Longest Unequal Adjacent Groups Subsequence II
+ * https://leetcode.com/problems/longest-unequal-adjacent-groups-subsequence-ii/
+ * Difficulty: Medium
+ *
+ * You are given a string array words, and an array groups, both arrays having length n.
+ *
+ * The hamming distance between two strings of equal length is the number of positions at which the
+ * corresponding characters are different.
+ *
+ * You need to select the longest subsequence from an array of indices [0, 1, ..., n - 1], such
+ * that for the subsequence denoted as [i0, i1, ..., ik-1] having length k, the following holds:
+ * - For adjacent indices in the subsequence, their corresponding groups are unequal, i.e.,
+ *   groups[ij] != groups[ij+1], for each j where 0 < j + 1 < k.
+ * - words[ij] and words[ij+1] are equal in length, and the hamming distance between them is 1,
+ *   where 0 < j + 1 < k, for all indices in the subsequence.
+ *
+ * Return a string array containing the words corresponding to the indices (in order) in the
+ * selected subsequence. If there are multiple answers, return any of them.
+ *
+ * Note: strings in words may be unequal in length.
+ */
+
+/**
+ * @param {string[]} words
+ * @param {number[]} groups
+ * @return {string[]}
+ */
+var getWordsInLongestSubsequence = function(words, groups) {
+  const n = words.length;
+  const dp = new Array(n).fill(1);
+  const prev = new Array(n).fill(-1);
+  let maxLen = 1;
+  let lastIndex = 0;
+
+  for (let i = 1; i < n; i++) {
+    for (let j = 0; j < i; j++) {
+      if (groups[i] !== groups[j] && helper(words[i], words[j])) {
+        if (dp[j] + 1 > dp[i]) {
+          dp[i] = dp[j] + 1;
+          prev[i] = j;
+        }
+      }
+    }
+    if (dp[i] > maxLen) {
+      maxLen = dp[i];
+      lastIndex = i;
+    }
+  }
+
+  const result = [];
+  while (lastIndex !== -1) {
+    result.push(words[lastIndex]);
+    lastIndex = prev[lastIndex];
+  }
+
+  return result.reverse();
+
+  function helper(s1, s2) {
+    if (s1.length !== s2.length) return false;
+    let diff = 0;
+    for (let i = 0; i < s1.length; i++) {
+      if (s1[i] !== s2[i]) diff++;
+      if (diff > 1) return false;
+    }
+    return diff === 1;
+  }
+};

From 8051d84cb66af3881db81ce9063d430f73c411f0 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 15 May 2025 22:45:52 -0500
Subject: [PATCH 103/571] Add solution #2200

---
 README.md                                     |  3 +-
 ...-find-all-k-distant-indices-in-an-array.js | 31 +++++++++++++++++++
 2 files changed, 33 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2200-find-all-k-distant-indices-in-an-array.js

diff --git a/README.md b/README.md
index 172d9d03..1d7cea7f 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,811 LeetCode solutions in JavaScript
+# 1,812 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1683,6 +1683,7 @@
 2195|[Append K Integers With Minimal Sum](./solutions/2195-append-k-integers-with-minimal-sum.js)|Medium|
 2196|[Create Binary Tree From Descriptions](./solutions/2196-create-binary-tree-from-descriptions.js)|Medium|
 2197|[Replace Non-Coprime Numbers in Array](./solutions/2197-replace-non-coprime-numbers-in-array.js)|Hard|
+2200|[Find All K-Distant Indices in an Array](./solutions/2200-find-all-k-distant-indices-in-an-array.js)|Easy|
 2206|[Divide Array Into Equal Pairs](./solutions/2206-divide-array-into-equal-pairs.js)|Easy|
 2215|[Find the Difference of Two Arrays](./solutions/2215-find-the-difference-of-two-arrays.js)|Easy|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
diff --git a/solutions/2200-find-all-k-distant-indices-in-an-array.js b/solutions/2200-find-all-k-distant-indices-in-an-array.js
new file mode 100644
index 00000000..5a2cd1bd
--- /dev/null
+++ b/solutions/2200-find-all-k-distant-indices-in-an-array.js
@@ -0,0 +1,31 @@
+/**
+ * 2200. Find All K-Distant Indices in an Array
+ * https://leetcode.com/problems/find-all-k-distant-indices-in-an-array/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed integer array nums and two integers key and k. A k-distant index
+ * is an index i of nums for which there exists at least one index j such that |i - j| <= k
+ * and nums[j] == key.
+ *
+ * Return a list of all k-distant indices sorted in increasing order.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} key
+ * @param {number} k
+ * @return {number[]}
+ */
+var findKDistantIndices = function(nums, key, k) {
+  const result = new Set();
+
+  for (let j = 0; j < nums.length; j++) {
+    if (nums[j] === key) {
+      for (let i = Math.max(0, j - k); i <= Math.min(nums.length - 1, j + k); i++) {
+        result.add(i);
+      }
+    }
+  }
+
+  return [...result].sort((a, b) => a - b);
+};

From 5ddaacacc191852f6c6811a17e0758cd368f3a66 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 15 May 2025 22:47:34 -0500
Subject: [PATCH 104/571] Add solution #2201

---
 README.md                                     |  3 +-
 ...1-count-artifacts-that-can-be-extracted.js | 57 +++++++++++++++++++
 2 files changed, 59 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2201-count-artifacts-that-can-be-extracted.js

diff --git a/README.md b/README.md
index 1d7cea7f..718141c2 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,812 LeetCode solutions in JavaScript
+# 1,813 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1684,6 +1684,7 @@
 2196|[Create Binary Tree From Descriptions](./solutions/2196-create-binary-tree-from-descriptions.js)|Medium|
 2197|[Replace Non-Coprime Numbers in Array](./solutions/2197-replace-non-coprime-numbers-in-array.js)|Hard|
 2200|[Find All K-Distant Indices in an Array](./solutions/2200-find-all-k-distant-indices-in-an-array.js)|Easy|
+2201|[Count Artifacts That Can Be Extracted](./solutions/2201-count-artifacts-that-can-be-extracted.js)|Medium|
 2206|[Divide Array Into Equal Pairs](./solutions/2206-divide-array-into-equal-pairs.js)|Easy|
 2215|[Find the Difference of Two Arrays](./solutions/2215-find-the-difference-of-two-arrays.js)|Easy|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
diff --git a/solutions/2201-count-artifacts-that-can-be-extracted.js b/solutions/2201-count-artifacts-that-can-be-extracted.js
new file mode 100644
index 00000000..cd5f5627
--- /dev/null
+++ b/solutions/2201-count-artifacts-that-can-be-extracted.js
@@ -0,0 +1,57 @@
+/**
+ * 2201. Count Artifacts That Can Be Extracted
+ * https://leetcode.com/problems/count-artifacts-that-can-be-extracted/
+ * Difficulty: Medium
+ *
+ * There is an n x n 0-indexed grid with some artifacts buried in it. You are given the integer
+ * n and a 0-indexed 2D integer array artifacts describing the positions of the rectangular
+ * artifacts where artifacts[i] = [r1i, c1i, r2i, c2i] denotes that the ith artifact is buried
+ * in the subgrid where:
+ * - (r1i, c1i) is the coordinate of the top-left cell of the ith artifact and
+ * - (r2i, c2i) is the coordinate of the bottom-right cell of the ith artifact.
+ *
+ * You will excavate some cells of the grid and remove all the mud from them. If the cell has a
+ * part of an artifact buried underneath, it will be uncovered. If all the parts of an artifact
+ * are uncovered, you can extract it.
+ *
+ * Given a 0-indexed 2D integer array dig where dig[i] = [ri, ci] indicates that you will excavate
+ * the cell (ri, ci), return the number of artifacts that you can extract.
+ *
+ * The test cases are generated such that:
+ * - No two artifacts overlap.
+ * - Each artifact only covers at most 4 cells.
+ * - The entries of dig are unique.
+ */
+
+/**
+ * @param {number} n
+ * @param {number[][]} artifacts
+ * @param {number[][]} dig
+ * @return {number}
+ */
+var digArtifacts = function(n, artifacts, dig) {
+  const excavated = new Set();
+  let result = 0;
+
+  for (const [row, col] of dig) {
+    excavated.add(`${row},${col}`);
+  }
+
+  for (const [r1, c1, r2, c2] of artifacts) {
+    let allUncovered = true;
+
+    for (let r = r1; r <= r2; r++) {
+      for (let c = c1; c <= c2; c++) {
+        if (!excavated.has(`${r},${c}`)) {
+          allUncovered = false;
+          break;
+        }
+      }
+      if (!allUncovered) break;
+    }
+
+    if (allUncovered) result++;
+  }
+
+  return result;
+};

From cb2094f235cd26e6163d2f3f4d1664ba53feee5f Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 15 May 2025 22:48:47 -0500
Subject: [PATCH 105/571] Add solution #2202

---
 README.md                                     |  3 +-
 ...imize-the-topmost-element-after-k-moves.js | 42 +++++++++++++++++++
 2 files changed, 44 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2202-maximize-the-topmost-element-after-k-moves.js

diff --git a/README.md b/README.md
index 718141c2..b51468a5 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,813 LeetCode solutions in JavaScript
+# 1,814 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1685,6 +1685,7 @@
 2197|[Replace Non-Coprime Numbers in Array](./solutions/2197-replace-non-coprime-numbers-in-array.js)|Hard|
 2200|[Find All K-Distant Indices in an Array](./solutions/2200-find-all-k-distant-indices-in-an-array.js)|Easy|
 2201|[Count Artifacts That Can Be Extracted](./solutions/2201-count-artifacts-that-can-be-extracted.js)|Medium|
+2202|[Maximize the Topmost Element After K Moves](./solutions/2202-maximize-the-topmost-element-after-k-moves.js)|Medium|
 2206|[Divide Array Into Equal Pairs](./solutions/2206-divide-array-into-equal-pairs.js)|Easy|
 2215|[Find the Difference of Two Arrays](./solutions/2215-find-the-difference-of-two-arrays.js)|Easy|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
diff --git a/solutions/2202-maximize-the-topmost-element-after-k-moves.js b/solutions/2202-maximize-the-topmost-element-after-k-moves.js
new file mode 100644
index 00000000..8b1554b2
--- /dev/null
+++ b/solutions/2202-maximize-the-topmost-element-after-k-moves.js
@@ -0,0 +1,42 @@
+/**
+ * 2202. Maximize the Topmost Element After K Moves
+ * https://leetcode.com/problems/maximize-the-topmost-element-after-k-moves/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed integer array nums representing the contents of a pile, where nums[0]
+ * is the topmost element of the pile.
+ *
+ * In one move, you can perform either of the following:
+ * - If the pile is not empty, remove the topmost element of the pile.
+ * - If there are one or more removed elements, add any one of them back onto the pile. This element
+ *   becomes the new topmost element.
+ *
+ * You are also given an integer k, which denotes the total number of moves to be made.
+ *
+ * Return the maximum value of the topmost element of the pile possible after exactly k moves. In
+ * case it is not possible to obtain a non-empty pile after k moves, return -1.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} k
+ * @return {number}
+ */
+var maximumTop = function(nums, k) {
+  const n = nums.length;
+
+  if (n === 1 && k % 2 === 1) return -1;
+  if (k === 0) return nums[0];
+  if (k === 1) return n > 1 ? nums[1] : -1;
+
+  let result = 0;
+  for (let i = 0; i < Math.min(k - 1, n); i++) {
+    result = Math.max(result, nums[i]);
+  }
+
+  if (k < n) {
+    result = Math.max(result, nums[k]);
+  }
+
+  return result;
+};

From ac0b66f847fb44835b0f10b03d12b46c4850c5d1 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 15 May 2025 22:53:20 -0500
Subject: [PATCH 106/571] Add solution #2203

---
 README.md                                     |  3 +-
 ...ighted-subgraph-with-the-required-paths.js | 73 +++++++++++++++++++
 2 files changed, 75 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2203-minimum-weighted-subgraph-with-the-required-paths.js

diff --git a/README.md b/README.md
index b51468a5..6561d0f7 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,814 LeetCode solutions in JavaScript
+# 1,815 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1686,6 +1686,7 @@
 2200|[Find All K-Distant Indices in an Array](./solutions/2200-find-all-k-distant-indices-in-an-array.js)|Easy|
 2201|[Count Artifacts That Can Be Extracted](./solutions/2201-count-artifacts-that-can-be-extracted.js)|Medium|
 2202|[Maximize the Topmost Element After K Moves](./solutions/2202-maximize-the-topmost-element-after-k-moves.js)|Medium|
+2203|[Minimum Weighted Subgraph With the Required Paths](./solutions/2203-minimum-weighted-subgraph-with-the-required-paths.js)|Hard|
 2206|[Divide Array Into Equal Pairs](./solutions/2206-divide-array-into-equal-pairs.js)|Easy|
 2215|[Find the Difference of Two Arrays](./solutions/2215-find-the-difference-of-two-arrays.js)|Easy|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
diff --git a/solutions/2203-minimum-weighted-subgraph-with-the-required-paths.js b/solutions/2203-minimum-weighted-subgraph-with-the-required-paths.js
new file mode 100644
index 00000000..4ace48ff
--- /dev/null
+++ b/solutions/2203-minimum-weighted-subgraph-with-the-required-paths.js
@@ -0,0 +1,73 @@
+/**
+ * 2203. Minimum Weighted Subgraph With the Required Paths
+ * https://leetcode.com/problems/minimum-weighted-subgraph-with-the-required-paths/
+ * Difficulty: Hard
+ *
+ * You are given an integer n denoting the number of nodes of a weighted directed graph. The nodes
+ * are numbered from 0 to n - 1.
+ *
+ * You are also given a 2D integer array edges where edges[i] = [fromi, toi, weighti] denotes that
+ * there exists a directed edge from fromi to toi with weight weighti.
+ *
+ * Lastly, you are given three distinct integers src1, src2, and dest denoting three distinct nodes
+ * of the graph.
+ *
+ * Return the minimum weight of a subgraph of the graph such that it is possible to reach dest from
+ * both src1 and src2 via a set of edges of this subgraph. In case such a subgraph does not exist,
+ * return -1.
+ *
+ * A subgraph is a graph whose vertices and edges are subsets of the original graph. The weight of
+ * a subgraph is the sum of weights of its constituent edges.
+ */
+
+/**
+ * @param {number} n
+ * @param {number[][]} edges
+ * @param {number} src1
+ * @param {number} src2
+ * @param {number} dest
+ * @return {number}
+ */
+var minimumWeight = function(n, edges, src1, src2, dest) {
+  const forwardGraph = Array.from({ length: n }, () => []);
+  const reverseGraph = Array.from({ length: n }, () => []);
+
+  for (const [from, to, weight] of edges) {
+    forwardGraph[from].push([to, weight]);
+    reverseGraph[to].push([from, weight]);
+  }
+
+  const distFromSrc1 = dijkstra(forwardGraph, src1);
+  const distFromSrc2 = dijkstra(forwardGraph, src2);
+  const distToDest = dijkstra(reverseGraph, dest);
+  let minWeight = Infinity;
+  for (let i = 0; i < n; i++) {
+    if (distFromSrc1[i] !== Infinity && distFromSrc2[i] !== Infinity
+        && distToDest[i] !== Infinity) {
+      minWeight = Math.min(minWeight, distFromSrc1[i] + distFromSrc2[i] + distToDest[i]);
+    }
+  }
+
+  return minWeight === Infinity ? -1 : minWeight;
+
+  function dijkstra(graph, start) {
+    const distances = new Array(n).fill(Infinity);
+    distances[start] = 0;
+    const pq = new PriorityQueue((a, b) => a[0] - b[0]);
+    pq.enqueue([0, start]);
+
+    while (!pq.isEmpty()) {
+      const [dist, node] = pq.dequeue();
+      if (dist > distances[node]) continue;
+
+      for (const [next, weight] of graph[node]) {
+        if (distances[next] > dist + weight) {
+          distances[next] = dist + weight;
+          pq.enqueue([distances[next], next]);
+        }
+      }
+    }
+
+    return distances;
+  }
+};

From be6e4c234d890321eb13a75cef0317f91e57cf8d Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 16 May 2025 00:10:44 -0500
Subject: [PATCH 107/571] Add solution #2207

---
 README.md                                     |  3 +-
 ...mize-number-of-subsequences-in-a-string.js | 41 +++++++++++++++++++
 2 files changed, 43 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2207-maximize-number-of-subsequences-in-a-string.js

diff --git a/README.md b/README.md
index 6561d0f7..7241c137 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,815 LeetCode solutions in JavaScript
+# 1,816 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1688,6 +1688,7 @@
 2202|[Maximize the Topmost Element After K Moves](./solutions/2202-maximize-the-topmost-element-after-k-moves.js)|Medium|
 2203|[Minimum Weighted Subgraph With the Required Paths](./solutions/2203-minimum-weighted-subgraph-with-the-required-paths.js)|Hard|
 2206|[Divide Array Into Equal Pairs](./solutions/2206-divide-array-into-equal-pairs.js)|Easy|
+2207|[Maximize Number of Subsequences in a String](./solutions/2207-maximize-number-of-subsequences-in-a-string.js)|Medium|
 2215|[Find the Difference of Two Arrays](./solutions/2215-find-the-difference-of-two-arrays.js)|Easy|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
 2235|[Add Two Integers](./solutions/2235-add-two-integers.js)|Easy|
diff --git a/solutions/2207-maximize-number-of-subsequences-in-a-string.js b/solutions/2207-maximize-number-of-subsequences-in-a-string.js
new file mode 100644
index 00000000..d7ad35a6
--- /dev/null
+++ b/solutions/2207-maximize-number-of-subsequences-in-a-string.js
@@ -0,0 +1,41 @@
+/**
+ * 2207. Maximize Number of Subsequences in a String
+ * https://leetcode.com/problems/maximize-number-of-subsequences-in-a-string/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed string text and another 0-indexed string pattern of length 2, both
+ * of which consist of only lowercase English letters.
+ *
+ * You can add either pattern[0] or pattern[1] anywhere in text exactly once. Note that the
+ * character can be added even at the beginning or at the end of text.
+ *
+ * Return the maximum number of times pattern can occur as a subsequence of the modified text.
+ *
+ * A subsequence is a string that can be derived from another string by deleting some or no
+ * characters without changing the order of the remaining characters.
+ */
+
+/**
+ * @param {string} text
+ * @param {string} pattern
+ * @return {number}
+ */
+var maximumSubsequenceCount = function(text, pattern) {
+  const firstChar = pattern[0];
+  const secondChar = pattern[1];
+  let firstCount = 0;
+  let secondCount = 0;
+  let subsequences = 0;
+
+  for (const char of text) {
+    if (char === secondChar) {
+      subsequences += firstCount;
+      secondCount++;
+    }
+    if (char === firstChar) {
+      firstCount++;
+    }
+  }
+
+  return subsequences + Math.max(firstCount, secondCount);
+};

From 384c94ef807a14f971c8f75818e7d74b1b106ac3 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 16 May 2025 00:12:24 -0500
Subject: [PATCH 108/571] Add solution #2209

---
 README.md                                     |  3 +-
 ...white-tiles-after-covering-with-carpets.js | 36 +++++++++++++++++++
 2 files changed, 38 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2209-minimum-white-tiles-after-covering-with-carpets.js

diff --git a/README.md b/README.md
index 7241c137..6977c275 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,816 LeetCode solutions in JavaScript
+# 1,817 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1689,6 +1689,7 @@
 2203|[Minimum Weighted Subgraph With the Required Paths](./solutions/2203-minimum-weighted-subgraph-with-the-required-paths.js)|Hard|
 2206|[Divide Array Into Equal Pairs](./solutions/2206-divide-array-into-equal-pairs.js)|Easy|
 2207|[Maximize Number of Subsequences in a String](./solutions/2207-maximize-number-of-subsequences-in-a-string.js)|Medium|
+2209|[Minimum White Tiles After Covering With Carpets](./solutions/2209-minimum-white-tiles-after-covering-with-carpets.js)|Hard|
 2215|[Find the Difference of Two Arrays](./solutions/2215-find-the-difference-of-two-arrays.js)|Easy|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
 2235|[Add Two Integers](./solutions/2235-add-two-integers.js)|Easy|
diff --git a/solutions/2209-minimum-white-tiles-after-covering-with-carpets.js b/solutions/2209-minimum-white-tiles-after-covering-with-carpets.js
new file mode 100644
index 00000000..08fb5fd3
--- /dev/null
+++ b/solutions/2209-minimum-white-tiles-after-covering-with-carpets.js
@@ -0,0 +1,36 @@
+/**
+ * 2209. Minimum White Tiles After Covering With Carpets
+ * https://leetcode.com/problems/minimum-white-tiles-after-covering-with-carpets/
+ * Difficulty: Hard
+ *
+ * You are given a 0-indexed binary string floor, which represents the colors of tiles on a floor:
+ * - floor[i] = '0' denotes that the ith tile of the floor is colored black.
+ * - On the other hand, floor[i] = '1' denotes that the ith tile of the floor is colored white.
+ *
+ * You are also given numCarpets and carpetLen. You have numCarpets black carpets, each of length
+ * carpetLen tiles. Cover the tiles with the given carpets such that the number of white tiles
+ * still visible is minimum. Carpets may overlap one another.
+ *
+ * Return the minimum number of white tiles still visible.
+ */
+
+/**
+ * @param {string} floor
+ * @param {number} numCarpets
+ * @param {number} carpetLen
+ * @return {number}
+ */
+var minimumWhiteTiles = function(floor, numCarpets, carpetLen) {
+  const n = floor.length;
+  const dp = Array.from({ length: n + 1 }, () => Array(numCarpets + 1).fill(0));
+
+  for (let i = 1; i <= n; i++) {
+    for (let j = 0; j <= numCarpets; j++) {
+      const skip = dp[i - 1][j] + (floor[i - 1] === '1' ? 1 : 0);
+      const cover = j > 0 ? dp[Math.max(0, i - carpetLen)][j - 1] : Infinity;
+      dp[i][j] = Math.min(skip, cover);
+    }
+  }
+
+  return dp[n][numCarpets];
+};

From 7e0d1888d7f17af82e7e3edfd6de73127b7bc3ac Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 16 May 2025 00:15:38 -0500
Subject: [PATCH 109/571] Add solution #2210

---
 README.md                                     |  3 +-
 ...210-count-hills-and-valleys-in-an-array.js | 38 +++++++++++++++++++
 2 files changed, 40 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2210-count-hills-and-valleys-in-an-array.js

diff --git a/README.md b/README.md
index 6977c275..d41df174 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,817 LeetCode solutions in JavaScript
+# 1,818 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1690,6 +1690,7 @@
 2206|[Divide Array Into Equal Pairs](./solutions/2206-divide-array-into-equal-pairs.js)|Easy|
 2207|[Maximize Number of Subsequences in a String](./solutions/2207-maximize-number-of-subsequences-in-a-string.js)|Medium|
 2209|[Minimum White Tiles After Covering With Carpets](./solutions/2209-minimum-white-tiles-after-covering-with-carpets.js)|Hard|
+2210|[Count Hills and Valleys in an Array](./solutions/2210-count-hills-and-valleys-in-an-array.js)|Easy|
 2215|[Find the Difference of Two Arrays](./solutions/2215-find-the-difference-of-two-arrays.js)|Easy|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
 2235|[Add Two Integers](./solutions/2235-add-two-integers.js)|Easy|
diff --git a/solutions/2210-count-hills-and-valleys-in-an-array.js b/solutions/2210-count-hills-and-valleys-in-an-array.js
new file mode 100644
index 00000000..388d78f5
--- /dev/null
+++ b/solutions/2210-count-hills-and-valleys-in-an-array.js
@@ -0,0 +1,38 @@
+/**
+ * 2210. Count Hills and Valleys in an Array
+ * https://leetcode.com/problems/count-hills-and-valleys-in-an-array/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed integer array nums. An index i is part of a hill in nums if the
+ * closest non-equal neighbors of i are smaller than nums[i]. Similarly, an index i is part
+ * of a valley in nums if the closest non-equal neighbors of i are larger than nums[i].
+ * Adjacent indices i and j are part of the same hill or valley if nums[i] == nums[j].
+ *
+ * Note that for an index to be part of a hill or valley, it must have a non-equal neighbor
+ * on both the left and right of the index.
+ *
+ * Return the number of hills and valleys in nums.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var countHillValley = function(nums) {
+  let count = 0;
+  let prev = nums[0];
+
+  for (let i = 1; i < nums.length - 1; i++) {
+    if (nums[i] === nums[i + 1]) continue;
+    const left = prev;
+    const right = nums[i + 1];
+
+    if ((nums[i] > left && nums[i] > right) || (nums[i] < left && nums[i] < right)) {
+      count++;
+    }
+
+    prev = nums[i];
+  }
+
+  return count;
+};

From eb0931e3aa0a9d2384299afcc2094a2dc5589810 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 16 May 2025 00:18:02 -0500
Subject: [PATCH 110/571] Add solution #2211

---
 README.md                                    |  3 +-
 solutions/2211-count-collisions-on-a-road.js | 41 ++++++++++++++++++++
 2 files changed, 43 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2211-count-collisions-on-a-road.js

diff --git a/README.md b/README.md
index d41df174..0f9c5eec 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,818 LeetCode solutions in JavaScript
+# 1,819 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1691,6 +1691,7 @@
 2207|[Maximize Number of Subsequences in a String](./solutions/2207-maximize-number-of-subsequences-in-a-string.js)|Medium|
 2209|[Minimum White Tiles After Covering With Carpets](./solutions/2209-minimum-white-tiles-after-covering-with-carpets.js)|Hard|
 2210|[Count Hills and Valleys in an Array](./solutions/2210-count-hills-and-valleys-in-an-array.js)|Easy|
+2211|[Count Collisions on a Road](./solutions/2211-count-collisions-on-a-road.js)|Medium|
 2215|[Find the Difference of Two Arrays](./solutions/2215-find-the-difference-of-two-arrays.js)|Easy|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
 2235|[Add Two Integers](./solutions/2235-add-two-integers.js)|Easy|
diff --git a/solutions/2211-count-collisions-on-a-road.js b/solutions/2211-count-collisions-on-a-road.js
new file mode 100644
index 00000000..acbd8920
--- /dev/null
+++ b/solutions/2211-count-collisions-on-a-road.js
@@ -0,0 +1,41 @@
+/**
+ * 2211. Count Collisions on a Road
+ * https://leetcode.com/problems/count-collisions-on-a-road/
+ * Difficulty: Medium
+ *
+ * There are n cars on an infinitely long road. The cars are numbered from 0 to n - 1 from left
+ * to right and each car is present at a unique point.
+ *
+ * You are given a 0-indexed string directions of length n. directions[i] can be either 'L', 'R',
+ * or 'S' denoting whether the ith car is moving towards the left, towards the right, or staying
+ * at its current point respectively. Each moving car has the same speed.
+ *
+ * The number of collisions can be calculated as follows:
+ * - When two cars moving in opposite directions collide with each other, the number of collisions
+ *   increases by 2.
+ * - When a moving car collides with a stationary car, the number of collisions increases by 1.
+ *
+ * After a collision, the cars involved can no longer move and will stay at the point where they
+ * collided. Other than that, cars cannot change their state or direction of motion.
+ *
+ * Return the total number of collisions that will happen on the road.
+ */
+
+/**
+ * @param {string} directions
+ * @return {number}
+ */
+var countCollisions = function(directions) {
+  let result = 0;
+  let left = 0;
+  let right = directions.length - 1;
+
+  while (left < directions.length && directions[left] === 'L') left++;
+  while (right >= 0 && directions[right] === 'R') right--;
+
+  for (let i = left; i <= right; i++) {
+    if (directions[i] !== 'S') result++;
+  }
+
+  return result;
+};

From f13299b081096c17e7528b6842a0d563924f6092 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 16 May 2025 00:24:28 -0500
Subject: [PATCH 111/571] Add solution #2212

---
 README.md                                     |  3 +-
 ...aximum-points-in-an-archery-competition.js | 60 +++++++++++++++++++
 2 files changed, 62 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2212-maximum-points-in-an-archery-competition.js

diff --git a/README.md b/README.md
index 0f9c5eec..bd19451b 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,819 LeetCode solutions in JavaScript
+# 1,820 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1692,6 +1692,7 @@
 2209|[Minimum White Tiles After Covering With Carpets](./solutions/2209-minimum-white-tiles-after-covering-with-carpets.js)|Hard|
 2210|[Count Hills and Valleys in an Array](./solutions/2210-count-hills-and-valleys-in-an-array.js)|Easy|
 2211|[Count Collisions on a Road](./solutions/2211-count-collisions-on-a-road.js)|Medium|
+2212|[Maximum Points in an Archery Competition](./solutions/2212-maximum-points-in-an-archery-competition.js)|Medium|
 2215|[Find the Difference of Two Arrays](./solutions/2215-find-the-difference-of-two-arrays.js)|Easy|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
 2235|[Add Two Integers](./solutions/2235-add-two-integers.js)|Easy|
diff --git a/solutions/2212-maximum-points-in-an-archery-competition.js b/solutions/2212-maximum-points-in-an-archery-competition.js
new file mode 100644
index 00000000..2c09fc29
--- /dev/null
+++ b/solutions/2212-maximum-points-in-an-archery-competition.js
@@ -0,0 +1,60 @@
+/**
+ * 2212. Maximum Points in an Archery Competition
+ * https://leetcode.com/problems/maximum-points-in-an-archery-competition/
+ * Difficulty: Medium
+ *
+ * Alice and Bob are opponents in an archery competition. The competition has set the
+ * following rules:
+ * 1. Alice first shoots numArrows arrows and then Bob shoots numArrows arrows.
+ * 2. The points are then calculated as follows:
+ *    1. The target has integer scoring sections ranging from 0 to 11 inclusive.
+ *    2. For each section of the target with score k (in between 0 to 11), say Alice and Bob have
+ *       shot ak and bk arrows on that section respectively. If ak >= bk, then Alice takes k points.
+ *       If ak < bk, then Bob takes k points.
+ *    3. However, if ak == bk == 0, then nobody takes k points.
+ * - For example, if Alice and Bob both shot 2 arrows on the section with score 11, then Alice takes
+ *   11 points. On the other hand, if Alice shot 0 arrows on the section with score 11 and Bob shot
+ *   2 arrows on that same section, then Bob takes 11 points.
+ *
+ * You are given the integer numArrows and an integer array aliceArrows of size 12, which represents
+ * the number of arrows Alice shot on each scoring section from 0 to 11. Now, Bob wants to maximize
+ * the total number of points he can obtain.
+ *
+ * Return the array bobArrows which represents the number of arrows Bob shot on each scoring section
+ * from 0 to 11. The sum of the values in bobArrows should equal numArrows.
+ *
+ * If there are multiple ways for Bob to earn the maximum total points, return any one of them.
+ */
+
+/**
+ * @param {number} numArrows
+ * @param {number[]} aliceArrows
+ * @return {number[]}
+ */
+var maximumBobPoints = function(numArrows, aliceArrows) {
+  let maxScore = 0;
+  let bestConfig = new Array(12).fill(0);
+
+  backtrack(1, numArrows, 0, new Array(12).fill(0));
+  return bestConfig;
+
+  function backtrack(index, arrowsLeft, score, config) {
+    if (index === 12 || arrowsLeft === 0) {
+      if (score > maxScore) {
+        maxScore = score;
+        bestConfig = [...config];
+        bestConfig[0] += arrowsLeft;
+      }
+      return;
+    }
+
+    const needed = aliceArrows[index] + 1;
+    if (arrowsLeft >= needed) {
+      config[index] = needed;
+      backtrack(index + 1, arrowsLeft - needed, score + index, config);
+      config[index] = 0;
+    }
+
+    backtrack(index + 1, arrowsLeft, score, config);
+  }
+};

From d040bfca27f7a0911b4d64e549ec36677f3e20ea Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 16 May 2025 23:09:39 -0500
Subject: [PATCH 112/571] Add solution #2216

---
 README.md                                     |  3 +-
 ...nimum-deletions-to-make-array-beautiful.js | 41 +++++++++++++++++++
 2 files changed, 43 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2216-minimum-deletions-to-make-array-beautiful.js

diff --git a/README.md b/README.md
index bd19451b..f041f740 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,820 LeetCode solutions in JavaScript
+# 1,821 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1694,6 +1694,7 @@
 2211|[Count Collisions on a Road](./solutions/2211-count-collisions-on-a-road.js)|Medium|
 2212|[Maximum Points in an Archery Competition](./solutions/2212-maximum-points-in-an-archery-competition.js)|Medium|
 2215|[Find the Difference of Two Arrays](./solutions/2215-find-the-difference-of-two-arrays.js)|Easy|
+2216|[Minimum Deletions to Make Array Beautiful](./solutions/2216-minimum-deletions-to-make-array-beautiful.js)|Medium|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
 2235|[Add Two Integers](./solutions/2235-add-two-integers.js)|Easy|
 2244|[Minimum Rounds to Complete All Tasks](./solutions/2244-minimum-rounds-to-complete-all-tasks.js)|Medium|
diff --git a/solutions/2216-minimum-deletions-to-make-array-beautiful.js b/solutions/2216-minimum-deletions-to-make-array-beautiful.js
new file mode 100644
index 00000000..7cb1012e
--- /dev/null
+++ b/solutions/2216-minimum-deletions-to-make-array-beautiful.js
@@ -0,0 +1,41 @@
+/**
+ * 2216. Minimum Deletions to Make Array Beautiful
+ * https://leetcode.com/problems/minimum-deletions-to-make-array-beautiful/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed integer array nums. The array nums is beautiful if:
+ * - nums.length is even.
+ * - nums[i] != nums[i + 1] for all i % 2 == 0.
+ *
+ * Note that an empty array is considered beautiful.
+ *
+ * You can delete any number of elements from nums. When you delete an element, all the elements
+ * to the right of the deleted element will be shifted one unit to the left to fill the gap
+ * created and all the elements to the left of the deleted element will remain unchanged.
+ *
+ * Return the minimum number of elements to delete from nums to make it beautiful.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var minDeletion = function(nums) {
+  let result = 0;
+  let i = 0;
+
+  while (i < nums.length - 1) {
+    if (nums[i] === nums[i + 1]) {
+      result++;
+      i++;
+    } else {
+      i += 2;
+    }
+  }
+
+  if ((nums.length - result) % 2 !== 0) {
+    result++;
+  }
+
+  return result;
+};

From 5837760a2dab5ce812b674fc68bcdd242eacfebb Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 16 May 2025 23:10:54 -0500
Subject: [PATCH 113/571] Add solution #2217

---
 README.md                                     |  3 +-
 .../2217-find-palindrome-with-fixed-length.js | 40 +++++++++++++++++++
 2 files changed, 42 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2217-find-palindrome-with-fixed-length.js

diff --git a/README.md b/README.md
index f041f740..6ed8de14 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,821 LeetCode solutions in JavaScript
+# 1,822 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1695,6 +1695,7 @@
 2212|[Maximum Points in an Archery Competition](./solutions/2212-maximum-points-in-an-archery-competition.js)|Medium|
 2215|[Find the Difference of Two Arrays](./solutions/2215-find-the-difference-of-two-arrays.js)|Easy|
 2216|[Minimum Deletions to Make Array Beautiful](./solutions/2216-minimum-deletions-to-make-array-beautiful.js)|Medium|
+2217|[Find Palindrome With Fixed Length](./solutions/2217-find-palindrome-with-fixed-length.js)|Medium|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
 2235|[Add Two Integers](./solutions/2235-add-two-integers.js)|Easy|
 2244|[Minimum Rounds to Complete All Tasks](./solutions/2244-minimum-rounds-to-complete-all-tasks.js)|Medium|
diff --git a/solutions/2217-find-palindrome-with-fixed-length.js b/solutions/2217-find-palindrome-with-fixed-length.js
new file mode 100644
index 00000000..4e6a83aa
--- /dev/null
+++ b/solutions/2217-find-palindrome-with-fixed-length.js
@@ -0,0 +1,40 @@
+/**
+ * 2217. Find Palindrome With Fixed Length
+ * https://leetcode.com/problems/find-palindrome-with-fixed-length/
+ * Difficulty: Medium
+ *
+ * Given an integer array queries and a positive integer intLength, return an array answer where
+ * answer[i] is either the queries[i]th smallest positive palindrome of length intLength or -1
+ * if no such palindrome exists.
+ *
+ * A palindrome is a number that reads the same backwards and forwards. Palindromes cannot have
+ * leading zeros.
+ */
+
+/**
+ * @param {number[]} queries
+ * @param {number} intLength
+ * @return {number[]}
+ */
+var kthPalindrome = function(queries, intLength) {
+  const halfLength = Math.ceil(intLength / 2);
+  const maxPalindromes = Math.pow(10, halfLength - 1) * 9;
+
+  return queries.map(generatePalindrome);
+
+  function generatePalindrome(query) {
+    if (query > maxPalindromes) return -1;
+
+    let firstHalf = Math.pow(10, halfLength - 1) + query - 1;
+    let result = firstHalf;
+
+    if (intLength % 2 === 1) firstHalf = Math.floor(firstHalf / 10);
+
+    while (firstHalf > 0) {
+      result = result * 10 + (firstHalf % 10);
+      firstHalf = Math.floor(firstHalf / 10);
+    }
+
+    return result;
+  }
+};

From 45b4d9b9e9722145ec1c969e29f678e16ba67fa0 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 16 May 2025 23:12:25 -0500
Subject: [PATCH 114/571] Add solution #2220

---
 README.md                                     |  3 ++-
 ...220-minimum-bit-flips-to-convert-number.js | 24 +++++++++++++++++++
 2 files changed, 26 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2220-minimum-bit-flips-to-convert-number.js

diff --git a/README.md b/README.md
index 6ed8de14..e2bb94a2 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,822 LeetCode solutions in JavaScript
+# 1,823 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1696,6 +1696,7 @@
 2215|[Find the Difference of Two Arrays](./solutions/2215-find-the-difference-of-two-arrays.js)|Easy|
 2216|[Minimum Deletions to Make Array Beautiful](./solutions/2216-minimum-deletions-to-make-array-beautiful.js)|Medium|
 2217|[Find Palindrome With Fixed Length](./solutions/2217-find-palindrome-with-fixed-length.js)|Medium|
+2220|[Minimum Bit Flips to Convert Number](./solutions/2220-minimum-bit-flips-to-convert-number.js)|Easy|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
 2235|[Add Two Integers](./solutions/2235-add-two-integers.js)|Easy|
 2244|[Minimum Rounds to Complete All Tasks](./solutions/2244-minimum-rounds-to-complete-all-tasks.js)|Medium|
diff --git a/solutions/2220-minimum-bit-flips-to-convert-number.js b/solutions/2220-minimum-bit-flips-to-convert-number.js
new file mode 100644
index 00000000..28e0a9da
--- /dev/null
+++ b/solutions/2220-minimum-bit-flips-to-convert-number.js
@@ -0,0 +1,24 @@
+/**
+ * 2220. Minimum Bit Flips to Convert Number
+ * https://leetcode.com/problems/minimum-bit-flips-to-convert-number/
+ * Difficulty: Easy
+ *
+ * A bit flip of a number x is choosing a bit in the binary representation of x and flipping it
+ * from either 0 to 1 or 1 to 0.
+ * - For example, for x = 7, the binary representation is 111 and we may choose any bit (including
+ *   any leading zeros not shown) and flip it. We can flip the first bit from the right to get 110,
+ *   flip the second bit from the right to get 101, flip the fifth bit from the right (a leading
+ *   zero) to get 10111, etc.
+ *
+ * Given two integers start and goal, return the minimum number of bit flips to convert start to
+ * goal.
+ */
+
+/**
+ * @param {number} start
+ * @param {number} goal
+ * @return {number}
+ */
+var minBitFlips = function(start, goal) {
+  return (start ^ goal).toString(2).replace(/0+/g, '').length;
+};

From 5c800196a28732ea501e682b21b45f6f04e6b1cb Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 16 May 2025 23:14:58 -0500
Subject: [PATCH 115/571] Add solution #2221

---
 README.md                                     |  3 +-
 .../2221-find-triangular-sum-of-an-array.js   | 34 +++++++++++++++++++
 2 files changed, 36 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2221-find-triangular-sum-of-an-array.js

diff --git a/README.md b/README.md
index e2bb94a2..d0689dd0 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,823 LeetCode solutions in JavaScript
+# 1,824 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1697,6 +1697,7 @@
 2216|[Minimum Deletions to Make Array Beautiful](./solutions/2216-minimum-deletions-to-make-array-beautiful.js)|Medium|
 2217|[Find Palindrome With Fixed Length](./solutions/2217-find-palindrome-with-fixed-length.js)|Medium|
 2220|[Minimum Bit Flips to Convert Number](./solutions/2220-minimum-bit-flips-to-convert-number.js)|Easy|
+2221|[Find Triangular Sum of an Array](./solutions/2221-find-triangular-sum-of-an-array.js)|Medium|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
 2235|[Add Two Integers](./solutions/2235-add-two-integers.js)|Easy|
 2244|[Minimum Rounds to Complete All Tasks](./solutions/2244-minimum-rounds-to-complete-all-tasks.js)|Medium|
diff --git a/solutions/2221-find-triangular-sum-of-an-array.js b/solutions/2221-find-triangular-sum-of-an-array.js
new file mode 100644
index 00000000..3ef02fcd
--- /dev/null
+++ b/solutions/2221-find-triangular-sum-of-an-array.js
@@ -0,0 +1,34 @@
+/**
+ * 2221. Find Triangular Sum of an Array
+ * https://leetcode.com/problems/find-triangular-sum-of-an-array/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed integer array nums, where nums[i] is a digit between 0 and
+ * 9 (inclusive).
+ *
+ * The triangular sum of nums is the value of the only element present in nums after the
+ * following process terminates:
+ * 1. Let nums comprise of n elements. If n == 1, end the process. Otherwise, create a new
+ *    0-indexed integer array newNums of length n - 1.
+ * 2. For each index i, where 0 <= i < n - 1, assign the value of newNums[i] as
+ *    (nums[i] + nums[i+1]) % 10, where % denotes modulo operator.
+ * 3. Replace the array nums with newNums.
+ * 4. Repeat the entire process starting from step 1.
+ *
+ * Return the triangular sum of nums.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var triangularSum = function(nums) {
+  while (nums.length > 1) {
+    const updated = [];
+    for (let i = 0; i < nums.length - 1; i++) {
+      updated.push((nums[i] + nums[i + 1]) % 10);
+    }
+    nums = updated;
+  }
+  return nums[0];
+};

From 70f51e562d9a2142a840d385b650692f9ef56fc8 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 16 May 2025 23:24:27 -0500
Subject: [PATCH 116/571] Add solution #2222

---
 README.md                                     |  3 +-
 ...2222-number-of-ways-to-select-buildings.js | 49 +++++++++++++++++++
 2 files changed, 51 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2222-number-of-ways-to-select-buildings.js

diff --git a/README.md b/README.md
index d0689dd0..eae091b2 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,824 LeetCode solutions in JavaScript
+# 1,825 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1698,6 +1698,7 @@
 2217|[Find Palindrome With Fixed Length](./solutions/2217-find-palindrome-with-fixed-length.js)|Medium|
 2220|[Minimum Bit Flips to Convert Number](./solutions/2220-minimum-bit-flips-to-convert-number.js)|Easy|
 2221|[Find Triangular Sum of an Array](./solutions/2221-find-triangular-sum-of-an-array.js)|Medium|
+2222|[Number of Ways to Select Buildings](./solutions/2222-number-of-ways-to-select-buildings.js)|Medium|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
 2235|[Add Two Integers](./solutions/2235-add-two-integers.js)|Easy|
 2244|[Minimum Rounds to Complete All Tasks](./solutions/2244-minimum-rounds-to-complete-all-tasks.js)|Medium|
diff --git a/solutions/2222-number-of-ways-to-select-buildings.js b/solutions/2222-number-of-ways-to-select-buildings.js
new file mode 100644
index 00000000..012573fc
--- /dev/null
+++ b/solutions/2222-number-of-ways-to-select-buildings.js
@@ -0,0 +1,49 @@
+/**
+ * 2222. Number of Ways to Select Buildings
+ * https://leetcode.com/problems/number-of-ways-to-select-buildings/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed binary string s which represents the types of buildings along
+ * a street where:
+ * - s[i] = '0' denotes that the ith building is an office and
+ * - s[i] = '1' denotes that the ith building is a restaurant.
+ *
+ * As a city official, you would like to select 3 buildings for random inspection. However, to
+ * ensure variety, no two consecutive buildings out of the selected buildings can be of the same
+ * type.
+ * - For example, given s = "001101", we cannot select the 1st, 3rd, and 5th buildings as that
+ *   would form "011" which is not allowed due to having two consecutive buildings of the same type.
+ *
+ * Return the number of valid ways to select 3 buildings.
+ */
+
+/**
+ * @param {string} s
+ * @return {number}
+ */
+var numberOfWays = function(s) {
+  const prefixCounts = [[0, 0]];
+  let zeros = 0;
+  let ones = 0;
+
+  for (const char of s) {
+    if (char === '0') zeros++;
+    else ones++;
+    prefixCounts.push([zeros, ones]);
+  }
+
+  let result = 0;
+  for (let i = 1; i < s.length - 1; i++) {
+    if (s[i] === '0') {
+      const leftOnes = prefixCounts[i][1];
+      const rightOnes = prefixCounts[s.length][1] - prefixCounts[i + 1][1];
+      result += leftOnes * rightOnes;
+    } else {
+      const leftZeros = prefixCounts[i][0];
+      const rightZeros = prefixCounts[s.length][0] - prefixCounts[i + 1][0];
+      result += leftZeros * rightZeros;
+    }
+  }
+
+  return result;
+};

From 48158321fcf6ea6dd282ea677eaa1f0e6b42b963 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 00:00:53 -0500
Subject: [PATCH 117/571] Add solution #2213

---
 README.md                                     |   3 +-
 ...st-substring-of-one-repeating-character.js | 117 ++++++++++++++++++
 2 files changed, 119 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2213-longest-substring-of-one-repeating-character.js

diff --git a/README.md b/README.md
index eae091b2..16f055ae 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,825 LeetCode solutions in JavaScript
+# 1,826 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1693,6 +1693,7 @@
 2210|[Count Hills and Valleys in an Array](./solutions/2210-count-hills-and-valleys-in-an-array.js)|Easy|
 2211|[Count Collisions on a Road](./solutions/2211-count-collisions-on-a-road.js)|Medium|
 2212|[Maximum Points in an Archery Competition](./solutions/2212-maximum-points-in-an-archery-competition.js)|Medium|
+2213|[Longest Substring of One Repeating Character](./solutions/2213-longest-substring-of-one-repeating-character.js)|Hard|
 2215|[Find the Difference of Two Arrays](./solutions/2215-find-the-difference-of-two-arrays.js)|Easy|
 2216|[Minimum Deletions to Make Array Beautiful](./solutions/2216-minimum-deletions-to-make-array-beautiful.js)|Medium|
 2217|[Find Palindrome With Fixed Length](./solutions/2217-find-palindrome-with-fixed-length.js)|Medium|
diff --git a/solutions/2213-longest-substring-of-one-repeating-character.js b/solutions/2213-longest-substring-of-one-repeating-character.js
new file mode 100644
index 00000000..ca5e006d
--- /dev/null
+++ b/solutions/2213-longest-substring-of-one-repeating-character.js
@@ -0,0 +1,117 @@
+/**
+ * 2213. Longest Substring of One Repeating Character
+ * https://leetcode.com/problems/longest-substring-of-one-repeating-character/
+ * Difficulty: Hard
+ *
+ * You are given a 0-indexed string s. You are also given a 0-indexed string queryCharacters of
+ * length k and a 0-indexed array of integer indices queryIndices of length k, both of which are
+ * used to describe k queries.
+ *
+ * The ith query updates the character in s at index queryIndices[i] to the character
+ * queryCharacters[i].
+ *
+ * Return an array lengths of length k where lengths[i] is the length of the longest substring of
+ * s consisting of only one repeating character after the ith query is performed.
+ */
+
+/**
+* @param {string} s
+* @param {string} queryCharacters
+* @param {number[]} queryIndices
+* @return {number[]}
+*/
+var longestRepeating = function(s, queryCharacters, queryIndices) {
+  const chars = s.split('');
+  const n = chars.length;
+  const k = queryIndices.length;
+  const result = [];
+
+  class Node {
+    constructor() {
+      this.left = 0;
+      this.right = 0;
+      this.max = 0;
+      this.total = 0;
+    }
+  }
+
+  const tree = new Array(4 * n);
+  for (let i = 0; i < 4 * n; i++) {
+    tree[i] = new Node();
+  }
+
+  function buildTree(node, start, end) {
+    if (start === end) {
+      tree[node].left = 1;
+      tree[node].right = 1;
+      tree[node].max = 1;
+      tree[node].total = 1;
+      return;
+    }
+
+    const mid = Math.floor((start + end) / 2);
+    buildTree(2 * node, start, mid);
+    buildTree(2 * node + 1, mid + 1, end);
+
+    updateNode(node, start, end);
+  }
+
+  function updateNode(node, start, end) {
+    const leftChild = 2 * node;
+    const rightChild = 2 * node + 1;
+    const mid = Math.floor((start + end) / 2);
+
+    tree[node].total = tree[leftChild].total + tree[rightChild].total;
+
+    if (tree[leftChild].total === tree[leftChild].left
+        && mid + 1 <= end && chars[mid] === chars[mid + 1]) {
+      tree[node].left = tree[leftChild].total + tree[rightChild].left;
+    } else {
+      tree[node].left = tree[leftChild].left;
+    }
+
+    if (tree[rightChild].total === tree[rightChild].right
+        && mid >= start && chars[mid] === chars[mid + 1]) {
+      tree[node].right = tree[rightChild].total + tree[leftChild].right;
+    } else {
+      tree[node].right = tree[rightChild].right;
+    }
+
+    tree[node].max = Math.max(tree[leftChild].max, tree[rightChild].max);
+
+    if (mid >= start && mid + 1 <= end && chars[mid] === chars[mid + 1]) {
+      tree[node].max = Math.max(tree[node].max,
+        tree[leftChild].right + tree[rightChild].left);
+    }
+  }
+
+  function update(node, start, end, index) {
+    if (index < start || index > end) {
+      return;
+    }
+
+    if (start === end) {
+      return;
+    }
+
+    const mid = Math.floor((start + end) / 2);
+    update(2 * node, start, mid, index);
+    update(2 * node + 1, mid + 1, end, index);
+
+    updateNode(node, start, end);
+  }
+
+  buildTree(1, 0, n - 1);
+
+  for (let q = 0; q < k; q++) {
+    const index = queryIndices[q];
+    const newChar = queryCharacters[q];
+
+    chars[index] = newChar;
+    update(1, 0, n - 1, index);
+
+    result.push(tree[1].max);
+  }
+
+  return result;
+};

From 4da99ca4bdfeba473c8fb40c5db07a12fd0bc858 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 00:02:35 -0500
Subject: [PATCH 118/571] Add solution #2218

---
 README.md                                     |  3 +-
 ...218-maximum-value-of-k-coins-from-piles.js | 44 +++++++++++++++++++
 2 files changed, 46 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2218-maximum-value-of-k-coins-from-piles.js

diff --git a/README.md b/README.md
index 16f055ae..2ba4402d 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,826 LeetCode solutions in JavaScript
+# 1,827 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1697,6 +1697,7 @@
 2215|[Find the Difference of Two Arrays](./solutions/2215-find-the-difference-of-two-arrays.js)|Easy|
 2216|[Minimum Deletions to Make Array Beautiful](./solutions/2216-minimum-deletions-to-make-array-beautiful.js)|Medium|
 2217|[Find Palindrome With Fixed Length](./solutions/2217-find-palindrome-with-fixed-length.js)|Medium|
+2218|[Maximum Value of K Coins From Piles](./solutions/2218-maximum-value-of-k-coins-from-piles.js)|Hard|
 2220|[Minimum Bit Flips to Convert Number](./solutions/2220-minimum-bit-flips-to-convert-number.js)|Easy|
 2221|[Find Triangular Sum of an Array](./solutions/2221-find-triangular-sum-of-an-array.js)|Medium|
 2222|[Number of Ways to Select Buildings](./solutions/2222-number-of-ways-to-select-buildings.js)|Medium|
diff --git a/solutions/2218-maximum-value-of-k-coins-from-piles.js b/solutions/2218-maximum-value-of-k-coins-from-piles.js
new file mode 100644
index 00000000..743b4b17
--- /dev/null
+++ b/solutions/2218-maximum-value-of-k-coins-from-piles.js
@@ -0,0 +1,44 @@
+/**
+ * 2218. Maximum Value of K Coins From Piles
+ * https://leetcode.com/problems/maximum-value-of-k-coins-from-piles/
+ * Difficulty: Hard
+ *
+ * There are n piles of coins on a table. Each pile consists of a positive number of coins of
+ * assorted denominations.
+ *
+ * In one move, you can choose any coin on top of any pile, remove it, and add it to your wallet.
+ *
+ * Given a list piles, where piles[i] is a list of integers denoting the composition of the ith
+ * pile from top to bottom, and a positive integer k, return the maximum total value of coins
+ * you can have in your wallet if you choose exactly k coins optimally.
+ */
+
+/**
+ * @param {number[][]} piles
+ * @param {number} k
+ * @return {number}
+ */
+var maxValueOfCoins = function(piles, k) {
+  const n = piles.length;
+  const dp = Array.from({ length: n + 1 }, () => new Array(k + 1).fill(-1));
+
+  return maximize(0, k);
+
+  function maximize(pileIndex, remainingCoins) {
+    if (pileIndex === n || remainingCoins === 0) return 0;
+    if (dp[pileIndex][remainingCoins] !== -1) return dp[pileIndex][remainingCoins];
+
+    let maxValue = maximize(pileIndex + 1, remainingCoins);
+    let currentSum = 0;
+
+    for (let i = 0; i < Math.min(piles[pileIndex].length, remainingCoins); i++) {
+      currentSum += piles[pileIndex][i];
+      maxValue = Math.max(
+        maxValue,
+        currentSum + maximize(pileIndex + 1, remainingCoins - (i + 1))
+      );
+    }
+
+    return dp[pileIndex][remainingCoins] = maxValue;
+  }
+};

From ffe662bacd579d1a625241a1e5af57960289f7f8 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 00:03:32 -0500
Subject: [PATCH 119/571] Add solution #2223

---
 README.md                                     |  3 +-
 .../2223-sum-of-scores-of-built-strings.js    | 40 +++++++++++++++++++
 2 files changed, 42 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2223-sum-of-scores-of-built-strings.js

diff --git a/README.md b/README.md
index 2ba4402d..8c5449be 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,827 LeetCode solutions in JavaScript
+# 1,828 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1701,6 +1701,7 @@
 2220|[Minimum Bit Flips to Convert Number](./solutions/2220-minimum-bit-flips-to-convert-number.js)|Easy|
 2221|[Find Triangular Sum of an Array](./solutions/2221-find-triangular-sum-of-an-array.js)|Medium|
 2222|[Number of Ways to Select Buildings](./solutions/2222-number-of-ways-to-select-buildings.js)|Medium|
+2223|[Sum of Scores of Built Strings](./solutions/2223-sum-of-scores-of-built-strings.js)|Hard|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
 2235|[Add Two Integers](./solutions/2235-add-two-integers.js)|Easy|
 2244|[Minimum Rounds to Complete All Tasks](./solutions/2244-minimum-rounds-to-complete-all-tasks.js)|Medium|
diff --git a/solutions/2223-sum-of-scores-of-built-strings.js b/solutions/2223-sum-of-scores-of-built-strings.js
new file mode 100644
index 00000000..4b5110cc
--- /dev/null
+++ b/solutions/2223-sum-of-scores-of-built-strings.js
@@ -0,0 +1,40 @@
+/**
+ * 2223. Sum of Scores of Built Strings
+ * https://leetcode.com/problems/sum-of-scores-of-built-strings/
+ * Difficulty: Hard
+ *
+ * You are building a string s of length n one character at a time, prepending each new character
+ * to the front of the string. The strings are labeled from 1 to n, where the string with length
+ * i is labeled si.
+ * - For example, for s = "abaca", s1 == "a", s2 == "ca", s3 == "aca", etc.
+ *
+ * The score of si is the length of the longest common prefix between si and sn (Note that s == sn).
+ *
+ * Given the final string s, return the sum of the score of every si.
+ */
+
+/**
+ * @param {string} s
+ * @return {number}
+ */
+var sumScores = function(s) {
+  const n = s.length;
+  const z = new Array(n).fill(0);
+  let left = 0;
+  let right = 0;
+
+  for (let i = 1; i < n; i++) {
+    if (i <= right) {
+      z[i] = Math.min(right - i + 1, z[i - left]);
+    }
+    while (i + z[i] < n && s[z[i]] === s[i + z[i]]) {
+      z[i]++;
+    }
+    if (i + z[i] - 1 > right) {
+      left = i;
+      right = i + z[i] - 1;
+    }
+  }
+
+  return z.reduce((sum, val) => sum + val, n);
+};

From 9f6dfdb0685caf754c2a6842b7595b4011e7f96c Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 00:04:36 -0500
Subject: [PATCH 120/571] Add solution #2224

---
 README.md                                     |  3 +-
 ...um-number-of-operations-to-convert-time.js | 38 +++++++++++++++++++
 2 files changed, 40 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2224-minimum-number-of-operations-to-convert-time.js

diff --git a/README.md b/README.md
index 8c5449be..346a23a7 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,828 LeetCode solutions in JavaScript
+# 1,829 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1702,6 +1702,7 @@
 2221|[Find Triangular Sum of an Array](./solutions/2221-find-triangular-sum-of-an-array.js)|Medium|
 2222|[Number of Ways to Select Buildings](./solutions/2222-number-of-ways-to-select-buildings.js)|Medium|
 2223|[Sum of Scores of Built Strings](./solutions/2223-sum-of-scores-of-built-strings.js)|Hard|
+2224|[Minimum Number of Operations to Convert Time](./solutions/2224-minimum-number-of-operations-to-convert-time.js)|Easy|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
 2235|[Add Two Integers](./solutions/2235-add-two-integers.js)|Easy|
 2244|[Minimum Rounds to Complete All Tasks](./solutions/2244-minimum-rounds-to-complete-all-tasks.js)|Medium|
diff --git a/solutions/2224-minimum-number-of-operations-to-convert-time.js b/solutions/2224-minimum-number-of-operations-to-convert-time.js
new file mode 100644
index 00000000..95b7a154
--- /dev/null
+++ b/solutions/2224-minimum-number-of-operations-to-convert-time.js
@@ -0,0 +1,38 @@
+/**
+ * 2224. Minimum Number of Operations to Convert Time
+ * https://leetcode.com/problems/minimum-number-of-operations-to-convert-time/
+ * Difficulty: Easy
+ *
+ * You are given two strings current and correct representing two 24-hour times.
+ *
+ * 24-hour times are formatted as "HH:MM", where HH is between 00 and 23, and MM is between 00
+ * and 59. The earliest 24-hour time is 00:00, and the latest is 23:59.
+ *
+ * In one operation you can increase the time current by 1, 5, 15, or 60 minutes. You can perform
+ * this operation any number of times.
+ *
+ * Return the minimum number of operations needed to convert current to correct.
+ */
+
+/**
+ * @param {string} current
+ * @param {string} correct
+ * @return {number}
+ */
+var convertTime = function(current, correct) {
+  const toMinutes = time => {
+    const [hours, minutes] = time.split(':').map(Number);
+    return hours * 60 + minutes;
+  };
+
+  let diff = toMinutes(correct) - toMinutes(current);
+  const increments = [60, 15, 5, 1];
+  let result = 0;
+
+  for (const increment of increments) {
+    result += Math.floor(diff / increment);
+    diff %= increment;
+  }
+
+  return result;
+};

From 827f641554ceb42ba47968f715559d964b7eeedc Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 00:05:40 -0500
Subject: [PATCH 121/571] Add solution #2225

---
 README.md                                     |  3 +-
 ...25-find-players-with-zero-or-one-losses.js | 44 +++++++++++++++++++
 2 files changed, 46 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2225-find-players-with-zero-or-one-losses.js

diff --git a/README.md b/README.md
index 346a23a7..7fa4a5fb 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,829 LeetCode solutions in JavaScript
+# 1,830 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1703,6 +1703,7 @@
 2222|[Number of Ways to Select Buildings](./solutions/2222-number-of-ways-to-select-buildings.js)|Medium|
 2223|[Sum of Scores of Built Strings](./solutions/2223-sum-of-scores-of-built-strings.js)|Hard|
 2224|[Minimum Number of Operations to Convert Time](./solutions/2224-minimum-number-of-operations-to-convert-time.js)|Easy|
+2225|[Find Players With Zero or One Losses](./solutions/2225-find-players-with-zero-or-one-losses.js)|Medium|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
 2235|[Add Two Integers](./solutions/2235-add-two-integers.js)|Easy|
 2244|[Minimum Rounds to Complete All Tasks](./solutions/2244-minimum-rounds-to-complete-all-tasks.js)|Medium|
diff --git a/solutions/2225-find-players-with-zero-or-one-losses.js b/solutions/2225-find-players-with-zero-or-one-losses.js
new file mode 100644
index 00000000..3182523e
--- /dev/null
+++ b/solutions/2225-find-players-with-zero-or-one-losses.js
@@ -0,0 +1,44 @@
+/**
+ * 2225. Find Players With Zero or One Losses
+ * https://leetcode.com/problems/find-players-with-zero-or-one-losses/
+ * Difficulty: Medium
+ *
+ * You are given an integer array matches where matches[i] = [winneri, loseri] indicates that
+ * the player winneri defeated player loseri in a match.
+ *
+ * Return a list answer of size 2 where:
+ * - answer[0] is a list of all players that have not lost any matches.
+ * - answer[1] is a list of all players that have lost exactly one match.
+ *
+ * The values in the two lists should be returned in increasing order.
+ *
+ * Note:
+ * - You should only consider the players that have played at least one match.
+ * - The testcases will be generated such that no two matches will have the same outcome.
+ */
+
+/**
+ * @param {number[][]} matches
+ * @return {number[][]}
+ */
+var findWinners = function(matches) {
+  const lossCount = new Map();
+
+  for (const [winner, loser] of matches) {
+    lossCount.set(winner, lossCount.get(winner) || 0);
+    lossCount.set(loser, (lossCount.get(loser) || 0) + 1);
+  }
+
+  const noLosses = [];
+  const oneLoss = [];
+
+  for (const [player, losses] of lossCount) {
+    if (losses === 0) noLosses.push(player);
+    else if (losses === 1) oneLoss.push(player);
+  }
+
+  return [
+    noLosses.sort((a, b) => a - b),
+    oneLoss.sort((a, b) => a - b)
+  ];
+};

From 9288c10e0b81a1bc3413d3545cc4c8d09d9b80e9 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 00:15:37 -0500
Subject: [PATCH 122/571] Add solution #2232

---
 README.md                                     |  3 +-
 ...ult-by-adding-parentheses-to-expression.js | 50 +++++++++++++++++++
 2 files changed, 52 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2232-minimize-result-by-adding-parentheses-to-expression.js

diff --git a/README.md b/README.md
index 7fa4a5fb..c81a32a0 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,830 LeetCode solutions in JavaScript
+# 1,831 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1705,6 +1705,7 @@
 2224|[Minimum Number of Operations to Convert Time](./solutions/2224-minimum-number-of-operations-to-convert-time.js)|Easy|
 2225|[Find Players With Zero or One Losses](./solutions/2225-find-players-with-zero-or-one-losses.js)|Medium|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
+2232|[Minimize Result by Adding Parentheses to Expression](./solutions/2232-minimize-result-by-adding-parentheses-to-expression.js)|Medium|
 2235|[Add Two Integers](./solutions/2235-add-two-integers.js)|Easy|
 2244|[Minimum Rounds to Complete All Tasks](./solutions/2244-minimum-rounds-to-complete-all-tasks.js)|Medium|
 2270|[Number of Ways to Split Array](./solutions/2270-number-of-ways-to-split-array.js)|Medium|
diff --git a/solutions/2232-minimize-result-by-adding-parentheses-to-expression.js b/solutions/2232-minimize-result-by-adding-parentheses-to-expression.js
new file mode 100644
index 00000000..f32f3fd9
--- /dev/null
+++ b/solutions/2232-minimize-result-by-adding-parentheses-to-expression.js
@@ -0,0 +1,50 @@
+/**
+ * 2232. Minimize Result by Adding Parentheses to Expression
+ * https://leetcode.com/problems/minimize-result-by-adding-parentheses-to-expression/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed string expression of the form "+" where 
+ * and  represent positive integers.
+ *
+ * Add a pair of parentheses to expression such that after the addition of parentheses,
+ * expression is a valid mathematical expression and evaluates to the smallest possible
+ * value. The left parenthesis must be added to the left of '+' and the right parenthesis
+ * must be added to the right of '+'.
+ *
+ * Return expression after adding a pair of parentheses such that expression evaluates to the
+ * smallest possible value. If there are multiple answers that yield the same result, return
+ * any of them.
+ *
+ * The input has been generated such that the original value of expression, and the value of
+ * expression after adding any pair of parentheses that meets the requirements fits within
+ * a signed 32-bit integer.
+ */
+
+/**
+ * @param {string} expression
+ * @return {string}
+ */
+var minimizeResult = function(expression) {
+  const plusIndex = expression.indexOf('+');
+  const left = expression.slice(0, plusIndex);
+  const right = expression.slice(plusIndex + 1);
+  let minValue = Infinity;
+  let result = '';
+
+  for (let i = 0; i < left.length; i++) {
+    for (let j = 1; j <= right.length; j++) {
+      const leftPrefix = i === 0 ? 1 : parseInt(left.slice(0, i));
+      const leftNum = parseInt(left.slice(i), 10);
+      const rightNum = parseInt(right.slice(0, j), 10);
+      const rightSuffix = j === right.length ? 1 : parseInt(right.slice(j), 10);
+      const value = leftPrefix * (leftNum + rightNum) * rightSuffix;
+
+      if (value < minValue) {
+        minValue = value;
+        result = `${left.slice(0, i)}(${left.slice(i)}+${right.slice(0, j)})${right.slice(j)}`;
+      }
+    }
+  }
+
+  return result;
+};

From 6d1e53ec22343f0d52d73a2c2196e6b986a23ccb Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 00:18:26 -0500
Subject: [PATCH 123/571] Add solution #2236

---
 README.md                                     |  3 ++-
 solutions/2236-root-equals-sum-of-children.js | 27 +++++++++++++++++++
 2 files changed, 29 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2236-root-equals-sum-of-children.js

diff --git a/README.md b/README.md
index c81a32a0..f11f6ee7 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,831 LeetCode solutions in JavaScript
+# 1,832 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1707,6 +1707,7 @@
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
 2232|[Minimize Result by Adding Parentheses to Expression](./solutions/2232-minimize-result-by-adding-parentheses-to-expression.js)|Medium|
 2235|[Add Two Integers](./solutions/2235-add-two-integers.js)|Easy|
+2236|[Root Equals Sum of Children](./solutions/2236-root-equals-sum-of-children.js)|Easy|
 2244|[Minimum Rounds to Complete All Tasks](./solutions/2244-minimum-rounds-to-complete-all-tasks.js)|Medium|
 2270|[Number of Ways to Split Array](./solutions/2270-number-of-ways-to-split-array.js)|Medium|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
diff --git a/solutions/2236-root-equals-sum-of-children.js b/solutions/2236-root-equals-sum-of-children.js
new file mode 100644
index 00000000..fa9a3cd9
--- /dev/null
+++ b/solutions/2236-root-equals-sum-of-children.js
@@ -0,0 +1,27 @@
+/**
+ * 2236. Root Equals Sum of Children
+ * https://leetcode.com/problems/root-equals-sum-of-children/
+ * Difficulty: Easy
+ *
+ * You are given the root of a binary tree that consists of exactly 3 nodes: the root, its
+ * left child, and its right child.
+ *
+ * Return true if the value of the root is equal to the sum of the values of its two children,
+ * or false otherwise.
+ */
+
+/**
+ * Definition for a binary tree node.
+ * function TreeNode(val, left, right) {
+ *     this.val = (val===undefined ? 0 : val)
+ *     this.left = (left===undefined ? null : left)
+ *     this.right = (right===undefined ? null : right)
+ * }
+ */
+/**
+ * @param {TreeNode} root
+ * @return {boolean}
+ */
+var checkTree = function(root) {
+  return root.val === root.left.val + root.right.val;
+};

From 5098fea2f87dc2ef7ed9ab85ba45d453ddeea26e Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 00:19:17 -0500
Subject: [PATCH 124/571] Add solution #2239

---
 README.md                                     |  3 ++-
 solutions/2239-find-closest-number-to-zero.js | 27 +++++++++++++++++++
 2 files changed, 29 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2239-find-closest-number-to-zero.js

diff --git a/README.md b/README.md
index f11f6ee7..508a5784 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,832 LeetCode solutions in JavaScript
+# 1,833 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1708,6 +1708,7 @@
 2232|[Minimize Result by Adding Parentheses to Expression](./solutions/2232-minimize-result-by-adding-parentheses-to-expression.js)|Medium|
 2235|[Add Two Integers](./solutions/2235-add-two-integers.js)|Easy|
 2236|[Root Equals Sum of Children](./solutions/2236-root-equals-sum-of-children.js)|Easy|
+2239|[Find Closest Number to Zero](./solutions/2239-find-closest-number-to-zero.js)|Easy|
 2244|[Minimum Rounds to Complete All Tasks](./solutions/2244-minimum-rounds-to-complete-all-tasks.js)|Medium|
 2270|[Number of Ways to Split Array](./solutions/2270-number-of-ways-to-split-array.js)|Medium|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
diff --git a/solutions/2239-find-closest-number-to-zero.js b/solutions/2239-find-closest-number-to-zero.js
new file mode 100644
index 00000000..56d07d8e
--- /dev/null
+++ b/solutions/2239-find-closest-number-to-zero.js
@@ -0,0 +1,27 @@
+/**
+ * 2239. Find Closest Number to Zero
+ * https://leetcode.com/problems/find-closest-number-to-zero/
+ * Difficulty: Easy
+ *
+ * Given an integer array nums of size n, return the number with the value closest to 0 in nums.
+ * If there are multiple answers, return the number with the largest value.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var findClosestNumber = function(nums) {
+  let result = nums[0];
+  let minDistance = Math.abs(nums[0]);
+
+  for (const num of nums) {
+    const distance = Math.abs(num);
+    if (distance < minDistance || (distance === minDistance && num > result)) {
+      minDistance = distance;
+      result = num;
+    }
+  }
+
+  return result;
+};

From 377c7dabebb3d3f1973740821bac63cc8a507d37 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 00:20:35 -0500
Subject: [PATCH 125/571] Add solution #2240

---
 README.md                                     |  3 +-
 ...-number-of-ways-to-buy-pens-and-pencils.js | 31 +++++++++++++++++++
 2 files changed, 33 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2240-number-of-ways-to-buy-pens-and-pencils.js

diff --git a/README.md b/README.md
index 508a5784..7c76fac2 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,833 LeetCode solutions in JavaScript
+# 1,834 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1709,6 +1709,7 @@
 2235|[Add Two Integers](./solutions/2235-add-two-integers.js)|Easy|
 2236|[Root Equals Sum of Children](./solutions/2236-root-equals-sum-of-children.js)|Easy|
 2239|[Find Closest Number to Zero](./solutions/2239-find-closest-number-to-zero.js)|Easy|
+2240|[Number of Ways to Buy Pens and Pencils](./solutions/2240-number-of-ways-to-buy-pens-and-pencils.js)|Medium|
 2244|[Minimum Rounds to Complete All Tasks](./solutions/2244-minimum-rounds-to-complete-all-tasks.js)|Medium|
 2270|[Number of Ways to Split Array](./solutions/2270-number-of-ways-to-split-array.js)|Medium|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
diff --git a/solutions/2240-number-of-ways-to-buy-pens-and-pencils.js b/solutions/2240-number-of-ways-to-buy-pens-and-pencils.js
new file mode 100644
index 00000000..b55f1cff
--- /dev/null
+++ b/solutions/2240-number-of-ways-to-buy-pens-and-pencils.js
@@ -0,0 +1,31 @@
+/**
+ * 2240. Number of Ways to Buy Pens and Pencils
+ * https://leetcode.com/problems/number-of-ways-to-buy-pens-and-pencils/
+ * Difficulty: Medium
+ *
+ * You are given an integer total indicating the amount of money you have. You are also given
+ * two integers cost1 and cost2 indicating the price of a pen and pencil respectively. You can
+ * spend part or all of your money to buy multiple quantities (or none) of each kind of writing
+ * utensil.
+ *
+ * Return the number of distinct ways you can buy some number of pens and pencils.
+ */
+
+/**
+ * @param {number} total
+ * @param {number} cost1
+ * @param {number} cost2
+ * @return {number}
+ */
+var waysToBuyPensPencils = function(total, cost1, cost2) {
+  let result = 0;
+  const maxPens = Math.floor(total / cost1);
+
+  for (let pens = 0; pens <= maxPens; pens++) {
+    const remaining = total - pens * cost1;
+    const pencils = Math.floor(remaining / cost2);
+    result += pencils + 1;
+  }
+
+  return result;
+};

From e7e195355fb59d660dae3405f8a0e09a850aaf18 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 00:22:33 -0500
Subject: [PATCH 126/571] Add solution #2241

---
 README.md                               |  3 +-
 solutions/2241-design-an-atm-machine.js | 64 +++++++++++++++++++++++++
 2 files changed, 66 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2241-design-an-atm-machine.js

diff --git a/README.md b/README.md
index 7c76fac2..3b8d4111 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,834 LeetCode solutions in JavaScript
+# 1,835 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1710,6 +1710,7 @@
 2236|[Root Equals Sum of Children](./solutions/2236-root-equals-sum-of-children.js)|Easy|
 2239|[Find Closest Number to Zero](./solutions/2239-find-closest-number-to-zero.js)|Easy|
 2240|[Number of Ways to Buy Pens and Pencils](./solutions/2240-number-of-ways-to-buy-pens-and-pencils.js)|Medium|
+2241|[Design an ATM Machine](./solutions/2241-design-an-atm-machine.js)|Medium|
 2244|[Minimum Rounds to Complete All Tasks](./solutions/2244-minimum-rounds-to-complete-all-tasks.js)|Medium|
 2270|[Number of Ways to Split Array](./solutions/2270-number-of-ways-to-split-array.js)|Medium|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
diff --git a/solutions/2241-design-an-atm-machine.js b/solutions/2241-design-an-atm-machine.js
new file mode 100644
index 00000000..4a5afa87
--- /dev/null
+++ b/solutions/2241-design-an-atm-machine.js
@@ -0,0 +1,64 @@
+/**
+ * 2241. Design an ATM Machine
+ * https://leetcode.com/problems/design-an-atm-machine/
+ * Difficulty: Medium
+ *
+ * There is an ATM machine that stores banknotes of 5 denominations: 20, 50, 100, 200, and
+ * 500 dollars. Initially the ATM is empty. The user can use the machine to deposit or
+ * withdraw any amount of money.
+ *
+ * When withdrawing, the machine prioritizes using banknotes of larger values.
+ * - For example, if you want to withdraw $300 and there are 2 $50 banknotes, 1 $100 banknote,
+ *   and 1 $200 banknote, then the machine will use the $100 and $200 banknotes.
+ * - However, if you try to withdraw $600 and there are 3 $200 banknotes and 1 $500 banknote,
+ *   then the withdraw request will be rejected because the machine will first try to use the
+ *   $500 banknote and then be unable to use banknotes to complete the remaining $100. Note
+ *   that the machine is not allowed to use the $200 banknotes instead of the $500 banknote.
+ *
+ * Implement the ATM class:
+ * - ATM() Initializes the ATM object.
+ * - void deposit(int[] banknotesCount) Deposits new banknotes in the order $20, $50, $100,
+ *   $200, and $500.
+ * - int[] withdraw(int amount) Returns an array of length 5 of the number of banknotes that
+ *   will be handed to the user in the order $20, $50, $100, $200, and $500, and update the
+ *   number of banknotes in the ATM after withdrawing. Returns [-1] if it is not possible (do
+ *   not withdraw any banknotes in this case).
+ */
+
+var ATM = function() {
+  this.denominations = [20, 50, 100, 200, 500];
+  this.notes = [0, 0, 0, 0, 0];
+};
+
+/**
+ * @param {number[]} banknotesCount
+ * @return {void}
+ */
+ATM.prototype.deposit = function(banknotesCount) {
+  for (let i = 0; i < 5; i++) {
+    this.notes[i] += banknotesCount[i];
+  }
+};
+
+/**
+ * @param {number} amount
+ * @return {number[]}
+ */
+ATM.prototype.withdraw = function(amount) {
+  const result = [0, 0, 0, 0, 0];
+  let remaining = amount;
+
+  for (let i = 4; i >= 0; i--) {
+    const count = Math.min(Math.floor(remaining / this.denominations[i]), this.notes[i]);
+    result[i] = count;
+    remaining -= count * this.denominations[i];
+  }
+
+  if (remaining !== 0) return [-1];
+
+  for (let i = 0; i < 5; i++) {
+    this.notes[i] -= result[i];
+  }
+
+  return result;
+};

From f789b7b5de9fb2a82db6753b5444d67417719c27 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 00:24:53 -0500
Subject: [PATCH 127/571] Add solution #2243

---
 README.md                                     |  3 +-
 .../2243-calculate-digit-sum-of-a-string.js   | 36 +++++++++++++++++++
 2 files changed, 38 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2243-calculate-digit-sum-of-a-string.js

diff --git a/README.md b/README.md
index 3b8d4111..9144d89c 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,835 LeetCode solutions in JavaScript
+# 1,836 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1711,6 +1711,7 @@
 2239|[Find Closest Number to Zero](./solutions/2239-find-closest-number-to-zero.js)|Easy|
 2240|[Number of Ways to Buy Pens and Pencils](./solutions/2240-number-of-ways-to-buy-pens-and-pencils.js)|Medium|
 2241|[Design an ATM Machine](./solutions/2241-design-an-atm-machine.js)|Medium|
+2243|[Calculate Digit Sum of a String](./solutions/2243-calculate-digit-sum-of-a-string.js)|Easy|
 2244|[Minimum Rounds to Complete All Tasks](./solutions/2244-minimum-rounds-to-complete-all-tasks.js)|Medium|
 2270|[Number of Ways to Split Array](./solutions/2270-number-of-ways-to-split-array.js)|Medium|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
diff --git a/solutions/2243-calculate-digit-sum-of-a-string.js b/solutions/2243-calculate-digit-sum-of-a-string.js
new file mode 100644
index 00000000..293438ed
--- /dev/null
+++ b/solutions/2243-calculate-digit-sum-of-a-string.js
@@ -0,0 +1,36 @@
+/**
+ * 2243. Calculate Digit Sum of a String
+ * https://leetcode.com/problems/calculate-digit-sum-of-a-string/
+ * Difficulty: Easy
+ *
+ * You are given a string s consisting of digits and an integer k.
+ *
+ * A round can be completed if the length of s is greater than k. In one round, do the following:
+ * 1. Divide s into consecutive groups of size k such that the first k characters are in the first
+ *    group, the next k characters are in the second group, and so on. Note that the size of the
+ *    last group can be smaller than k.
+ * 2. Replace each group of s with a string representing the sum of all its digits. For example,
+ *    "346" is replaced with "13" because 3 + 4 + 6 = 13.
+ * 3. Merge consecutive groups together to form a new string. If the length of the string is greater
+ *    than k, repeat from step 1.
+ *
+ * Return s after all rounds have been completed.
+ */
+
+/**
+ * @param {string} s
+ * @param {number} k
+ * @return {string}
+ */
+var digitSum = function(s, k) {
+  while (s.length > k) {
+    let next = '';
+    for (let i = 0; i < s.length; i += k) {
+      const group = s.slice(i, i + k);
+      const sum = group.split('').reduce((acc, digit) => acc + Number(digit), 0);
+      next += sum;
+    }
+    s = next;
+  }
+  return s;
+};

From aff4bb352c40ae8b8924d05f39ba78a9ec4fe0b0 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 00:26:24 -0500
Subject: [PATCH 128/571] Add solution #2246

---
 README.md                                     |  3 +-
 ...path-with-different-adjacent-characters.js | 54 +++++++++++++++++++
 2 files changed, 56 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2246-longest-path-with-different-adjacent-characters.js

diff --git a/README.md b/README.md
index 9144d89c..59fe8b72 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,836 LeetCode solutions in JavaScript
+# 1,837 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1713,6 +1713,7 @@
 2241|[Design an ATM Machine](./solutions/2241-design-an-atm-machine.js)|Medium|
 2243|[Calculate Digit Sum of a String](./solutions/2243-calculate-digit-sum-of-a-string.js)|Easy|
 2244|[Minimum Rounds to Complete All Tasks](./solutions/2244-minimum-rounds-to-complete-all-tasks.js)|Medium|
+2246|[Longest Path With Different Adjacent Characters](./solutions/2246-longest-path-with-different-adjacent-characters.js)|Hard|
 2270|[Number of Ways to Split Array](./solutions/2270-number-of-ways-to-split-array.js)|Medium|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
diff --git a/solutions/2246-longest-path-with-different-adjacent-characters.js b/solutions/2246-longest-path-with-different-adjacent-characters.js
new file mode 100644
index 00000000..4eb8cb53
--- /dev/null
+++ b/solutions/2246-longest-path-with-different-adjacent-characters.js
@@ -0,0 +1,54 @@
+/**
+ * 2246. Longest Path With Different Adjacent Characters
+ * https://leetcode.com/problems/longest-path-with-different-adjacent-characters/
+ * Difficulty: Hard
+ *
+ * You are given a tree (i.e. a connected, undirected graph that has no cycles) rooted at node
+ * 0 consisting of n nodes numbered from 0 to n - 1. The tree is represented by a 0-indexed array
+ * parent of size n, where parent[i] is the parent of node i. Since node 0 is the root,
+ * parent[0] == -1.
+ *
+ * You are also given a string s of length n, where s[i] is the character assigned to node i.
+ *
+ * Return the length of the longest path in the tree such that no pair of adjacent nodes on the path
+ * have the same character assigned to them.
+ */
+
+/**
+ * @param {number[]} parent
+ * @param {string} s
+ * @return {number}
+ */
+var longestPath = function(parent, s) {
+  const n = parent.length;
+  const children = Array.from({ length: n }, () => []);
+  let result = 1;
+
+  for (let i = 1; i < n; i++) {
+    children[parent[i]].push(i);
+  }
+
+  findLongest(0);
+
+  return result;
+
+  function findLongest(node) {
+    let longest = 0;
+    let secondLongest = 0;
+
+    for (const child of children[node]) {
+      const length = findLongest(child);
+      if (s[child] !== s[node]) {
+        if (length > longest) {
+          secondLongest = longest;
+          longest = length;
+        } else if (length > secondLongest) {
+          secondLongest = length;
+        }
+      }
+    }
+
+    result = Math.max(result, longest + secondLongest + 1);
+    return longest + 1;
+  }
+};

From c41e4175c8889f82e5d590b9ec904d9bd8f8215b Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 00:27:18 -0500
Subject: [PATCH 129/571] Add solution #2248

---
 README.md                                     |  3 +-
 .../2248-intersection-of-multiple-arrays.js   | 31 +++++++++++++++++++
 2 files changed, 33 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2248-intersection-of-multiple-arrays.js

diff --git a/README.md b/README.md
index 59fe8b72..8067b3bc 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,837 LeetCode solutions in JavaScript
+# 1,838 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1714,6 +1714,7 @@
 2243|[Calculate Digit Sum of a String](./solutions/2243-calculate-digit-sum-of-a-string.js)|Easy|
 2244|[Minimum Rounds to Complete All Tasks](./solutions/2244-minimum-rounds-to-complete-all-tasks.js)|Medium|
 2246|[Longest Path With Different Adjacent Characters](./solutions/2246-longest-path-with-different-adjacent-characters.js)|Hard|
+2248|[Intersection of Multiple Arrays](./solutions/2248-intersection-of-multiple-arrays.js)|Easy|
 2270|[Number of Ways to Split Array](./solutions/2270-number-of-ways-to-split-array.js)|Medium|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
diff --git a/solutions/2248-intersection-of-multiple-arrays.js b/solutions/2248-intersection-of-multiple-arrays.js
new file mode 100644
index 00000000..fa162656
--- /dev/null
+++ b/solutions/2248-intersection-of-multiple-arrays.js
@@ -0,0 +1,31 @@
+/**
+ * 2248. Intersection of Multiple Arrays
+ * https://leetcode.com/problems/intersection-of-multiple-arrays/
+ * Difficulty: Easy
+ *
+ * Given a 2D integer array nums where nums[i] is a non-empty array of distinct positive integers,
+ * return the list of integers that are present in each array of nums sorted in ascending order.
+ */
+
+/**
+ * @param {number[][]} nums
+ * @return {number[]}
+ */
+var intersection = function(nums) {
+  const count = new Map();
+
+  for (const array of nums) {
+    for (const num of array) {
+      count.set(num, (count.get(num) || 0) + 1);
+    }
+  }
+
+  const result = [];
+  for (const [num, freq] of count) {
+    if (freq === nums.length) {
+      result.push(num);
+    }
+  }
+
+  return result.sort((a, b) => a - b);
+};

From 7520d382168470f8bba7dff3660264161540c355 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 00:28:26 -0500
Subject: [PATCH 130/571] Add solution #2249

---
 README.md                                     |  3 +-
 ...49-count-lattice-points-inside-a-circle.js | 33 +++++++++++++++++++
 2 files changed, 35 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2249-count-lattice-points-inside-a-circle.js

diff --git a/README.md b/README.md
index 8067b3bc..6ade4a7e 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,838 LeetCode solutions in JavaScript
+# 1,839 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1715,6 +1715,7 @@
 2244|[Minimum Rounds to Complete All Tasks](./solutions/2244-minimum-rounds-to-complete-all-tasks.js)|Medium|
 2246|[Longest Path With Different Adjacent Characters](./solutions/2246-longest-path-with-different-adjacent-characters.js)|Hard|
 2248|[Intersection of Multiple Arrays](./solutions/2248-intersection-of-multiple-arrays.js)|Easy|
+2249|[Count Lattice Points Inside a Circle](./solutions/2249-count-lattice-points-inside-a-circle.js)|Medium|
 2270|[Number of Ways to Split Array](./solutions/2270-number-of-ways-to-split-array.js)|Medium|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
diff --git a/solutions/2249-count-lattice-points-inside-a-circle.js b/solutions/2249-count-lattice-points-inside-a-circle.js
new file mode 100644
index 00000000..2c762806
--- /dev/null
+++ b/solutions/2249-count-lattice-points-inside-a-circle.js
@@ -0,0 +1,33 @@
+/**
+ * 2249. Count Lattice Points Inside a Circle
+ * https://leetcode.com/problems/count-lattice-points-inside-a-circle/
+ * Difficulty: Medium
+ *
+ * Given a 2D integer array circles where circles[i] = [xi, yi, ri] represents the center (xi, yi)
+ * and radius ri of the ith circle drawn on a grid, return the number of lattice points that are
+ * present inside at least one circle.
+ *
+ * Note:
+ * - A lattice point is a point with integer coordinates.
+ * - Points that lie on the circumference of a circle are also considered to be inside it.
+ */
+
+/**
+ * @param {number[][]} circles
+ * @return {number}
+ */
+var countLatticePoints = function(circles) {
+  const set = new Set();
+
+  for (const [x, y, r] of circles) {
+    for (let i = x - r; i <= x + r; i++) {
+      for (let j = y - r; j <= y + r; j++) {
+        if ((x - i) ** 2 + (y - j) ** 2 <= r ** 2) {
+          set.add(`${i},${j}`);
+        }
+      }
+    }
+  }
+
+  return set.size;
+};

From dc06fe78ffede65fc3b4bcac33cd744b51d530f1 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 00:29:24 -0500
Subject: [PATCH 131/571] Add solution #2251

---
 README.md                                     |  3 +-
 .../2251-number-of-flowers-in-full-bloom.js   | 43 +++++++++++++++++++
 2 files changed, 45 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2251-number-of-flowers-in-full-bloom.js

diff --git a/README.md b/README.md
index 6ade4a7e..fd14d66d 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,839 LeetCode solutions in JavaScript
+# 1,840 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1716,6 +1716,7 @@
 2246|[Longest Path With Different Adjacent Characters](./solutions/2246-longest-path-with-different-adjacent-characters.js)|Hard|
 2248|[Intersection of Multiple Arrays](./solutions/2248-intersection-of-multiple-arrays.js)|Easy|
 2249|[Count Lattice Points Inside a Circle](./solutions/2249-count-lattice-points-inside-a-circle.js)|Medium|
+2251|[Number of Flowers in Full Bloom](./solutions/2251-number-of-flowers-in-full-bloom.js)|Hard|
 2270|[Number of Ways to Split Array](./solutions/2270-number-of-ways-to-split-array.js)|Medium|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
diff --git a/solutions/2251-number-of-flowers-in-full-bloom.js b/solutions/2251-number-of-flowers-in-full-bloom.js
new file mode 100644
index 00000000..c9ae393f
--- /dev/null
+++ b/solutions/2251-number-of-flowers-in-full-bloom.js
@@ -0,0 +1,43 @@
+/**
+ * 2251. Number of Flowers in Full Bloom
+ * https://leetcode.com/problems/number-of-flowers-in-full-bloom/
+ * Difficulty: Hard
+ *
+ * You are given a 0-indexed 2D integer array flowers, where flowers[i] = [starti, endi] means
+ * the ith flower will be in full bloom from starti to endi (inclusive). You are also given a
+ * 0-indexed integer array people of size n, where people[i] is the time that the ith person
+ * will arrive to see the flowers.
+ *
+ * Return an integer array answer of size n, where answer[i] is the number of flowers that are
+ * in full bloom when the ith person arrives.
+ */
+
+/**
+ * @param {number[][]} flowers
+ * @param {number[]} people
+ * @return {number[]}
+ */
+var fullBloomFlowers = function(flowers, people) {
+  const events = [];
+  for (const [start, end] of flowers) {
+    events.push([start, 1]);
+    events.push([end + 1, -1]);
+  }
+  events.sort((a, b) => a[0] - b[0] || a[1] - b[1]);
+
+  const result = new Array(people.length).fill(0);
+  const peopleWithIndex = people.map((time, index) => [time, index]);
+  peopleWithIndex.sort((a, b) => a[0] - b[0]);
+
+  let bloomCount = 0;
+  let eventIndex = 0;
+  for (const [time, personIndex] of peopleWithIndex) {
+    while (eventIndex < events.length && events[eventIndex][0] <= time) {
+      bloomCount += events[eventIndex][1];
+      eventIndex++;
+    }
+    result[personIndex] = bloomCount;
+  }
+
+  return result;
+};

From 646079d6568ab6647bc848e19c0e29af79d9e6d3 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 11:09:04 -0500
Subject: [PATCH 132/571] Add solution #2227

---
 README.md                                     |  3 +-
 solutions/2227-encrypt-and-decrypt-strings.js | 77 +++++++++++++++++++
 2 files changed, 79 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2227-encrypt-and-decrypt-strings.js

diff --git a/README.md b/README.md
index fd14d66d..5b326ee9 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,840 LeetCode solutions in JavaScript
+# 1,841 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1705,6 +1705,7 @@
 2224|[Minimum Number of Operations to Convert Time](./solutions/2224-minimum-number-of-operations-to-convert-time.js)|Easy|
 2225|[Find Players With Zero or One Losses](./solutions/2225-find-players-with-zero-or-one-losses.js)|Medium|
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
+2227|[Encrypt and Decrypt Strings](./solutions/2227-encrypt-and-decrypt-strings.js)|Hard|
 2232|[Minimize Result by Adding Parentheses to Expression](./solutions/2232-minimize-result-by-adding-parentheses-to-expression.js)|Medium|
 2235|[Add Two Integers](./solutions/2235-add-two-integers.js)|Easy|
 2236|[Root Equals Sum of Children](./solutions/2236-root-equals-sum-of-children.js)|Easy|
diff --git a/solutions/2227-encrypt-and-decrypt-strings.js b/solutions/2227-encrypt-and-decrypt-strings.js
new file mode 100644
index 00000000..fd773ffb
--- /dev/null
+++ b/solutions/2227-encrypt-and-decrypt-strings.js
@@ -0,0 +1,77 @@
+/**
+ * 2227. Encrypt and Decrypt Strings
+ * https://leetcode.com/problems/encrypt-and-decrypt-strings/
+ * Difficulty: Hard
+ *
+ * You are given a character array keys containing unique characters and a string array values
+ * containing strings of length 2. You are also given another string array dictionary that
+ * contains all permitted original strings after decryption. You should implement a data structure
+ * that can encrypt or decrypt a 0-indexed string.
+ *
+ * A string is encrypted with the following process:
+ * 1. For each character c in the string, we find the index i satisfying keys[i] == c in keys.
+ * 2. Replace c with values[i] in the string.
+ *
+ * Note that in case a character of the string is not present in keys, the encryption process cannot
+ * be carried out, and an empty string "" is returned.
+ *
+ * A string is decrypted with the following process:
+ * 1. For each substring s of length 2 occurring at an even index in the string, we find an i such
+ *    that values[i] == s. If there are multiple valid i, we choose any one of them. This means a
+ *    string could have multiple possible strings it can decrypt to.
+ * 2. Replace s with keys[i] in the string.
+ *
+ * Implement the Encrypter class:
+ * - Encrypter(char[] keys, String[] values, String[] dictionary) Initializes the Encrypter class
+ *   with keys, values, and dictionary.
+ * - String encrypt(String word1) Encrypts word1 with the encryption process described above and
+ *   returns the encrypted string.
+ * - int decrypt(String word2) Returns the number of possible strings word2 could decrypt to that
+ *   also appear in dictionary.
+ */
+
+/**
+ * @param {character[]} keys
+ * @param {string[]} values
+ * @param {string[]} dictionary
+ */
+var Encrypter = function(keys, values, dictionary) {
+  this.encryptMap = new Map();
+  this.validEncryptions = new Map();
+
+  for (let i = 0; i < keys.length; i++) {
+    this.encryptMap.set(keys[i], values[i]);
+  }
+
+  for (const word of dictionary) {
+    const encrypted = this.encrypt(word);
+    if (encrypted !== '') {
+      this.validEncryptions.set(encrypted, (this.validEncryptions.get(encrypted) || 0) + 1);
+    }
+  }
+};
+
+/**
+ * @param {string} word1
+ * @return {string}
+ */
+Encrypter.prototype.encrypt = function(word1) {
+  let result = '';
+
+  for (const char of word1) {
+    if (!this.encryptMap.has(char)) {
+      return '';
+    }
+    result += this.encryptMap.get(char);
+  }
+
+  return result;
+};
+
+/**
+ * @param {string} word2
+ * @return {number}
+ */
+Encrypter.prototype.decrypt = function(word2) {
+  return this.validEncryptions.get(word2) || 0;
+};

From 07d917800befa7267dac07134d281f7a04c1b60b Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 11:29:41 -0500
Subject: [PATCH 133/571] Add solution #2234

---
 README.md                                     |  3 +-
 ...234-maximum-total-beauty-of-the-gardens.js | 99 +++++++++++++++++++
 2 files changed, 101 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2234-maximum-total-beauty-of-the-gardens.js

diff --git a/README.md b/README.md
index 5b326ee9..85bdb7cc 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,841 LeetCode solutions in JavaScript
+# 1,842 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1707,6 +1707,7 @@
 2226|[Maximum Candies Allocated to K Children](./solutions/2226-maximum-candies-allocated-to-k-children.js)|Medium|
 2227|[Encrypt and Decrypt Strings](./solutions/2227-encrypt-and-decrypt-strings.js)|Hard|
 2232|[Minimize Result by Adding Parentheses to Expression](./solutions/2232-minimize-result-by-adding-parentheses-to-expression.js)|Medium|
+2234|[Maximum Total Beauty of the Gardens](./solutions/2234-maximum-total-beauty-of-the-gardens.js)|Hard|
 2235|[Add Two Integers](./solutions/2235-add-two-integers.js)|Easy|
 2236|[Root Equals Sum of Children](./solutions/2236-root-equals-sum-of-children.js)|Easy|
 2239|[Find Closest Number to Zero](./solutions/2239-find-closest-number-to-zero.js)|Easy|
diff --git a/solutions/2234-maximum-total-beauty-of-the-gardens.js b/solutions/2234-maximum-total-beauty-of-the-gardens.js
new file mode 100644
index 00000000..54985527
--- /dev/null
+++ b/solutions/2234-maximum-total-beauty-of-the-gardens.js
@@ -0,0 +1,99 @@
+/**
+ * 2234. Maximum Total Beauty of the Gardens
+ * https://leetcode.com/problems/maximum-total-beauty-of-the-gardens/
+ * Difficulty: Hard
+ *
+ * Alice is a caretaker of n gardens and she wants to plant flowers to maximize the total
+ * beauty of all her gardens.
+ *
+ * You are given a 0-indexed integer array flowers of size n, where flowers[i] is the number
+ * of flowers already planted in the ith garden. Flowers that are already planted cannot be
+ * removed. You are then given another integer newFlowers, which is the maximum number of
+ * flowers that Alice can additionally plant. You are also given the integers target, full,
+ * and partial.
+ *
+ * A garden is considered complete if it has at least target flowers. The total beauty of the
+ * gardens is then determined as the sum of the following:
+ * - The number of complete gardens multiplied by full.
+ * - The minimum number of flowers in any of the incomplete gardens multiplied by partial.
+ *   If there are no incomplete gardens, then this value will be 0.
+ *
+ * Return the maximum total beauty that Alice can obtain after planting at most newFlowers flowers.
+ */
+
+/**
+ * @param {number[]} flowers
+ * @param {number} newFlowers
+ * @param {number} target
+ * @param {number} full
+ * @param {number} partial
+ * @return {number}
+ */
+var maximumBeauty = function(flowers, newFlowers, target, full, partial) {
+  const n = flowers.length;
+  flowers.sort((a, b) => b - a);
+
+  const suffixCost = Array(n + 1).fill(0);
+  let lastUniqueIndex = n - 1;
+  let minIndex = n - 2;
+
+  for (; minIndex >= 0; --minIndex) {
+    if (flowers[minIndex] >= target) break;
+
+    const flowerDiff = flowers[minIndex] - flowers[minIndex + 1];
+    const gardenCount = n - lastUniqueIndex;
+    suffixCost[minIndex] = suffixCost[minIndex + 1] + flowerDiff * gardenCount;
+
+    if (suffixCost[minIndex] > newFlowers) break;
+
+    if (flowers[minIndex] !== flowers[minIndex - 1]) {
+      lastUniqueIndex = minIndex;
+    }
+  }
+
+  ++minIndex;
+
+  const remainingFlowersForMin = newFlowers - suffixCost[minIndex];
+  const gardenCountForMin = n - minIndex;
+  let minFlowerValue = Math.min(
+    target - 1,
+    flowers[minIndex] + Math.floor(remainingFlowersForMin / gardenCountForMin)
+  );
+
+  let result = 0;
+
+  for (let i = 0; i < n; ++i) {
+    if (flowers[i] >= target) {
+      continue;
+    }
+
+    const currentBeauty = i * full + minFlowerValue * partial;
+    result = Math.max(result, currentBeauty);
+
+    const flowersNeeded = target - flowers[i];
+    if (flowersNeeded > newFlowers) break;
+
+    newFlowers -= flowersNeeded;
+    flowers[i] = target;
+
+    while (
+      minIndex <= i || newFlowers < suffixCost[minIndex]
+      || (minIndex > 0 && flowers[minIndex] === flowers[minIndex - 1])
+    ) {
+      ++minIndex;
+    }
+
+    const updatedRemaining = newFlowers - suffixCost[minIndex];
+    const updatedGardenCount = n - minIndex;
+    minFlowerValue = Math.min(
+      target - 1,
+      flowers[minIndex] + Math.floor(updatedRemaining / updatedGardenCount)
+    );
+  }
+
+  if (flowers[n - 1] >= target) {
+    result = Math.max(result, n * full);
+  }
+
+  return result;
+};

From 107e00a20c4e27b022da5149b7818a51b05148ce Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 11:32:27 -0500
Subject: [PATCH 134/571] Add solution #2242

---
 README.md                                     |  3 +-
 .../2242-maximum-score-of-a-node-sequence.js  | 55 +++++++++++++++++++
 2 files changed, 57 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2242-maximum-score-of-a-node-sequence.js

diff --git a/README.md b/README.md
index 85bdb7cc..d2d2f692 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,842 LeetCode solutions in JavaScript
+# 1,843 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1713,6 +1713,7 @@
 2239|[Find Closest Number to Zero](./solutions/2239-find-closest-number-to-zero.js)|Easy|
 2240|[Number of Ways to Buy Pens and Pencils](./solutions/2240-number-of-ways-to-buy-pens-and-pencils.js)|Medium|
 2241|[Design an ATM Machine](./solutions/2241-design-an-atm-machine.js)|Medium|
+2242|[Maximum Score of a Node Sequence](./solutions/2242-maximum-score-of-a-node-sequence.js)|Hard|
 2243|[Calculate Digit Sum of a String](./solutions/2243-calculate-digit-sum-of-a-string.js)|Easy|
 2244|[Minimum Rounds to Complete All Tasks](./solutions/2244-minimum-rounds-to-complete-all-tasks.js)|Medium|
 2246|[Longest Path With Different Adjacent Characters](./solutions/2246-longest-path-with-different-adjacent-characters.js)|Hard|
diff --git a/solutions/2242-maximum-score-of-a-node-sequence.js b/solutions/2242-maximum-score-of-a-node-sequence.js
new file mode 100644
index 00000000..b64c16ce
--- /dev/null
+++ b/solutions/2242-maximum-score-of-a-node-sequence.js
@@ -0,0 +1,55 @@
+/**
+ * 2242. Maximum Score of a Node Sequence
+ * https://leetcode.com/problems/maximum-score-of-a-node-sequence/
+ * Difficulty: Hard
+ *
+ * There is an undirected graph with n nodes, numbered from 0 to n - 1.
+ *
+ * You are given a 0-indexed integer array scores of length n where scores[i] denotes the score
+ * of node i. You are also given a 2D integer array edges where edges[i] = [ai, bi] denotes that
+ * there exists an undirected edge connecting nodes ai and bi.
+ *
+ * A node sequence is valid if it meets the following conditions:
+ * - There is an edge connecting every pair of adjacent nodes in the sequence.
+ * - No node appears more than once in the sequence.
+ *
+ * The score of a node sequence is defined as the sum of the scores of the nodes in the sequence.
+ *
+ * Return the maximum score of a valid node sequence with a length of 4. If no such sequence exists,
+ * return -1.
+ */
+
+/**
+ * @param {number[]} scores
+ * @param {number[][]} edges
+ * @return {number}
+ */
+var maximumScore = function(scores, edges) {
+  const n = scores.length;
+  const graph = new Array(n).fill().map(() => []);
+
+  for (const [a, b] of edges) {
+    graph[a].push(b);
+    graph[b].push(a);
+  }
+
+  for (let i = 0; i < n; i++) {
+    graph[i].sort((a, b) => scores[b] - scores[a]);
+    if (graph[i].length > 3) {
+      graph[i] = graph[i].slice(0, 3);
+    }
+  }
+
+  let result = -1;
+  for (const [a, b] of edges) {
+    for (const c of graph[a]) {
+      if (c === b) continue;
+      for (const d of graph[b]) {
+        if (d === a || d === c) continue;
+        result = Math.max(result, scores[a] + scores[b] + scores[c] + scores[d]);
+      }
+    }
+  }
+
+  return result;
+};

From dada64e68c9caa477e9b2ee80ead88e3dd0abd64 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 11:35:25 -0500
Subject: [PATCH 135/571] Add solution #2245

---
 README.md                                     |   3 +-
 ...ximum-trailing-zeros-in-a-cornered-path.js | 112 ++++++++++++++++++
 2 files changed, 114 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2245-maximum-trailing-zeros-in-a-cornered-path.js

diff --git a/README.md b/README.md
index d2d2f692..84f847c1 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,843 LeetCode solutions in JavaScript
+# 1,844 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1716,6 +1716,7 @@
 2242|[Maximum Score of a Node Sequence](./solutions/2242-maximum-score-of-a-node-sequence.js)|Hard|
 2243|[Calculate Digit Sum of a String](./solutions/2243-calculate-digit-sum-of-a-string.js)|Easy|
 2244|[Minimum Rounds to Complete All Tasks](./solutions/2244-minimum-rounds-to-complete-all-tasks.js)|Medium|
+2245|[Maximum Trailing Zeros in a Cornered Path](./solutions/2245-maximum-trailing-zeros-in-a-cornered-path.js)|Medium|
 2246|[Longest Path With Different Adjacent Characters](./solutions/2246-longest-path-with-different-adjacent-characters.js)|Hard|
 2248|[Intersection of Multiple Arrays](./solutions/2248-intersection-of-multiple-arrays.js)|Easy|
 2249|[Count Lattice Points Inside a Circle](./solutions/2249-count-lattice-points-inside-a-circle.js)|Medium|
diff --git a/solutions/2245-maximum-trailing-zeros-in-a-cornered-path.js b/solutions/2245-maximum-trailing-zeros-in-a-cornered-path.js
new file mode 100644
index 00000000..7f18ed32
--- /dev/null
+++ b/solutions/2245-maximum-trailing-zeros-in-a-cornered-path.js
@@ -0,0 +1,112 @@
+/**
+ * 2245. Maximum Trailing Zeros in a Cornered Path
+ * https://leetcode.com/problems/maximum-trailing-zeros-in-a-cornered-path/
+ * Difficulty: Medium
+ *
+ * You are given a 2D integer array grid of size m x n, where each cell contains a positive integer.
+ *
+ * A cornered path is defined as a set of adjacent cells with at most one turn. More specifically,
+ * the path should exclusively move either horizontally or vertically up to the turn (if there is
+ * one), without returning to a previously visited cell. After the turn, the path will then move
+ * exclusively in the alternate direction: move vertically if it moved horizontally, and vice versa,
+ * also without returning to a previously visited cell.
+ *
+ * The product of a path is defined as the product of all the values in the path.
+ *
+ * Return the maximum number of trailing zeros in the product of a cornered path found in grid.
+ *
+ * Note:
+ * - Horizontal movement means moving in either the left or right direction.
+ * - Vertical movement means moving in either the up or down direction.
+ */
+
+/**
+ * @param {number[][]} grid
+ * @return {number}
+ */
+var maxTrailingZeros = function(grid) {
+  const m = grid.length;
+  const n = grid[0].length;
+
+  function countFactors(num) {
+    let count2 = 0;
+    let count5 = 0;
+
+    while (num % 2 === 0) {
+      count2++;
+      num = Math.floor(num / 2);
+    }
+
+    while (num % 5 === 0) {
+      count5++;
+      num = Math.floor(num / 5);
+    }
+
+    return [count2, count5];
+  }
+
+  const factors = new Array(m).fill().map(() => new Array(n).fill().map(() => [0, 0]));
+  for (let i = 0; i < m; i++) {
+    for (let j = 0; j < n; j++) {
+      factors[i][j] = countFactors(grid[i][j]);
+    }
+  }
+
+  const rowPrefix = new Array(m).fill().map(() => new Array(n + 1).fill().map(() => [0, 0]));
+  for (let i = 0; i < m; i++) {
+    for (let j = 0; j < n; j++) {
+      rowPrefix[i][j + 1][0] = rowPrefix[i][j][0] + factors[i][j][0];
+      rowPrefix[i][j + 1][1] = rowPrefix[i][j][1] + factors[i][j][1];
+    }
+  }
+
+  const colPrefix = new Array(m + 1).fill().map(() => new Array(n).fill().map(() => [0, 0]));
+  for (let j = 0; j < n; j++) {
+    for (let i = 0; i < m; i++) {
+      colPrefix[i + 1][j][0] = colPrefix[i][j][0] + factors[i][j][0];
+      colPrefix[i + 1][j][1] = colPrefix[i][j][1] + factors[i][j][1];
+    }
+  }
+
+  let maxZeros = 0;
+  for (let i = 0; i < m; i++) {
+    for (let j = 0; j < n; j++) {
+      const [count2, count5] = factors[i][j];
+
+      const leftUp = [
+        rowPrefix[i][j][0] + colPrefix[i][j][0],
+        rowPrefix[i][j][1] + colPrefix[i][j][1]
+      ];
+
+      const leftDown = [
+        rowPrefix[i][j][0] + (colPrefix[m][j][0] - colPrefix[i + 1][j][0]),
+        rowPrefix[i][j][1] + (colPrefix[m][j][1] - colPrefix[i + 1][j][1])
+      ];
+
+      const rightUp = [
+        (rowPrefix[i][n][0] - rowPrefix[i][j + 1][0]) + colPrefix[i][j][0],
+        (rowPrefix[i][n][1] - rowPrefix[i][j + 1][1]) + colPrefix[i][j][1]
+      ];
+
+      const rightDown = [
+        (rowPrefix[i][n][0] - rowPrefix[i][j + 1][0])
+          + (colPrefix[m][j][0] - colPrefix[i + 1][j][0]),
+        (rowPrefix[i][n][1] - rowPrefix[i][j + 1][1])
+          + (colPrefix[m][j][1] - colPrefix[i + 1][j][1])
+      ];
+
+      const paths = [
+        [leftUp[0] + count2, leftUp[1] + count5],
+        [leftDown[0] + count2, leftDown[1] + count5],
+        [rightUp[0] + count2, rightUp[1] + count5],
+        [rightDown[0] + count2, rightDown[1] + count5]
+      ];
+
+      for (const [path2, path5] of paths) {
+        maxZeros = Math.max(maxZeros, Math.min(path2, path5));
+      }
+    }
+  }
+
+  return maxZeros;
+};

From 79704df0607bdd8a68f96e4fba00549c8f3f49f0 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 11:36:50 -0500
Subject: [PATCH 136/571] Add solution #2250

---
 README.md                                     |  3 +-
 ...ber-of-rectangles-containing-each-point.js | 62 +++++++++++++++++++
 2 files changed, 64 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2250-count-number-of-rectangles-containing-each-point.js

diff --git a/README.md b/README.md
index 84f847c1..8aee3f41 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,844 LeetCode solutions in JavaScript
+# 1,845 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1720,6 +1720,7 @@
 2246|[Longest Path With Different Adjacent Characters](./solutions/2246-longest-path-with-different-adjacent-characters.js)|Hard|
 2248|[Intersection of Multiple Arrays](./solutions/2248-intersection-of-multiple-arrays.js)|Easy|
 2249|[Count Lattice Points Inside a Circle](./solutions/2249-count-lattice-points-inside-a-circle.js)|Medium|
+2250|[Count Number of Rectangles Containing Each Point](./solutions/2250-count-number-of-rectangles-containing-each-point.js)|Medium|
 2251|[Number of Flowers in Full Bloom](./solutions/2251-number-of-flowers-in-full-bloom.js)|Hard|
 2270|[Number of Ways to Split Array](./solutions/2270-number-of-ways-to-split-array.js)|Medium|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
diff --git a/solutions/2250-count-number-of-rectangles-containing-each-point.js b/solutions/2250-count-number-of-rectangles-containing-each-point.js
new file mode 100644
index 00000000..79ed186c
--- /dev/null
+++ b/solutions/2250-count-number-of-rectangles-containing-each-point.js
@@ -0,0 +1,62 @@
+/**
+ * 2250. Count Number of Rectangles Containing Each Point
+ * https://leetcode.com/problems/count-number-of-rectangles-containing-each-point/
+ * Difficulty: Medium
+ *
+ * You are given a 2D integer array rectangles where rectangles[i] = [li, hi] indicates that ith
+ * rectangle has a length of li and a height of hi. You are also given a 2D integer array points
+ * where points[j] = [xj, yj] is a point with coordinates (xj, yj).
+ *
+ * The ith rectangle has its bottom-left corner point at the coordinates (0, 0) and its top-right
+ * corner point at (li, hi).
+ *
+ * Return an integer array count of length points.length where count[j] is the number of rectangles
+ * that contain the jth point.
+ *
+ * The ith rectangle contains the jth point if 0 <= xj <= li and 0 <= yj <= hi. Note that points
+ * that lie on the edges of a rectangle are also considered to be contained by that rectangle.
+ */
+
+/**
+ * @param {number[][]} rectangles
+ * @param {number[][]} points
+ * @return {number[]}
+ */
+var countRectangles = function(rectangles, points) {
+  const rectByHeight = new Array(101).fill().map(() => []);
+
+  for (const [length, height] of rectangles) {
+    rectByHeight[height].push(length);
+  }
+
+  for (let h = 0; h <= 100; h++) {
+    rectByHeight[h].sort((a, b) => a - b);
+  }
+
+  const result = new Array(points.length).fill(0);
+  for (let i = 0; i < points.length; i++) {
+    const [x, y] = points[i];
+
+    for (let h = y; h <= 100; h++) {
+      const lengths = rectByHeight[h];
+
+      let left = 0;
+      let right = lengths.length - 1;
+      let insertPos = lengths.length;
+
+      while (left <= right) {
+        const mid = Math.floor((left + right) / 2);
+        if (lengths[mid] >= x) {
+          insertPos = mid;
+          right = mid - 1;
+        } else {
+          left = mid + 1;
+        }
+      }
+
+      result[i] += lengths.length - insertPos;
+    }
+  }
+
+  return result;
+};

From 0d435cd15e0ac2b322c2d7830e272b23f051d03f Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 13:07:27 -0500
Subject: [PATCH 137/571] Add solution #2255

---
 README.md                                     |  3 +-
 .../2255-count-prefixes-of-a-given-string.js  | 30 +++++++++++++++++++
 2 files changed, 32 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2255-count-prefixes-of-a-given-string.js

diff --git a/README.md b/README.md
index 8aee3f41..4b0b8335 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,845 LeetCode solutions in JavaScript
+# 1,846 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1722,6 +1722,7 @@
 2249|[Count Lattice Points Inside a Circle](./solutions/2249-count-lattice-points-inside-a-circle.js)|Medium|
 2250|[Count Number of Rectangles Containing Each Point](./solutions/2250-count-number-of-rectangles-containing-each-point.js)|Medium|
 2251|[Number of Flowers in Full Bloom](./solutions/2251-number-of-flowers-in-full-bloom.js)|Hard|
+2255|[Count Prefixes of a Given String](./solutions/2255-count-prefixes-of-a-given-string.js)|Easy|
 2270|[Number of Ways to Split Array](./solutions/2270-number-of-ways-to-split-array.js)|Medium|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
diff --git a/solutions/2255-count-prefixes-of-a-given-string.js b/solutions/2255-count-prefixes-of-a-given-string.js
new file mode 100644
index 00000000..25f3ecbf
--- /dev/null
+++ b/solutions/2255-count-prefixes-of-a-given-string.js
@@ -0,0 +1,30 @@
+/**
+ * 2255. Count Prefixes of a Given String
+ * https://leetcode.com/problems/count-prefixes-of-a-given-string/
+ * Difficulty: Easy
+ *
+ * You are given a string array words and a string s, where words[i] and s comprise only of
+ * lowercase English letters.
+ *
+ * Return the number of strings in words that are a prefix of s.
+ *
+ * A prefix of a string is a substring that occurs at the beginning of the string. A substring
+ * is a contiguous sequence of characters within a string.
+ */
+
+/**
+ * @param {string[]} words
+ * @param {string} s
+ * @return {number}
+ */
+var countPrefixes = function(words, s) {
+  let result = 0;
+
+  for (const word of words) {
+    if (word.length <= s.length && s.startsWith(word)) {
+      result++;
+    }
+  }
+
+  return result;
+};

From ab86882bf8662752b5d794ca6387ec0ea5f73dcc Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 13:08:34 -0500
Subject: [PATCH 138/571] Add solution #2256

---
 README.md                                    |  3 +-
 solutions/2256-minimum-average-difference.js | 46 ++++++++++++++++++++
 2 files changed, 48 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2256-minimum-average-difference.js

diff --git a/README.md b/README.md
index 4b0b8335..f9d85692 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,846 LeetCode solutions in JavaScript
+# 1,847 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1723,6 +1723,7 @@
 2250|[Count Number of Rectangles Containing Each Point](./solutions/2250-count-number-of-rectangles-containing-each-point.js)|Medium|
 2251|[Number of Flowers in Full Bloom](./solutions/2251-number-of-flowers-in-full-bloom.js)|Hard|
 2255|[Count Prefixes of a Given String](./solutions/2255-count-prefixes-of-a-given-string.js)|Easy|
+2256|[Minimum Average Difference](./solutions/2256-minimum-average-difference.js)|Medium|
 2270|[Number of Ways to Split Array](./solutions/2270-number-of-ways-to-split-array.js)|Medium|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
diff --git a/solutions/2256-minimum-average-difference.js b/solutions/2256-minimum-average-difference.js
new file mode 100644
index 00000000..8c7ebdde
--- /dev/null
+++ b/solutions/2256-minimum-average-difference.js
@@ -0,0 +1,46 @@
+/**
+ * 2256. Minimum Average Difference
+ * https://leetcode.com/problems/minimum-average-difference/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed integer array nums of length n.
+ *
+ * The average difference of the index i is the absolute difference between the average of the
+ * first i + 1 elements of nums and the average of the last n - i - 1 elements. Both averages
+ * should be rounded down to the nearest integer.
+ *
+ * Return the index with the minimum average difference. If there are multiple such indices,
+ * return the smallest one.
+ *
+ * Note:
+ * - The absolute difference of two numbers is the absolute value of their difference.
+ * - The average of n elements is the sum of the n elements divided (integer division) by n.
+ * - The average of 0 elements is considered to be 0.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var minimumAverageDifference = function(nums) {
+  const n = nums.length;
+  let leftSum = 0;
+  let rightSum = nums.reduce((sum, num) => sum + num, 0);
+  let minDiff = Infinity;
+  let result = 0;
+
+  for (let i = 0; i < n; i++) {
+    leftSum += nums[i];
+    rightSum -= nums[i];
+    const leftAvg = Math.floor(leftSum / (i + 1));
+    const rightAvg = i === n - 1 ? 0 : Math.floor(rightSum / (n - i - 1));
+    const diff = Math.abs(leftAvg - rightAvg);
+
+    if (diff < minDiff) {
+      minDiff = diff;
+      result = i;
+    }
+  }
+
+  return result;
+};

From 4146eaf9bf96096cfe4599591c1686cc45178b38 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 13:09:47 -0500
Subject: [PATCH 139/571] Add solution #2257

---
 README.md                                     |  3 +-
 .../2257-count-unguarded-cells-in-the-grid.js | 59 +++++++++++++++++++
 2 files changed, 61 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2257-count-unguarded-cells-in-the-grid.js

diff --git a/README.md b/README.md
index f9d85692..e672a31c 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,847 LeetCode solutions in JavaScript
+# 1,848 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1724,6 +1724,7 @@
 2251|[Number of Flowers in Full Bloom](./solutions/2251-number-of-flowers-in-full-bloom.js)|Hard|
 2255|[Count Prefixes of a Given String](./solutions/2255-count-prefixes-of-a-given-string.js)|Easy|
 2256|[Minimum Average Difference](./solutions/2256-minimum-average-difference.js)|Medium|
+2257|[Count Unguarded Cells in the Grid](./solutions/2257-count-unguarded-cells-in-the-grid.js)|Medium|
 2270|[Number of Ways to Split Array](./solutions/2270-number-of-ways-to-split-array.js)|Medium|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
diff --git a/solutions/2257-count-unguarded-cells-in-the-grid.js b/solutions/2257-count-unguarded-cells-in-the-grid.js
new file mode 100644
index 00000000..87cbde16
--- /dev/null
+++ b/solutions/2257-count-unguarded-cells-in-the-grid.js
@@ -0,0 +1,59 @@
+/**
+ * 2257. Count Unguarded Cells in the Grid
+ * https://leetcode.com/problems/count-unguarded-cells-in-the-grid/
+ * Difficulty: Medium
+ *
+ * You are given two integers m and n representing a 0-indexed m x n grid. You are also given two
+ * 2D integer arrays guards and walls where guards[i] = [rowi, coli] and walls[j] = [rowj, colj]
+ * represent the positions of the ith guard and jth wall respectively.
+ *
+ * A guard can see every cell in the four cardinal directions (north, east, south, or west) starting
+ * from their position unless obstructed by a wall or another guard. A cell is guarded if there is
+ * at least one guard that can see it.
+ *
+ * Return the number of unoccupied cells that are not guarded.
+ */
+
+/**
+ * @param {number} m
+ * @param {number} n
+ * @param {number[][]} guards
+ * @param {number[][]} walls
+ * @return {number}
+ */
+var countUnguarded = function(m, n, guards, walls) {
+  const grid = Array.from({ length: m }, () => Array(n).fill(0));
+
+  for (const [row, col] of walls) {
+    grid[row][col] = 1;
+  }
+  for (const [row, col] of guards) {
+    grid[row][col] = 2;
+  }
+
+  for (const [row, col] of guards) {
+    for (let i = row - 1; i >= 0 && grid[i][col] !== 1 && grid[i][col] !== 2; i--) {
+      grid[i][col] = 3;
+    }
+    for (let i = row + 1; i < m && grid[i][col] !== 1 && grid[i][col] !== 2; i++) {
+      grid[i][col] = 3;
+    }
+    for (let j = col - 1; j >= 0 && grid[row][j] !== 1 && grid[row][j] !== 2; j--) {
+      grid[row][j] = 3;
+    }
+    for (let j = col + 1; j < n && grid[row][j] !== 1 && grid[row][j] !== 2; j++) {
+      grid[row][j] = 3;
+    }
+  }
+
+  let result = 0;
+  for (let i = 0; i < m; i++) {
+    for (let j = 0; j < n; j++) {
+      if (grid[i][j] === 0) {
+        result++;
+      }
+    }
+  }
+
+  return result;
+};

From 8ba1878f05b37ce5aeab2f56e6c4177bd26eba65 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 13:10:36 -0500
Subject: [PATCH 140/571] Add solution #2259

---
 README.md                                     |  3 +-
 ...ve-digit-from-number-to-maximize-result.js | 31 +++++++++++++++++++
 2 files changed, 33 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2259-remove-digit-from-number-to-maximize-result.js

diff --git a/README.md b/README.md
index e672a31c..667590b8 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,848 LeetCode solutions in JavaScript
+# 1,849 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1725,6 +1725,7 @@
 2255|[Count Prefixes of a Given String](./solutions/2255-count-prefixes-of-a-given-string.js)|Easy|
 2256|[Minimum Average Difference](./solutions/2256-minimum-average-difference.js)|Medium|
 2257|[Count Unguarded Cells in the Grid](./solutions/2257-count-unguarded-cells-in-the-grid.js)|Medium|
+2259|[Remove Digit From Number to Maximize Result](./solutions/2259-remove-digit-from-number-to-maximize-result.js)|Easy|
 2270|[Number of Ways to Split Array](./solutions/2270-number-of-ways-to-split-array.js)|Medium|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
diff --git a/solutions/2259-remove-digit-from-number-to-maximize-result.js b/solutions/2259-remove-digit-from-number-to-maximize-result.js
new file mode 100644
index 00000000..d9ee4397
--- /dev/null
+++ b/solutions/2259-remove-digit-from-number-to-maximize-result.js
@@ -0,0 +1,31 @@
+/**
+ * 2259. Remove Digit From Number to Maximize Result
+ * https://leetcode.com/problems/remove-digit-from-number-to-maximize-result/
+ * Difficulty: Easy
+ *
+ * You are given a string number representing a positive integer and a character digit.
+ *
+ * Return the resulting string after removing exactly one occurrence of digit from number such that
+ * the value of the resulting string in decimal form is maximized. The test cases are generated such
+ * that digit occurs at least once in number.
+ */
+
+/**
+ * @param {string} number
+ * @param {character} digit
+ * @return {string}
+ */
+var removeDigit = function(number, digit) {
+  let result = '';
+
+  for (let i = 0; i < number.length; i++) {
+    if (number[i] === digit) {
+      const candidate = number.slice(0, i) + number.slice(i + 1);
+      if (candidate > result) {
+        result = candidate;
+      }
+    }
+  }
+
+  return result;
+};

From b72e9d38cbf1c8d8a7eb5174916a97dabfe25d4d Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 13:11:28 -0500
Subject: [PATCH 141/571] Add solution #2260

---
 README.md                                     |  3 +-
 ...60-minimum-consecutive-cards-to-pick-up.js | 29 +++++++++++++++++++
 2 files changed, 31 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2260-minimum-consecutive-cards-to-pick-up.js

diff --git a/README.md b/README.md
index 667590b8..9e1c2d16 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,849 LeetCode solutions in JavaScript
+# 1,850 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1726,6 +1726,7 @@
 2256|[Minimum Average Difference](./solutions/2256-minimum-average-difference.js)|Medium|
 2257|[Count Unguarded Cells in the Grid](./solutions/2257-count-unguarded-cells-in-the-grid.js)|Medium|
 2259|[Remove Digit From Number to Maximize Result](./solutions/2259-remove-digit-from-number-to-maximize-result.js)|Easy|
+2260|[Minimum Consecutive Cards to Pick Up](./solutions/2260-minimum-consecutive-cards-to-pick-up.js)|Medium|
 2270|[Number of Ways to Split Array](./solutions/2270-number-of-ways-to-split-array.js)|Medium|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
diff --git a/solutions/2260-minimum-consecutive-cards-to-pick-up.js b/solutions/2260-minimum-consecutive-cards-to-pick-up.js
new file mode 100644
index 00000000..4463e10c
--- /dev/null
+++ b/solutions/2260-minimum-consecutive-cards-to-pick-up.js
@@ -0,0 +1,29 @@
+/**
+ * 2260. Minimum Consecutive Cards to Pick Up
+ * https://leetcode.com/problems/minimum-consecutive-cards-to-pick-up/
+ * Difficulty: Medium
+ *
+ * You are given an integer array cards where cards[i] represents the value of the ith card. A pair
+ * of cards are matching if the cards have the same value.
+ *
+ * Return the minimum number of consecutive cards you have to pick up to have a pair of matching
+ * cards among the picked cards. If it is impossible to have matching cards, return -1.
+ */
+
+/**
+ * @param {number[]} cards
+ * @return {number}
+ */
+var minimumCardPickup = function(cards) {
+  const map = new Map();
+  let minLength = Infinity;
+
+  for (let i = 0; i < cards.length; i++) {
+    if (map.has(cards[i])) {
+      minLength = Math.min(minLength, i - map.get(cards[i]) + 1);
+    }
+    map.set(cards[i], i);
+  }
+
+  return minLength === Infinity ? -1 : minLength;
+};

From b1ab8f401a9ca70a423fa9662bf19b644d3dc4a1 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 17:27:23 -0500
Subject: [PATCH 142/571] Add solution #2261

---
 README.md                                     |  3 +-
 .../2261-k-divisible-elements-subarrays.js    | 41 +++++++++++++++++++
 2 files changed, 43 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2261-k-divisible-elements-subarrays.js

diff --git a/README.md b/README.md
index 9e1c2d16..516965b1 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,850 LeetCode solutions in JavaScript
+# 1,851 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1727,6 +1727,7 @@
 2257|[Count Unguarded Cells in the Grid](./solutions/2257-count-unguarded-cells-in-the-grid.js)|Medium|
 2259|[Remove Digit From Number to Maximize Result](./solutions/2259-remove-digit-from-number-to-maximize-result.js)|Easy|
 2260|[Minimum Consecutive Cards to Pick Up](./solutions/2260-minimum-consecutive-cards-to-pick-up.js)|Medium|
+2261|[K Divisible Elements Subarrays](./solutions/2261-k-divisible-elements-subarrays.js)|Medium|
 2270|[Number of Ways to Split Array](./solutions/2270-number-of-ways-to-split-array.js)|Medium|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
diff --git a/solutions/2261-k-divisible-elements-subarrays.js b/solutions/2261-k-divisible-elements-subarrays.js
new file mode 100644
index 00000000..72d781d1
--- /dev/null
+++ b/solutions/2261-k-divisible-elements-subarrays.js
@@ -0,0 +1,41 @@
+/**
+ * 2261. K Divisible Elements Subarrays
+ * https://leetcode.com/problems/k-divisible-elements-subarrays/
+ * Difficulty: Medium
+ *
+ * Given an integer array nums and two integers k and p, return the number of distinct subarrays,
+ * which have at most k elements that are divisible by p.
+ *
+ * Two arrays nums1 and nums2 are said to be distinct if:
+ * - They are of different lengths, or
+ * - There exists at least one index i where nums1[i] != nums2[i].
+ *
+ * A subarray is defined as a non-empty contiguous sequence of elements in an array.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} k
+ * @param {number} p
+ * @return {number}
+ */
+var countDistinct = function(nums, k, p) {
+  const n = nums.length;
+  const seen = new Set();
+
+  for (let start = 0; start < n; start++) {
+    const subarray = [];
+    let divisibleCount = 0;
+
+    for (let end = start; end < n; end++) {
+      subarray.push(nums[end]);
+      if (nums[end] % p === 0) divisibleCount++;
+
+      if (divisibleCount <= k) {
+        seen.add(subarray.join(','));
+      }
+    }
+  }
+
+  return seen.size;
+};

From 0cbecf249ca7343439ff783031d15c9864bb4a31 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 17:28:21 -0500
Subject: [PATCH 143/571] Add solution #2262

---
 README.md                                  |  3 ++-
 solutions/2262-total-appeal-of-a-string.js | 31 ++++++++++++++++++++++
 2 files changed, 33 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2262-total-appeal-of-a-string.js

diff --git a/README.md b/README.md
index 516965b1..de36aef9 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,851 LeetCode solutions in JavaScript
+# 1,852 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1728,6 +1728,7 @@
 2259|[Remove Digit From Number to Maximize Result](./solutions/2259-remove-digit-from-number-to-maximize-result.js)|Easy|
 2260|[Minimum Consecutive Cards to Pick Up](./solutions/2260-minimum-consecutive-cards-to-pick-up.js)|Medium|
 2261|[K Divisible Elements Subarrays](./solutions/2261-k-divisible-elements-subarrays.js)|Medium|
+2262|[Total Appeal of A String](./solutions/2262-total-appeal-of-a-string.js)|Hard|
 2270|[Number of Ways to Split Array](./solutions/2270-number-of-ways-to-split-array.js)|Medium|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
diff --git a/solutions/2262-total-appeal-of-a-string.js b/solutions/2262-total-appeal-of-a-string.js
new file mode 100644
index 00000000..20c2e2c3
--- /dev/null
+++ b/solutions/2262-total-appeal-of-a-string.js
@@ -0,0 +1,31 @@
+/**
+ * 2262. Total Appeal of A String
+ * https://leetcode.com/problems/total-appeal-of-a-string/
+ * Difficulty: Hard
+ *
+ * The appeal of a string is the number of distinct characters found in the string.
+ * - For example, the appeal of "abbca" is 3 because it has 3 distinct characters:
+ *   'a', 'b', and 'c'.
+ *
+ * Given a string s, return the total appeal of all of its substrings.
+ *
+ * A substring is a contiguous sequence of characters within a string.
+ */
+
+/**
+ * @param {string} s
+ * @return {number}
+ */
+var appealSum = function(s) {
+  const n = s.length;
+  const lastSeen = new Array(26).fill(-1);
+  let result = 0;
+
+  for (let i = 0; i < n; i++) {
+    const charIndex = s.charCodeAt(i) - 97;
+    result += (i - lastSeen[charIndex]) * (n - i);
+    lastSeen[charIndex] = i;
+  }
+
+  return result;
+};

From defd60c32d58459c977db7fbe14afb1b0cffa067 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 17:29:27 -0500
Subject: [PATCH 144/571] Add solution #2264

---
 README.md                                     |  3 +-
 ...4-largest-3-same-digit-number-in-string.js | 35 +++++++++++++++++++
 2 files changed, 37 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2264-largest-3-same-digit-number-in-string.js

diff --git a/README.md b/README.md
index de36aef9..0d15702c 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,852 LeetCode solutions in JavaScript
+# 1,853 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1729,6 +1729,7 @@
 2260|[Minimum Consecutive Cards to Pick Up](./solutions/2260-minimum-consecutive-cards-to-pick-up.js)|Medium|
 2261|[K Divisible Elements Subarrays](./solutions/2261-k-divisible-elements-subarrays.js)|Medium|
 2262|[Total Appeal of A String](./solutions/2262-total-appeal-of-a-string.js)|Hard|
+2264|[Largest 3-Same-Digit Number in String](./solutions/2264-largest-3-same-digit-number-in-string.js)|Easy|
 2270|[Number of Ways to Split Array](./solutions/2270-number-of-ways-to-split-array.js)|Medium|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
diff --git a/solutions/2264-largest-3-same-digit-number-in-string.js b/solutions/2264-largest-3-same-digit-number-in-string.js
new file mode 100644
index 00000000..ef1df3a9
--- /dev/null
+++ b/solutions/2264-largest-3-same-digit-number-in-string.js
@@ -0,0 +1,35 @@
+/**
+ * 2264. Largest 3-Same-Digit Number in String
+ * https://leetcode.com/problems/largest-3-same-digit-number-in-string/
+ * Difficulty: Easy
+ *
+ * You are given a string num representing a large integer. An integer is good if it meets
+ * the following conditions:
+ * - It is a substring of num with length 3.
+ * - It consists of only one unique digit.
+ *
+ * Return the maximum good integer as a string or an empty string "" if no such integer exists.
+ *
+ * Note:
+ * - A substring is a contiguous sequence of characters within a string.
+ * - There may be leading zeroes in num or a good integer.
+ */
+
+/**
+ * @param {string} num
+ * @return {string}
+ */
+var largestGoodInteger = function(num) {
+  let result = '';
+
+  for (let i = 0; i <= num.length - 3; i++) {
+    const substring = num.slice(i, i + 3);
+    if (substring[0] === substring[1] && substring[1] === substring[2]) {
+      if (substring > result) {
+        result = substring;
+      }
+    }
+  }
+
+  return result;
+};

From 42ff5b20296aa07617e191f7a6614cf77a64a93f Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 17:30:52 -0500
Subject: [PATCH 145/571] Add solution #2265

---
 README.md                                     |  3 +-
 ...count-nodes-equal-to-average-of-subtree.js | 46 +++++++++++++++++++
 2 files changed, 48 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2265-count-nodes-equal-to-average-of-subtree.js

diff --git a/README.md b/README.md
index 0d15702c..ad21ef75 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,853 LeetCode solutions in JavaScript
+# 1,854 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1730,6 +1730,7 @@
 2261|[K Divisible Elements Subarrays](./solutions/2261-k-divisible-elements-subarrays.js)|Medium|
 2262|[Total Appeal of A String](./solutions/2262-total-appeal-of-a-string.js)|Hard|
 2264|[Largest 3-Same-Digit Number in String](./solutions/2264-largest-3-same-digit-number-in-string.js)|Easy|
+2265|[Count Nodes Equal to Average of Subtree](./solutions/2265-count-nodes-equal-to-average-of-subtree.js)|Medium|
 2270|[Number of Ways to Split Array](./solutions/2270-number-of-ways-to-split-array.js)|Medium|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
diff --git a/solutions/2265-count-nodes-equal-to-average-of-subtree.js b/solutions/2265-count-nodes-equal-to-average-of-subtree.js
new file mode 100644
index 00000000..2e3f4cb5
--- /dev/null
+++ b/solutions/2265-count-nodes-equal-to-average-of-subtree.js
@@ -0,0 +1,46 @@
+/**
+ * 2265. Count Nodes Equal to Average of Subtree
+ * https://leetcode.com/problems/count-nodes-equal-to-average-of-subtree/
+ * Difficulty: Medium
+ *
+ * Given the root of a binary tree, return the number of nodes where the value of the node is
+ * equal to the average of the values in its subtree.
+ *
+ * Note:
+ * - The average of n elements is the sum of the n elements divided by n and rounded down to
+ *   the nearest integer.
+ * - A subtree of root is a tree consisting of root and all of its descendants.
+ */
+
+/**
+ * Definition for a binary tree node.
+ * function TreeNode(val, left, right) {
+ *     this.val = (val===undefined ? 0 : val)
+ *     this.left = (left===undefined ? null : left)
+ *     this.right = (right===undefined ? null : right)
+ * }
+ */
+/**
+ * @param {TreeNode} root
+ * @return {number}
+ */
+var averageOfSubtree = function(root) {
+  let count = 0;
+  traverse(root);
+  return count;
+
+  function traverse(node) {
+    if (!node) return [0, 0];
+
+    const [leftSum, leftCount] = traverse(node.left);
+    const [rightSum, rightCount] = traverse(node.right);
+    const totalSum = leftSum + rightSum + node.val;
+    const totalCount = leftCount + rightCount + 1;
+
+    if (Math.floor(totalSum / totalCount) === node.val) {
+      count++;
+    }
+
+    return [totalSum, totalCount];
+  }
+};

From e26d2c21e5513b34da858c4985f0a9b4f0b7dc88 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 17:33:01 -0500
Subject: [PATCH 146/571] Add solution #2266

---
 README.md                               |  3 +-
 solutions/2266-count-number-of-texts.js | 57 +++++++++++++++++++++++++
 2 files changed, 59 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2266-count-number-of-texts.js

diff --git a/README.md b/README.md
index ad21ef75..7fb2b1a2 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,854 LeetCode solutions in JavaScript
+# 1,855 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1731,6 +1731,7 @@
 2262|[Total Appeal of A String](./solutions/2262-total-appeal-of-a-string.js)|Hard|
 2264|[Largest 3-Same-Digit Number in String](./solutions/2264-largest-3-same-digit-number-in-string.js)|Easy|
 2265|[Count Nodes Equal to Average of Subtree](./solutions/2265-count-nodes-equal-to-average-of-subtree.js)|Medium|
+2266|[Count Number of Texts](./solutions/2266-count-number-of-texts.js)|Medium|
 2270|[Number of Ways to Split Array](./solutions/2270-number-of-ways-to-split-array.js)|Medium|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
diff --git a/solutions/2266-count-number-of-texts.js b/solutions/2266-count-number-of-texts.js
new file mode 100644
index 00000000..d2f9cf84
--- /dev/null
+++ b/solutions/2266-count-number-of-texts.js
@@ -0,0 +1,57 @@
+/**
+ * 2266. Count Number of Texts
+ * https://leetcode.com/problems/count-number-of-texts/
+ * Difficulty: Medium
+ *
+ * Alice is texting Bob using her phone. The mapping of digits to letters is shown in the
+ * figure below.
+ *
+ * In order to add a letter, Alice has to press the key of the corresponding digit i times,
+ * where i is the position of the letter in the key.
+ * - For example, to add the letter 's', Alice has to press '7' four times. Similarly, to
+ *   add the letter 'k', Alice has to press '5' twice.
+ * - Note that the digits '0' and '1' do not map to any letters, so Alice does not use them.
+ *
+ * However, due to an error in transmission, Bob did not receive Alice's text message but
+ * received a string of pressed keys instead.
+ * - For example, when Alice sent the message "bob", Bob received the string "2266622".
+ *
+ * Given a string pressedKeys representing the string received by Bob, return the total
+ * number of possible text messages Alice could have sent.
+ *
+ * Since the answer may be very large, return it modulo 109 + 7.
+ */
+
+/**
+ * @param {string} pressedKeys
+ * @return {number}
+ */
+var countTexts = function(pressedKeys) {
+  const mod = 1e9 + 7;
+  const maxGroup = pressedKeys.length;
+  const dp = new Array(maxGroup + 1).fill(0);
+  dp[0] = 1;
+
+  const map = new Map([
+    ['2', 3], ['3', 3], ['4', 3], ['5', 3],
+    ['6', 3], ['7', 4], ['8', 3], ['9', 4]
+  ]);
+
+  for (let i = 1; i <= maxGroup; i++) {
+    dp[i] = dp[i - 1];
+    if (i >= 2 && pressedKeys[i - 1] === pressedKeys[i - 2]) {
+      dp[i] = (dp[i] + dp[i - 2]) % mod;
+    }
+    if (i >= 3 && pressedKeys[i - 1] === pressedKeys[i - 2]
+        && pressedKeys[i - 2] === pressedKeys[i - 3]) {
+      dp[i] = (dp[i] + dp[i - 3]) % mod;
+    }
+    if (i >= 4 && pressedKeys[i - 1] === pressedKeys[i - 2]
+        && pressedKeys[i - 2] === pressedKeys[i - 3]
+        && pressedKeys[i - 3] === pressedKeys[i - 4] && map.get(pressedKeys[i - 1]) === 4) {
+      dp[i] = (dp[i] + dp[i - 4]) % mod;
+    }
+  }
+
+  return dp[maxGroup];
+};

From f3626d68faa42436fcf1e27e1de1d463a354c3c8 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 17:42:20 -0500
Subject: [PATCH 147/571] Add solution #2269

---
 README.md                                     |  3 +-
 .../2269-find-the-k-beauty-of-a-number.js     | 37 +++++++++++++++++++
 2 files changed, 39 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2269-find-the-k-beauty-of-a-number.js

diff --git a/README.md b/README.md
index 7fb2b1a2..9e1649b8 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,855 LeetCode solutions in JavaScript
+# 1,856 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1732,6 +1732,7 @@
 2264|[Largest 3-Same-Digit Number in String](./solutions/2264-largest-3-same-digit-number-in-string.js)|Easy|
 2265|[Count Nodes Equal to Average of Subtree](./solutions/2265-count-nodes-equal-to-average-of-subtree.js)|Medium|
 2266|[Count Number of Texts](./solutions/2266-count-number-of-texts.js)|Medium|
+2269|[Find the K-Beauty of a Number](./solutions/2269-find-the-k-beauty-of-a-number.js)|Easy|
 2270|[Number of Ways to Split Array](./solutions/2270-number-of-ways-to-split-array.js)|Medium|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
diff --git a/solutions/2269-find-the-k-beauty-of-a-number.js b/solutions/2269-find-the-k-beauty-of-a-number.js
new file mode 100644
index 00000000..3027e4d4
--- /dev/null
+++ b/solutions/2269-find-the-k-beauty-of-a-number.js
@@ -0,0 +1,37 @@
+/**
+ * 2269. Find the K-Beauty of a Number
+ * https://leetcode.com/problems/find-the-k-beauty-of-a-number/
+ * Difficulty: Easy
+ *
+ * The k-beauty of an integer num is defined as the number of substrings of num when it is
+ * read as a string that meet the following conditions:
+ * - It has a length of k.
+ * - It is a divisor of num.
+ *
+ * Given integers num and k, return the k-beauty of num.
+ *
+ * Note:
+ * - Leading zeros are allowed.
+ * - 0 is not a divisor of any value.
+ *
+ * A substring is a contiguous sequence of characters in a string.
+ */
+
+/**
+ * @param {number} num
+ * @param {number} k
+ * @return {number}
+ */
+var divisorSubstrings = function(num, k) {
+  const numStr = num.toString();
+  let result = 0;
+
+  for (let i = 0; i <= numStr.length - k; i++) {
+    const substring = parseInt(numStr.slice(i, i + k));
+    if (substring !== 0 && num % substring === 0) {
+      result++;
+    }
+  }
+
+  return result;
+};

From 9695466262b7891e8b4f53c85afb43be96af83eb Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 17:44:59 -0500
Subject: [PATCH 148/571] Add solution #2272

---
 README.md                                     |  3 +-
 .../2272-substring-with-largest-variance.js   | 84 +++++++++++++++++++
 2 files changed, 86 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2272-substring-with-largest-variance.js

diff --git a/README.md b/README.md
index 9e1649b8..13de9226 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,856 LeetCode solutions in JavaScript
+# 1,857 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1734,6 +1734,7 @@
 2266|[Count Number of Texts](./solutions/2266-count-number-of-texts.js)|Medium|
 2269|[Find the K-Beauty of a Number](./solutions/2269-find-the-k-beauty-of-a-number.js)|Easy|
 2270|[Number of Ways to Split Array](./solutions/2270-number-of-ways-to-split-array.js)|Medium|
+2272|[Substring With Largest Variance](./solutions/2272-substring-with-largest-variance.js)|Hard|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
diff --git a/solutions/2272-substring-with-largest-variance.js b/solutions/2272-substring-with-largest-variance.js
new file mode 100644
index 00000000..f11361c2
--- /dev/null
+++ b/solutions/2272-substring-with-largest-variance.js
@@ -0,0 +1,84 @@
+/**
+ * 2272. Substring With Largest Variance
+ * https://leetcode.com/problems/substring-with-largest-variance/
+ * Difficulty: Hard
+ *
+ * The variance of a string is defined as the largest difference between the number of occurrences
+ * of any 2 characters present in the string. Note the two characters may or may not be the same.
+ *
+ * Given a string s consisting of lowercase English letters only, return the largest variance
+ * possible among all substrings of s.
+ *
+ * A substring is a contiguous sequence of characters within a string.
+ */
+
+/**
+ * @param {string} s
+ * @return {number}
+ */
+var largestVariance = function(s) {
+  const map = new Set(s);
+  let result = 0;
+
+  for (const charA of map) {
+    for (const charB of map) {
+      if (charA === charB) continue;
+
+      let countA = 0;
+      let countB = 0;
+      let hasA = false;
+      let hasB = false;
+
+      for (const char of s) {
+        if (char === charA) {
+          countA++;
+          hasA = true;
+        }
+        if (char === charB) {
+          countB++;
+          hasB = true;
+        }
+
+        if (hasA && hasB) {
+          result = Math.max(result, Math.abs(countA - countB));
+        }
+
+        if (countA < countB) {
+          countA = 0;
+          countB = 0;
+          hasA = false;
+          hasB = false;
+        }
+      }
+
+      countA = 0;
+      countB = 0;
+      hasA = false;
+      hasB = false;
+
+      for (let i = s.length - 1; i >= 0; i--) {
+        if (s[i] === charA) {
+          countA++;
+          hasA = true;
+        }
+        if (s[i] === charB) {
+          countB++;
+          hasB = true;
+        }
+
+        if (hasA && hasB) {
+          result = Math.max(result, Math.abs(countA - countB));
+        }
+
+        if (countA < countB) {
+          countA = 0;
+          countB = 0;
+          hasA = false;
+          hasB = false;
+        }
+      }
+    }
+  }
+
+  return result;
+};

From aa1ed0680013994315853869e6b90801d4e6352c Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 19:45:44 -0500
Subject: [PATCH 149/571] Add solution #2273

---
 README.md                                     |  3 +-
 ...resultant-array-after-removing-anagrams.js | 38 +++++++++++++++++++
 2 files changed, 40 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2273-find-resultant-array-after-removing-anagrams.js

diff --git a/README.md b/README.md
index 13de9226..5320448f 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,857 LeetCode solutions in JavaScript
+# 1,858 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1735,6 +1735,7 @@
 2269|[Find the K-Beauty of a Number](./solutions/2269-find-the-k-beauty-of-a-number.js)|Easy|
 2270|[Number of Ways to Split Array](./solutions/2270-number-of-ways-to-split-array.js)|Medium|
 2272|[Substring With Largest Variance](./solutions/2272-substring-with-largest-variance.js)|Hard|
+2273|[Find Resultant Array After Removing Anagrams](./solutions/2273-find-resultant-array-after-removing-anagrams.js)|Easy|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
diff --git a/solutions/2273-find-resultant-array-after-removing-anagrams.js b/solutions/2273-find-resultant-array-after-removing-anagrams.js
new file mode 100644
index 00000000..8e0ef746
--- /dev/null
+++ b/solutions/2273-find-resultant-array-after-removing-anagrams.js
@@ -0,0 +1,38 @@
+/**
+ * 2273. Find Resultant Array After Removing Anagrams
+ * https://leetcode.com/problems/find-resultant-array-after-removing-anagrams/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed string array words, where words[i] consists of lowercase
+ * English letters.
+ *
+ * In one operation, select any index i such that 0 < i < words.length and words[i - 1] and
+ * words[i] are anagrams, and delete words[i] from words. Keep performing this operation as
+ * long as you can select an index that satisfies the conditions.
+ *
+ * Return words after performing all operations. It can be shown that selecting the indices
+ * for each operation in any arbitrary order will lead to the same result.
+ *
+ * An Anagram is a word or phrase formed by rearranging the letters of a different word or
+ * phrase using all the original letters exactly once. For example, "dacb" is an anagram of
+ * "abdc".
+ */
+
+/**
+ * @param {string[]} words
+ * @return {string[]}
+ */
+var removeAnagrams = function(words) {
+  const result = [words[0]];
+
+  for (let i = 1; i < words.length; i++) {
+    const prevSorted = result[result.length - 1].split('').sort().join('');
+    const currSorted = words[i].split('').sort().join('');
+
+    if (prevSorted !== currSorted) {
+      result.push(words[i]);
+    }
+  }
+
+  return result;
+};

From e7d058473e363fa4d11135d2b0a1691ffaf1e768 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 19:46:47 -0500
Subject: [PATCH 150/571] Add solution #2274

---
 README.md                                     |  3 +-
 ...nsecutive-floors-without-special-floors.js | 31 +++++++++++++++++++
 2 files changed, 33 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2274-maximum-consecutive-floors-without-special-floors.js

diff --git a/README.md b/README.md
index 5320448f..fe861daa 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,858 LeetCode solutions in JavaScript
+# 1,859 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1736,6 +1736,7 @@
 2270|[Number of Ways to Split Array](./solutions/2270-number-of-ways-to-split-array.js)|Medium|
 2272|[Substring With Largest Variance](./solutions/2272-substring-with-largest-variance.js)|Hard|
 2273|[Find Resultant Array After Removing Anagrams](./solutions/2273-find-resultant-array-after-removing-anagrams.js)|Easy|
+2274|[Maximum Consecutive Floors Without Special Floors](./solutions/2274-maximum-consecutive-floors-without-special-floors.js)|Medium|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
diff --git a/solutions/2274-maximum-consecutive-floors-without-special-floors.js b/solutions/2274-maximum-consecutive-floors-without-special-floors.js
new file mode 100644
index 00000000..6ccb00f4
--- /dev/null
+++ b/solutions/2274-maximum-consecutive-floors-without-special-floors.js
@@ -0,0 +1,31 @@
+/**
+ * 2274. Maximum Consecutive Floors Without Special Floors
+ * https://leetcode.com/problems/maximum-consecutive-floors-without-special-floors/
+ * Difficulty: Medium
+ *
+ * Alice manages a company and has rented some floors of a building as office space. Alice has
+ * decided some of these floors should be special floors, used for relaxation only.
+ *
+ * You are given two integers bottom and top, which denote that Alice has rented all the floors
+ * from bottom to top (inclusive). You are also given the integer array special, where special[i]
+ * denotes a special floor that Alice has designated for relaxation.
+ *
+ * Return the maximum number of consecutive floors without a special floor.
+ */
+
+/**
+ * @param {number} bottom
+ * @param {number} top
+ * @param {number[]} special
+ * @return {number}
+ */
+var maxConsecutive = function(bottom, top, special) {
+  special.sort((a, b) => a - b);
+  let result = Math.max(special[0] - bottom, top - special[special.length - 1]);
+
+  for (let i = 1; i < special.length; i++) {
+    result = Math.max(result, special[i] - special[i - 1] - 1);
+  }
+
+  return result;
+};

From 26ced39ff1fc97515b16926ae7bb4d22df399b19 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 19:47:48 -0500
Subject: [PATCH 151/571] Add solution #2275

---
 README.md                                     |  3 +-
 ...tion-with-bitwise-and-greater-than-zero.js | 37 +++++++++++++++++++
 2 files changed, 39 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2275-largest-combination-with-bitwise-and-greater-than-zero.js

diff --git a/README.md b/README.md
index fe861daa..8b8fcb01 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,859 LeetCode solutions in JavaScript
+# 1,860 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1737,6 +1737,7 @@
 2272|[Substring With Largest Variance](./solutions/2272-substring-with-largest-variance.js)|Hard|
 2273|[Find Resultant Array After Removing Anagrams](./solutions/2273-find-resultant-array-after-removing-anagrams.js)|Easy|
 2274|[Maximum Consecutive Floors Without Special Floors](./solutions/2274-maximum-consecutive-floors-without-special-floors.js)|Medium|
+2275|[Largest Combination With Bitwise AND Greater Than Zero](./solutions/2275-largest-combination-with-bitwise-and-greater-than-zero.js)|Medium|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
diff --git a/solutions/2275-largest-combination-with-bitwise-and-greater-than-zero.js b/solutions/2275-largest-combination-with-bitwise-and-greater-than-zero.js
new file mode 100644
index 00000000..e75f68d3
--- /dev/null
+++ b/solutions/2275-largest-combination-with-bitwise-and-greater-than-zero.js
@@ -0,0 +1,37 @@
+/**
+ * 2275. Largest Combination With Bitwise AND Greater Than Zero
+ * https://leetcode.com/problems/largest-combination-with-bitwise-and-greater-than-zero/
+ * Difficulty: Medium
+ *
+ * The bitwise AND of an array nums is the bitwise AND of all integers in nums.
+ * - For example, for nums = [1, 5, 3], the bitwise AND is equal to 1 & 5 & 3 = 1.
+ * - Also, for nums = [7], the bitwise AND is 7.
+ *
+ * You are given an array of positive integers candidates. Compute the bitwise AND for all
+ * possible combinations of elements in the candidates array.
+ *
+ * Return the size of the largest combination of candidates with a bitwise AND greater than 0.
+ */
+
+/**
+ * @param {number[]} candidates
+ * @return {number}
+ */
+var largestCombination = function(candidates) {
+  const bitCounts = new Array(32).fill(0);
+  let result = 0;
+
+  for (const num of candidates) {
+    for (let i = 0; i < 32; i++) {
+      if (num & (1 << i)) {
+        bitCounts[i]++;
+      }
+    }
+  }
+
+  for (const count of bitCounts) {
+    result = Math.max(result, count);
+  }
+
+  return result;
+};

From 603ea0f88924c1b90c6a6b86575e44e3cfbec614 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 20:40:10 -0500
Subject: [PATCH 152/571] Add solution #2278

---
 README.md                                       |  3 ++-
 .../2278-percentage-of-letter-in-string.js      | 17 +++++++++++++++++
 2 files changed, 19 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2278-percentage-of-letter-in-string.js

diff --git a/README.md b/README.md
index 8b8fcb01..07cfcb95 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,860 LeetCode solutions in JavaScript
+# 1,861 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1738,6 +1738,7 @@
 2273|[Find Resultant Array After Removing Anagrams](./solutions/2273-find-resultant-array-after-removing-anagrams.js)|Easy|
 2274|[Maximum Consecutive Floors Without Special Floors](./solutions/2274-maximum-consecutive-floors-without-special-floors.js)|Medium|
 2275|[Largest Combination With Bitwise AND Greater Than Zero](./solutions/2275-largest-combination-with-bitwise-and-greater-than-zero.js)|Medium|
+2278|[Percentage of Letter in String](./solutions/2278-percentage-of-letter-in-string.js)|Easy|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
diff --git a/solutions/2278-percentage-of-letter-in-string.js b/solutions/2278-percentage-of-letter-in-string.js
new file mode 100644
index 00000000..fb3dfdbb
--- /dev/null
+++ b/solutions/2278-percentage-of-letter-in-string.js
@@ -0,0 +1,17 @@
+/**
+ * 2278. Percentage of Letter in String
+ * https://leetcode.com/problems/percentage-of-letter-in-string/
+ * Difficulty: Easy
+ *
+ * Given a string s and a character letter, return the percentage of characters in s that equal
+ * letter rounded down to the nearest whole percent.
+ */
+
+/**
+ * @param {string} s
+ * @param {character} letter
+ * @return {number}
+ */
+var percentageLetter = function(s, letter) {
+  return Math.floor((s.split('').filter(char => char === letter).length / s.length) * 100);
+};

From 10285bf610a2d9291473bcf5f3f13cfdbd25aecc Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 20:41:09 -0500
Subject: [PATCH 153/571] Add solution #2279

---
 README.md                                     |  3 +-
 ...aximum-bags-with-full-capacity-of-rocks.js | 38 +++++++++++++++++++
 2 files changed, 40 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2279-maximum-bags-with-full-capacity-of-rocks.js

diff --git a/README.md b/README.md
index 07cfcb95..a4a55b76 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,861 LeetCode solutions in JavaScript
+# 1,862 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1739,6 +1739,7 @@
 2274|[Maximum Consecutive Floors Without Special Floors](./solutions/2274-maximum-consecutive-floors-without-special-floors.js)|Medium|
 2275|[Largest Combination With Bitwise AND Greater Than Zero](./solutions/2275-largest-combination-with-bitwise-and-greater-than-zero.js)|Medium|
 2278|[Percentage of Letter in String](./solutions/2278-percentage-of-letter-in-string.js)|Easy|
+2279|[Maximum Bags With Full Capacity of Rocks](./solutions/2279-maximum-bags-with-full-capacity-of-rocks.js)|Medium|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
diff --git a/solutions/2279-maximum-bags-with-full-capacity-of-rocks.js b/solutions/2279-maximum-bags-with-full-capacity-of-rocks.js
new file mode 100644
index 00000000..77d36c1a
--- /dev/null
+++ b/solutions/2279-maximum-bags-with-full-capacity-of-rocks.js
@@ -0,0 +1,38 @@
+/**
+ * 2279. Maximum Bags With Full Capacity of Rocks
+ * https://leetcode.com/problems/maximum-bags-with-full-capacity-of-rocks/
+ * Difficulty: Medium
+ *
+ * You have n bags numbered from 0 to n - 1. You are given two 0-indexed integer arrays capacity
+ * and rocks. The ith bag can hold a maximum of capacity[i] rocks and currently contains rocks[i]
+ * rocks. You are also given an integer additionalRocks, the number of additional rocks you can
+ * place in any of the bags.
+ *
+ * Return the maximum number of bags that could have full capacity after placing the additional
+ * rocks in some bags.
+ */
+
+/**
+ * @param {number[]} capacity
+ * @param {number[]} rocks
+ * @param {number} additionalRocks
+ * @return {number}
+ */
+var maximumBags = function(capacity, rocks, additionalRocks) {
+  const remaining = capacity.map((cap, i) => cap - rocks[i]);
+  remaining.sort((a, b) => a - b);
+
+  let result = 0;
+  let rocksLeft = additionalRocks;
+
+  for (const needed of remaining) {
+    if (needed <= rocksLeft) {
+      result++;
+      rocksLeft -= needed;
+    } else {
+      break;
+    }
+  }
+
+  return result;
+};

From b2ac97eff0c92379f9e6a7516c69336594800c98 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 20:41:59 -0500
Subject: [PATCH 154/571] Add solution #2283

---
 README.md                                     |  3 +-
 ...r-has-equal-digit-count-and-digit-value.js | 30 +++++++++++++++++++
 2 files changed, 32 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2283-check-if-number-has-equal-digit-count-and-digit-value.js

diff --git a/README.md b/README.md
index a4a55b76..8b2a5cbb 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,862 LeetCode solutions in JavaScript
+# 1,863 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1740,6 +1740,7 @@
 2275|[Largest Combination With Bitwise AND Greater Than Zero](./solutions/2275-largest-combination-with-bitwise-and-greater-than-zero.js)|Medium|
 2278|[Percentage of Letter in String](./solutions/2278-percentage-of-letter-in-string.js)|Easy|
 2279|[Maximum Bags With Full Capacity of Rocks](./solutions/2279-maximum-bags-with-full-capacity-of-rocks.js)|Medium|
+2283|[Check if Number Has Equal Digit Count and Digit Value](./solutions/2283-check-if-number-has-equal-digit-count-and-digit-value.js)|Easy|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
diff --git a/solutions/2283-check-if-number-has-equal-digit-count-and-digit-value.js b/solutions/2283-check-if-number-has-equal-digit-count-and-digit-value.js
new file mode 100644
index 00000000..ea342877
--- /dev/null
+++ b/solutions/2283-check-if-number-has-equal-digit-count-and-digit-value.js
@@ -0,0 +1,30 @@
+/**
+ * 2283. Check if Number Has Equal Digit Count and Digit Value
+ * https://leetcode.com/problems/check-if-number-has-equal-digit-count-and-digit-value/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed string num of length n consisting of digits.
+ *
+ * Return true if for every index i in the range 0 <= i < n, the digit i occurs num[i] times in num,
+ * otherwise return false.
+ */
+
+/**
+ * @param {string} num
+ * @return {boolean}
+ */
+var digitCount = function(num) {
+  const frequency = new Array(10).fill(0);
+
+  for (const digit of num) {
+    frequency[digit]++;
+  }
+
+  for (let i = 0; i < num.length; i++) {
+    if (frequency[i] !== Number(num[i])) {
+      return false;
+    }
+  }
+
+  return true;
+};

From 9c6840c5bd51f1af749efd13ace93dd91487e070 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 20:43:25 -0500
Subject: [PATCH 155/571] Add solution #2284

---
 README.md                                     |  3 +-
 .../2284-sender-with-largest-word-count.js    | 44 +++++++++++++++++++
 2 files changed, 46 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2284-sender-with-largest-word-count.js

diff --git a/README.md b/README.md
index 8b2a5cbb..1b1545d5 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,863 LeetCode solutions in JavaScript
+# 1,864 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1741,6 +1741,7 @@
 2278|[Percentage of Letter in String](./solutions/2278-percentage-of-letter-in-string.js)|Easy|
 2279|[Maximum Bags With Full Capacity of Rocks](./solutions/2279-maximum-bags-with-full-capacity-of-rocks.js)|Medium|
 2283|[Check if Number Has Equal Digit Count and Digit Value](./solutions/2283-check-if-number-has-equal-digit-count-and-digit-value.js)|Easy|
+2284|[Sender With Largest Word Count](./solutions/2284-sender-with-largest-word-count.js)|Medium|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
diff --git a/solutions/2284-sender-with-largest-word-count.js b/solutions/2284-sender-with-largest-word-count.js
new file mode 100644
index 00000000..d4c02260
--- /dev/null
+++ b/solutions/2284-sender-with-largest-word-count.js
@@ -0,0 +1,44 @@
+/**
+ * 2284. Sender With Largest Word Count
+ * https://leetcode.com/problems/sender-with-largest-word-count/
+ * Difficulty: Medium
+ *
+ * You have a chat log of n messages. You are given two string arrays messages and senders
+ * where messages[i] is a message sent by senders[i].
+ *
+ * A message is list of words that are separated by a single space with no leading or trailing
+ * spaces. The word count of a sender is the total number of words sent by the sender. Note
+ * that a sender may send more than one message.
+ *
+ * Return the sender with the largest word count. If there is more than one sender with the
+ * largest word count, return the one with the lexicographically largest name.
+ *
+ * Note:
+ * - Uppercase letters come before lowercase letters in lexicographical order.
+ * - "Alice" and "alice" are distinct.
+ */
+
+/**
+ * @param {string[]} messages
+ * @param {string[]} senders
+ * @return {string}
+ */
+var largestWordCount = function(messages, senders) {
+  const map = new Map();
+  let maxWords = 0;
+  let result = '';
+
+  for (let i = 0; i < messages.length; i++) {
+    const wordCount = messages[i].split(' ').length;
+    const sender = senders[i];
+    const totalWords = (map.get(sender) || 0) + wordCount;
+    map.set(sender, totalWords);
+
+    if (totalWords > maxWords || (totalWords === maxWords && sender > result)) {
+      maxWords = totalWords;
+      result = sender;
+    }
+  }
+
+  return result;
+};

From f9a5eae08cb8c4cc0c3bc31ae007295fd79d7bec Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 20:45:14 -0500
Subject: [PATCH 156/571] Add solution #2287

---
 README.md                                     |  3 +-
 ...rrange-characters-to-make-target-string.js | 38 +++++++++++++++++++
 2 files changed, 40 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2287-rearrange-characters-to-make-target-string.js

diff --git a/README.md b/README.md
index 1b1545d5..5586cabc 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,864 LeetCode solutions in JavaScript
+# 1,865 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1742,6 +1742,7 @@
 2279|[Maximum Bags With Full Capacity of Rocks](./solutions/2279-maximum-bags-with-full-capacity-of-rocks.js)|Medium|
 2283|[Check if Number Has Equal Digit Count and Digit Value](./solutions/2283-check-if-number-has-equal-digit-count-and-digit-value.js)|Easy|
 2284|[Sender With Largest Word Count](./solutions/2284-sender-with-largest-word-count.js)|Medium|
+2287|[Rearrange Characters to Make Target String](./solutions/2287-rearrange-characters-to-make-target-string.js)|Easy|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
diff --git a/solutions/2287-rearrange-characters-to-make-target-string.js b/solutions/2287-rearrange-characters-to-make-target-string.js
new file mode 100644
index 00000000..310eb5a2
--- /dev/null
+++ b/solutions/2287-rearrange-characters-to-make-target-string.js
@@ -0,0 +1,38 @@
+/**
+ * 2287. Rearrange Characters to Make Target String
+ * https://leetcode.com/problems/rearrange-characters-to-make-target-string/
+ * Difficulty: Easy
+ *
+ * You are given two 0-indexed strings s and target. You can take some letters from s and
+ * rearrange them to form new strings.
+ *
+ * Return the maximum number of copies of target that can be formed by taking letters from
+ * s and rearranging them.
+ */
+
+/**
+ * @param {string} s
+ * @param {string} target
+ * @return {number}
+ */
+var rearrangeCharacters = function(s, target) {
+  const sourceFreq = new Array(26).fill(0);
+  const targetFreq = new Array(26).fill(0);
+
+  for (const char of s) {
+    sourceFreq[char.charCodeAt(0) - 97]++;
+  }
+
+  for (const char of target) {
+    targetFreq[char.charCodeAt(0) - 97]++;
+  }
+
+  let result = Infinity;
+  for (let i = 0; i < 26; i++) {
+    if (targetFreq[i] > 0) {
+      result = Math.min(result, Math.floor(sourceFreq[i] / targetFreq[i]));
+    }
+  }
+
+  return result;
+};

From 5d98f1105e783c3cc8efb75adef5be770c6d0d08 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 20:53:39 -0500
Subject: [PATCH 157/571] Add solution #2293

---
 README.md                      |  3 ++-
 solutions/2293-min-max-game.js | 43 ++++++++++++++++++++++++++++++++++
 2 files changed, 45 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2293-min-max-game.js

diff --git a/README.md b/README.md
index 5586cabc..20098bd8 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,865 LeetCode solutions in JavaScript
+# 1,866 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1743,6 +1743,7 @@
 2283|[Check if Number Has Equal Digit Count and Digit Value](./solutions/2283-check-if-number-has-equal-digit-count-and-digit-value.js)|Easy|
 2284|[Sender With Largest Word Count](./solutions/2284-sender-with-largest-word-count.js)|Medium|
 2287|[Rearrange Characters to Make Target String](./solutions/2287-rearrange-characters-to-make-target-string.js)|Easy|
+2293|[Min Max Game](./solutions/2293-min-max-game.js)|Easy|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
diff --git a/solutions/2293-min-max-game.js b/solutions/2293-min-max-game.js
new file mode 100644
index 00000000..b6952f9c
--- /dev/null
+++ b/solutions/2293-min-max-game.js
@@ -0,0 +1,43 @@
+/**
+ * 2293. Min Max Game
+ * https://leetcode.com/problems/min-max-game/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed integer array nums whose length is a power of 2.
+ *
+ * Apply the following algorithm on nums:
+ * 1. Let n be the length of nums. If n == 1, end the process. Otherwise, create a new 0-indexed
+ *    integer array newNums of length n / 2.
+ * 2. For every even index i where 0 <= i < n / 2, assign the value of newNums[i] as
+ *    min(nums[2 * i], nums[2 * i + 1]).
+ * 3. For every odd index i where 0 <= i < n / 2, assign the value of newNums[i] as
+ *    max(nums[2 * i], nums[2 * i + 1]).
+ * 4. Replace the array nums with newNums.
+ * 5. Repeat the entire process starting from step 1.
+ *
+ * Return the last number that remains in nums after applying the algorithm.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var minMaxGame = function(nums) {
+  let array = nums.slice();
+
+  while (array.length > 1) {
+    const newArray = new Array(array.length / 2);
+
+    for (let i = 0; i < newArray.length; i++) {
+      if (i % 2 === 0) {
+        newArray[i] = Math.min(array[2 * i], array[2 * i + 1]);
+      } else {
+        newArray[i] = Math.max(array[2 * i], array[2 * i + 1]);
+      }
+    }
+
+    array = newArray;
+  }
+
+  return array[0];
+};

From 9560c8e8ab9ca1c761aa48f57c06955670b9b620 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 20:55:00 -0500
Subject: [PATCH 158/571] Add solution #2294

---
 README.md                                     |  3 +-
 ...array-such-that-maximum-difference-is-k.js | 34 +++++++++++++++++++
 2 files changed, 36 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2294-partition-array-such-that-maximum-difference-is-k.js

diff --git a/README.md b/README.md
index 20098bd8..123afe93 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,866 LeetCode solutions in JavaScript
+# 1,867 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1744,6 +1744,7 @@
 2284|[Sender With Largest Word Count](./solutions/2284-sender-with-largest-word-count.js)|Medium|
 2287|[Rearrange Characters to Make Target String](./solutions/2287-rearrange-characters-to-make-target-string.js)|Easy|
 2293|[Min Max Game](./solutions/2293-min-max-game.js)|Easy|
+2294|[Partition Array Such That Maximum Difference Is K](./solutions/2294-partition-array-such-that-maximum-difference-is-k.js)|Medium|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
diff --git a/solutions/2294-partition-array-such-that-maximum-difference-is-k.js b/solutions/2294-partition-array-such-that-maximum-difference-is-k.js
new file mode 100644
index 00000000..06cad3ae
--- /dev/null
+++ b/solutions/2294-partition-array-such-that-maximum-difference-is-k.js
@@ -0,0 +1,34 @@
+/**
+ * 2294. Partition Array Such That Maximum Difference Is K
+ * https://leetcode.com/problems/partition-array-such-that-maximum-difference-is-k/
+ * Difficulty: Medium
+ *
+ * You are given an integer array nums and an integer k. You may partition nums into one or more
+ * subsequences such that each element in nums appears in exactly one of the subsequences.
+ *
+ * Return the minimum number of subsequences needed such that the difference between the maximum
+ * and minimum values in each subsequence is at most k.
+ *
+ * A subsequence is a sequence that can be derived from another sequence by deleting some or no
+ * elements without changing the order of the remaining elements.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} k
+ * @return {number}
+ */
+var partitionArray = function(nums, k) {
+  nums.sort((a, b) => a - b);
+  let result = 1;
+  let minValue = nums[0];
+
+  for (let i = 1; i < nums.length; i++) {
+    if (nums[i] - minValue > k) {
+      result++;
+      minValue = nums[i];
+    }
+  }
+
+  return result;
+};

From e4944229a30788511a4a51cf79d39a01918d367b Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 20:56:26 -0500
Subject: [PATCH 159/571] Add solution #2295

---
 README.md                                     |  3 +-
 .../2295-replace-elements-in-an-array.js      | 36 +++++++++++++++++++
 2 files changed, 38 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2295-replace-elements-in-an-array.js

diff --git a/README.md b/README.md
index 123afe93..face1ea6 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,867 LeetCode solutions in JavaScript
+# 1,868 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1745,6 +1745,7 @@
 2287|[Rearrange Characters to Make Target String](./solutions/2287-rearrange-characters-to-make-target-string.js)|Easy|
 2293|[Min Max Game](./solutions/2293-min-max-game.js)|Easy|
 2294|[Partition Array Such That Maximum Difference Is K](./solutions/2294-partition-array-such-that-maximum-difference-is-k.js)|Medium|
+2295|[Replace Elements in an Array](./solutions/2295-replace-elements-in-an-array.js)|Medium|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
diff --git a/solutions/2295-replace-elements-in-an-array.js b/solutions/2295-replace-elements-in-an-array.js
new file mode 100644
index 00000000..de3bbad0
--- /dev/null
+++ b/solutions/2295-replace-elements-in-an-array.js
@@ -0,0 +1,36 @@
+/**
+ * 2295. Replace Elements in an Array
+ * https://leetcode.com/problems/replace-elements-in-an-array/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed array nums that consists of n distinct positive integers.
+ * Apply m operations to this array, where in the ith operation you replace the number
+ * operations[i][0] with operations[i][1].
+ *
+ * It is guaranteed that in the ith operation:
+ * - operations[i][0] exists in nums.
+ * - operations[i][1] does not exist in nums.
+ *
+ * Return the array obtained after applying all the operations.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number[][]} operations
+ * @return {number[]}
+ */
+var arrayChange = function(nums, operations) {
+  const map = new Map();
+  for (let i = 0; i < nums.length; i++) {
+    map.set(nums[i], i);
+  }
+
+  for (const [oldVal, newVal] of operations) {
+    const index = map.get(oldVal);
+    nums[index] = newVal;
+    map.set(newVal, index);
+    map.delete(oldVal);
+  }
+
+  return nums;
+};

From 76e54c83cef14fd7345d5da70daeadb0e2e33347 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 21:01:28 -0500
Subject: [PATCH 160/571] Add solution #2296

---
 README.md                              |  3 +-
 solutions/2296-design-a-text-editor.js | 78 ++++++++++++++++++++++++++
 2 files changed, 80 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2296-design-a-text-editor.js

diff --git a/README.md b/README.md
index face1ea6..ad76b866 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,868 LeetCode solutions in JavaScript
+# 1,869 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1746,6 +1746,7 @@
 2293|[Min Max Game](./solutions/2293-min-max-game.js)|Easy|
 2294|[Partition Array Such That Maximum Difference Is K](./solutions/2294-partition-array-such-that-maximum-difference-is-k.js)|Medium|
 2295|[Replace Elements in an Array](./solutions/2295-replace-elements-in-an-array.js)|Medium|
+2296|[Design a Text Editor](./solutions/2296-design-a-text-editor.js)|Hard|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
diff --git a/solutions/2296-design-a-text-editor.js b/solutions/2296-design-a-text-editor.js
new file mode 100644
index 00000000..6020598d
--- /dev/null
+++ b/solutions/2296-design-a-text-editor.js
@@ -0,0 +1,78 @@
+/**
+ * 2296. Design a Text Editor
+ * https://leetcode.com/problems/design-a-text-editor/
+ * Difficulty: Hard
+ *
+ * Design a text editor with a cursor that can do the following:
+ * - Add text to where the cursor is.
+ * - Delete text from where the cursor is (simulating the backspace key).
+ * - Move the cursor either left or right.
+ *
+ * When deleting text, only characters to the left of the cursor will be deleted. The cursor
+ * will also remain within the actual text and cannot be moved beyond it. More formally,
+ * we have that 0 <= cursor.position <= currentText.length always holds.
+ *
+ * Implement the TextEditor class:
+ * - TextEditor() Initializes the object with empty text.
+ * - void addText(string text) Appends text to where the cursor is. The cursor ends to the
+ *   right of text.
+ * - int deleteText(int k) Deletes k characters to the left of the cursor. Returns the number
+ *   of characters actually deleted.
+ * - string cursorLeft(int k) Moves the cursor to the left k times. Returns the last
+ *   min(10, len) characters to the left of the cursor, where len is the number of characters
+ *   to the left of the cursor.
+ * - string cursorRight(int k) Moves the cursor to the right k times. Returns the last
+ *   min(10, len) characters to the left of the cursor, where len is the number of characters
+ *   to the left of the cursor.
+ */
+
+var TextEditor = function() {
+  this.left = [];
+  this.right = [];
+};
+
+/**
+ * @param {string} text
+ * @return {void}
+ */
+TextEditor.prototype.addText = function(text) {
+  for (const char of text) {
+    this.left.push(char);
+  }
+};
+
+/**
+ * @param {number} k
+ * @return {number}
+ */
+TextEditor.prototype.deleteText = function(k) {
+  const deleteCount = Math.min(k, this.left.length);
+  for (let i = 0; i < deleteCount; i++) {
+    this.left.pop();
+  }
+  return deleteCount;
+};
+
+/**
+ * @param {number} k
+ * @return {string}
+ */
+TextEditor.prototype.cursorLeft = function(k) {
+  for (let i = 0; i < k && this.left.length; i++) {
+    this.right.push(this.left.pop());
+  }
+  const start = Math.max(0, this.left.length - 10);
+  return this.left.slice(start).join('');
+};
+
+/**
+ * @param {number} k
+ * @return {string}
+ */
+TextEditor.prototype.cursorRight = function(k) {
+  for (let i = 0; i < k && this.right.length; i++) {
+    this.left.push(this.right.pop());
+  }
+  const start = Math.max(0, this.left.length - 10);
+  return this.left.slice(start).join('');
+};

From 7911c57fd8519c070d505ee481a0e9757f718d41 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 17 May 2025 21:03:05 -0500
Subject: [PATCH 161/571] Add solution #2299

---
 README.md                                    |  3 +-
 solutions/2299-strong-password-checker-ii.js | 43 ++++++++++++++++++++
 2 files changed, 45 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2299-strong-password-checker-ii.js

diff --git a/README.md b/README.md
index ad76b866..d89e94ae 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,869 LeetCode solutions in JavaScript
+# 1,870 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1747,6 +1747,7 @@
 2294|[Partition Array Such That Maximum Difference Is K](./solutions/2294-partition-array-such-that-maximum-difference-is-k.js)|Medium|
 2295|[Replace Elements in an Array](./solutions/2295-replace-elements-in-an-array.js)|Medium|
 2296|[Design a Text Editor](./solutions/2296-design-a-text-editor.js)|Hard|
+2299|[Strong Password Checker II](./solutions/2299-strong-password-checker-ii.js)|Easy|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
diff --git a/solutions/2299-strong-password-checker-ii.js b/solutions/2299-strong-password-checker-ii.js
new file mode 100644
index 00000000..f96fac07
--- /dev/null
+++ b/solutions/2299-strong-password-checker-ii.js
@@ -0,0 +1,43 @@
+/**
+ * 2299. Strong Password Checker II
+ * https://leetcode.com/problems/strong-password-checker-ii/
+ * Difficulty: Easy
+ *
+ * A password is said to be strong if it satisfies all the following criteria:
+ * - It has at least 8 characters.
+ * - It contains at least one lowercase letter.
+ * - It contains at least one uppercase letter.
+ * - It contains at least one digit.
+ * - It contains at least one special character. The special characters are the characters
+ *   in the following string: "!@#$%^&*()-+".
+ * - It does not contain 2 of the same character in adjacent positions (i.e., "aab" violates
+ *   this condition, but "aba" does not).
+ *
+ * Given a string password, return true if it is a strong password. Otherwise, return false.
+ */
+
+/**
+ * @param {string} password
+ * @return {boolean}
+ */
+var strongPasswordCheckerII = function(password) {
+  if (password.length < 8) return false;
+
+  let hasLower = false;
+  let hasUpper = false;
+  let hasDigit = false;
+  let hasSpecial = false;
+  const set = new Set(['!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '-', '+']);
+
+  for (let i = 0; i < password.length; i++) {
+    if (i > 0 && password[i] === password[i - 1]) return false;
+
+    const char = password[i];
+    if (/[a-z]/.test(char)) hasLower = true;
+    else if (/[A-Z]/.test(char)) hasUpper = true;
+    else if (/\d/.test(char)) hasDigit = true;
+    else if (set.has(char)) hasSpecial = true;
+  }
+
+  return hasLower && hasUpper && hasDigit && hasSpecial;
+};

From f844ba96ba27b17fb5c0b1c84e6707c4555287f8 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 18 May 2025 00:17:57 -0500
Subject: [PATCH 162/571] Add solution #2301

---
 README.md                                     |  3 +-
 .../2301-match-substring-after-replacement.js | 50 +++++++++++++++++++
 2 files changed, 52 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2301-match-substring-after-replacement.js

diff --git a/README.md b/README.md
index d89e94ae..68498fe0 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,870 LeetCode solutions in JavaScript
+# 1,871 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1749,6 +1749,7 @@
 2296|[Design a Text Editor](./solutions/2296-design-a-text-editor.js)|Hard|
 2299|[Strong Password Checker II](./solutions/2299-strong-password-checker-ii.js)|Easy|
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
+2301|[Match Substring After Replacement](./solutions/2301-match-substring-after-replacement.js)|Hard|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
 2338|[Count the Number of Ideal Arrays](./solutions/2338-count-the-number-of-ideal-arrays.js)|Hard|
diff --git a/solutions/2301-match-substring-after-replacement.js b/solutions/2301-match-substring-after-replacement.js
new file mode 100644
index 00000000..fc7e5a91
--- /dev/null
+++ b/solutions/2301-match-substring-after-replacement.js
@@ -0,0 +1,50 @@
+/**
+ * 2301. Match Substring After Replacement
+ * https://leetcode.com/problems/match-substring-after-replacement/
+ * Difficulty: Hard
+ *
+ * You are given two strings s and sub. You are also given a 2D character array mappings where
+ * mappings[i] = [oldi, newi] indicates that you may perform the following operation any number
+ * of times:
+ * - Replace a character oldi of sub with newi.
+ *
+ * Each character in sub cannot be replaced more than once.
+ *
+ * Return true if it is possible to make sub a substring of s by replacing zero or more characters
+ * according to mappings. Otherwise, return false.
+ *
+ * A substring is a contiguous non-empty sequence of characters within a string.
+ */
+
+/**
+ * @param {string} s
+ * @param {string} sub
+ * @param {character[][]} mappings
+ * @return {boolean}
+ */
+var matchReplacement = function(s, sub, mappings) {
+  const map = new Map();
+
+  for (const [oldChar, newChar] of mappings) {
+    if (!map.has(oldChar)) {
+      map.set(oldChar, new Set());
+    }
+    map.get(oldChar).add(newChar);
+  }
+
+  const subLen = sub.length;
+  for (let i = 0; i <= s.length - subLen; i++) {
+    let isValid = true;
+    for (let j = 0; j < subLen; j++) {
+      const sChar = s[i + j];
+      const subChar = sub[j];
+      if (sChar !== subChar && (!map.has(subChar) || !map.get(subChar).has(sChar))) {
+        isValid = false;
+        break;
+      }
+    }
+    if (isValid) return true;
+  }
+
+  return false;
+};

From b4518be735c88b5c3602aada4981c05914422c3c Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 18 May 2025 00:19:20 -0500
Subject: [PATCH 163/571] Add solution #2303

---
 README.md                                     |  3 +-
 .../2303-calculate-amount-paid-in-taxes.js    | 41 +++++++++++++++++++
 2 files changed, 43 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2303-calculate-amount-paid-in-taxes.js

diff --git a/README.md b/README.md
index 68498fe0..12e9be04 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,871 LeetCode solutions in JavaScript
+# 1,872 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1751,6 +1751,7 @@
 2300|[Successful Pairs of Spells and Potions](./solutions/2300-successful-pairs-of-spells-and-potions.js)|Medium|
 2301|[Match Substring After Replacement](./solutions/2301-match-substring-after-replacement.js)|Hard|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
+2303|[Calculate Amount Paid in Taxes](./solutions/2303-calculate-amount-paid-in-taxes.js)|Easy|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
 2338|[Count the Number of Ideal Arrays](./solutions/2338-count-the-number-of-ideal-arrays.js)|Hard|
 2342|[Max Sum of a Pair With Equal Sum of Digits](./solutions/2342-max-sum-of-a-pair-with-equal-sum-of-digits.js)|Medium|
diff --git a/solutions/2303-calculate-amount-paid-in-taxes.js b/solutions/2303-calculate-amount-paid-in-taxes.js
new file mode 100644
index 00000000..6944f54b
--- /dev/null
+++ b/solutions/2303-calculate-amount-paid-in-taxes.js
@@ -0,0 +1,41 @@
+/**
+ * 2303. Calculate Amount Paid in Taxes
+ * https://leetcode.com/problems/calculate-amount-paid-in-taxes/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed 2D integer array brackets where brackets[i] = [upperi, percenti]
+ * means that the ith tax bracket has an upper bound of upperi and is taxed at a rate of percenti.
+ * The brackets are sorted by upper bound (i.e. upperi-1 < upperi for 0 < i < brackets.length).
+ *
+ * Tax is calculated as follows:
+ * - The first upper0 dollars earned are taxed at a rate of percent0.
+ * - The next upper1 - upper0 dollars earned are taxed at a rate of percent1.
+ * - The next upper2 - upper1 dollars earned are taxed at a rate of percent2.
+ * - And so on.
+ *
+ * You are given an integer income representing the amount of money you earned. Return the
+ * amount of money that you have to pay in taxes. Answers within 10-5 of the actual answer
+ * will be accepted.
+ */
+
+/**
+ * @param {number[][]} brackets
+ * @param {number} income
+ * @return {number}
+ */
+var calculateTax = function(brackets, income) {
+  let result = 0;
+  let previousUpper = 0;
+
+  for (const [upper, percent] of brackets) {
+    if (income > previousUpper) {
+      const taxable = Math.min(income, upper) - previousUpper;
+      result += taxable * (percent / 100);
+      previousUpper = upper;
+    } else {
+      break;
+    }
+  }
+
+  return result;
+};

From 97b909a586ddd254920186ffb9861a98a72ea3e1 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 18 May 2025 00:20:51 -0500
Subject: [PATCH 164/571] Add solution #2304

---
 README.md                                     |  3 +-
 solutions/2304-minimum-path-cost-in-a-grid.js | 48 +++++++++++++++++++
 2 files changed, 50 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2304-minimum-path-cost-in-a-grid.js

diff --git a/README.md b/README.md
index 12e9be04..afd9131f 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,872 LeetCode solutions in JavaScript
+# 1,873 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1752,6 +1752,7 @@
 2301|[Match Substring After Replacement](./solutions/2301-match-substring-after-replacement.js)|Hard|
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
 2303|[Calculate Amount Paid in Taxes](./solutions/2303-calculate-amount-paid-in-taxes.js)|Easy|
+2304|[Minimum Path Cost in a Grid](./solutions/2304-minimum-path-cost-in-a-grid.js)|Medium|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
 2338|[Count the Number of Ideal Arrays](./solutions/2338-count-the-number-of-ideal-arrays.js)|Hard|
 2342|[Max Sum of a Pair With Equal Sum of Digits](./solutions/2342-max-sum-of-a-pair-with-equal-sum-of-digits.js)|Medium|
diff --git a/solutions/2304-minimum-path-cost-in-a-grid.js b/solutions/2304-minimum-path-cost-in-a-grid.js
new file mode 100644
index 00000000..eb1f10c4
--- /dev/null
+++ b/solutions/2304-minimum-path-cost-in-a-grid.js
@@ -0,0 +1,48 @@
+/**
+ * 2304. Minimum Path Cost in a Grid
+ * https://leetcode.com/problems/minimum-path-cost-in-a-grid/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed m x n integer matrix grid consisting of distinct integers from
+ * 0 to m * n - 1. You can move in this matrix from a cell to any other cell in the next row.
+ * That is, if you are in cell (x, y) such that x < m - 1, you can move to any of the cells
+ * (x + 1, 0), (x + 1, 1), ..., (x + 1, n - 1). Note that it is not possible to move from
+ * cells in the last row.
+ *
+ * Each possible move has a cost given by a 0-indexed 2D array moveCost of size (m * n) x n,
+ * where moveCost[i][j] is the cost of moving from a cell with value i to a cell in column j
+ * of the next row. The cost of moving from cells in the last row of grid can be ignored.
+ *
+ * The cost of a path in grid is the sum of all values of cells visited plus the sum of costs
+ * of all the moves made. Return the minimum cost of a path that starts from any cell in the
+ * first row and ends at any cell in the last row.
+ */
+
+/**
+ * @param {number[][]} grid
+ * @param {number[][]} moveCost
+ * @return {number}
+ */
+var minPathCost = function(grid, moveCost) {
+  const m = grid.length;
+  const n = grid[0].length;
+  const dp = Array.from({ length: m }, () => new Array(n).fill(Infinity));
+
+  for (let j = 0; j < n; j++) {
+    dp[0][j] = grid[0][j];
+  }
+
+  for (let i = 0; i < m - 1; i++) {
+    for (let j = 0; j < n; j++) {
+      const value = grid[i][j];
+      for (let k = 0; k < n; k++) {
+        dp[i + 1][k] = Math.min(
+          dp[i + 1][k],
+          dp[i][j] + grid[i + 1][k] + moveCost[value][k]
+        );
+      }
+    }
+  }
+
+  return Math.min(...dp[m - 1]);
+};

From 46a9758a35c9d76c06c698b5d73fa67e09240369 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 18 May 2025 00:22:11 -0500
Subject: [PATCH 165/571] Add solution #2305

---
 README.md                                     |  3 +-
 .../2305-fair-distribution-of-cookies.js      | 46 +++++++++++++++++++
 2 files changed, 48 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2305-fair-distribution-of-cookies.js

diff --git a/README.md b/README.md
index afd9131f..b8a45bb2 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,873 LeetCode solutions in JavaScript
+# 1,874 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1753,6 +1753,7 @@
 2302|[Count Subarrays With Score Less Than K](./solutions/2302-count-subarrays-with-score-less-than-k.js)|Hard|
 2303|[Calculate Amount Paid in Taxes](./solutions/2303-calculate-amount-paid-in-taxes.js)|Easy|
 2304|[Minimum Path Cost in a Grid](./solutions/2304-minimum-path-cost-in-a-grid.js)|Medium|
+2305|[Fair Distribution of Cookies](./solutions/2305-fair-distribution-of-cookies.js)|Medium|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
 2338|[Count the Number of Ideal Arrays](./solutions/2338-count-the-number-of-ideal-arrays.js)|Hard|
 2342|[Max Sum of a Pair With Equal Sum of Digits](./solutions/2342-max-sum-of-a-pair-with-equal-sum-of-digits.js)|Medium|
diff --git a/solutions/2305-fair-distribution-of-cookies.js b/solutions/2305-fair-distribution-of-cookies.js
new file mode 100644
index 00000000..dffcb4a4
--- /dev/null
+++ b/solutions/2305-fair-distribution-of-cookies.js
@@ -0,0 +1,46 @@
+/**
+ * 2305. Fair Distribution of Cookies
+ * https://leetcode.com/problems/fair-distribution-of-cookies/
+ * Difficulty: Medium
+ *
+ * You are given an integer array cookies, where cookies[i] denotes the number of cookies in the
+ * ith bag. You are also given an integer k that denotes the number of children to distribute
+ * all the bags of cookies to. All the cookies in the same bag must go to the same child and
+ * cannot be split up.
+ *
+ * The unfairness of a distribution is defined as the maximum total cookies obtained by a single
+ * child in the distribution.
+ *
+ * Return the minimum unfairness of all distributions.
+ */
+
+/**
+ * @param {number[]} cookies
+ * @param {number} k
+ * @return {number}
+ */
+var distributeCookies = function(cookies, k) {
+  const distribution = new Array(k).fill(0);
+  let result = Infinity;
+
+  distribute(0);
+
+  return result;
+
+  function distribute(index) {
+    if (index === cookies.length) {
+      result = Math.min(result, Math.max(...distribution));
+      return;
+    }
+
+    for (let i = 0; i < k; i++) {
+      distribution[i] += cookies[index];
+      if (distribution[i] < result) {
+        distribute(index + 1);
+      }
+      distribution[i] -= cookies[index];
+
+      if (distribution[i] === 0) break;
+    }
+  }
+};

From 3fab53cef94f423a41a392554c25dc950e04f3f1 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 18 May 2025 00:23:24 -0500
Subject: [PATCH 166/571] Add solution #2306

---
 README.md                          |  3 ++-
 solutions/2306-naming-a-company.js | 37 ++++++++++++++++++++++++++++++
 2 files changed, 39 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2306-naming-a-company.js

diff --git a/README.md b/README.md
index b8a45bb2..cbcc7ee4 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,874 LeetCode solutions in JavaScript
+# 1,875 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1754,6 +1754,7 @@
 2303|[Calculate Amount Paid in Taxes](./solutions/2303-calculate-amount-paid-in-taxes.js)|Easy|
 2304|[Minimum Path Cost in a Grid](./solutions/2304-minimum-path-cost-in-a-grid.js)|Medium|
 2305|[Fair Distribution of Cookies](./solutions/2305-fair-distribution-of-cookies.js)|Medium|
+2306|[Naming a Company](./solutions/2306-naming-a-company.js)|Hard|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
 2338|[Count the Number of Ideal Arrays](./solutions/2338-count-the-number-of-ideal-arrays.js)|Hard|
 2342|[Max Sum of a Pair With Equal Sum of Digits](./solutions/2342-max-sum-of-a-pair-with-equal-sum-of-digits.js)|Medium|
diff --git a/solutions/2306-naming-a-company.js b/solutions/2306-naming-a-company.js
new file mode 100644
index 00000000..bef81dfe
--- /dev/null
+++ b/solutions/2306-naming-a-company.js
@@ -0,0 +1,37 @@
+/**
+ * 2306. Naming a Company
+ * https://leetcode.com/problems/naming-a-company/
+ * Difficulty: Hard
+ *
+ * You are given an array of strings ideas that represents a list of names to be used in the
+ * process of naming a company. The process of naming a company is as follows:
+ * 1. Choose 2 distinct names from ideas, call them ideaA and ideaB.
+ * 2. Swap the first letters of ideaA and ideaB with each other.
+ * 3. If both of the new names are not found in the original ideas, then the name ideaA ideaB
+ *    (the concatenation of ideaA and ideaB, separated by a space) is a valid company name.
+ * 4. Otherwise, it is not a valid name.
+ *
+ * Return the number of distinct valid names for the company.
+ */
+
+/**
+ * @param {string[]} ideas
+ * @return {number}
+ */
+var distinctNames = function(ideas) {
+  const groups = Array.from({ length: 26 }, () => new Set());
+  let result = 0;
+
+  for (const idea of ideas) {
+    groups[idea.charCodeAt(0) - 97].add(idea.slice(1));
+  }
+
+  for (let i = 0; i < 25; i++) {
+    for (let j = i + 1; j < 26; j++) {
+      const mutualCount = [...groups[i]].filter(suffix => groups[j].has(suffix)).length;
+      result += 2 * (groups[i].size - mutualCount) * (groups[j].size - mutualCount);
+    }
+  }
+
+  return result;
+};

From 2b2576103509fc0d0a2429074e49f2a410f36e42 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 18 May 2025 00:25:20 -0500
Subject: [PATCH 167/571] Add solution #2309

---
 README.md                                     |  3 +-
 ...-english-letter-in-upper-and-lower-case.js | 38 +++++++++++++++++++
 2 files changed, 40 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2309-greatest-english-letter-in-upper-and-lower-case.js

diff --git a/README.md b/README.md
index cbcc7ee4..bbd36085 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,875 LeetCode solutions in JavaScript
+# 1,876 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1755,6 +1755,7 @@
 2304|[Minimum Path Cost in a Grid](./solutions/2304-minimum-path-cost-in-a-grid.js)|Medium|
 2305|[Fair Distribution of Cookies](./solutions/2305-fair-distribution-of-cookies.js)|Medium|
 2306|[Naming a Company](./solutions/2306-naming-a-company.js)|Hard|
+2309|[Greatest English Letter in Upper and Lower Case](./solutions/2309-greatest-english-letter-in-upper-and-lower-case.js)|Easy|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
 2338|[Count the Number of Ideal Arrays](./solutions/2338-count-the-number-of-ideal-arrays.js)|Hard|
 2342|[Max Sum of a Pair With Equal Sum of Digits](./solutions/2342-max-sum-of-a-pair-with-equal-sum-of-digits.js)|Medium|
diff --git a/solutions/2309-greatest-english-letter-in-upper-and-lower-case.js b/solutions/2309-greatest-english-letter-in-upper-and-lower-case.js
new file mode 100644
index 00000000..b86b8f8b
--- /dev/null
+++ b/solutions/2309-greatest-english-letter-in-upper-and-lower-case.js
@@ -0,0 +1,38 @@
+/**
+ * 2309. Greatest English Letter in Upper and Lower Case
+ * https://leetcode.com/problems/greatest-english-letter-in-upper-and-lower-case/
+ * Difficulty: Easy
+ *
+ * Given a string of English letters s, return the greatest English letter which occurs as both
+ * a lowercase and uppercase letter in s. The returned letter should be in uppercase. If no such
+ * letter exists, return an empty string.
+ *
+ * An English letter b is greater than another letter a if b appears after a in the English
+ * alphabet.
+ */
+
+/**
+ * @param {string} s
+ * @return {string}
+ */
+var greatestLetter = function(s) {
+  const lowerSet = new Set();
+  const upperSet = new Set();
+
+  for (const char of s) {
+    if (char >= 'a' && char <= 'z') {
+      lowerSet.add(char);
+    } else {
+      upperSet.add(char.toLowerCase());
+    }
+  }
+
+  let maxLetter = '';
+  for (const char of lowerSet) {
+    if (upperSet.has(char) && char > maxLetter) {
+      maxLetter = char;
+    }
+  }
+
+  return maxLetter.toUpperCase();
+};

From 86cdd1521196ed5c580fcbf78284bdd8fab92d51 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 18 May 2025 00:26:27 -0500
Subject: [PATCH 168/571] Add solution #2312

---
 README.md                                |  3 +-
 solutions/2312-selling-pieces-of-wood.js | 46 ++++++++++++++++++++++++
 2 files changed, 48 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2312-selling-pieces-of-wood.js

diff --git a/README.md b/README.md
index bbd36085..a5724555 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,876 LeetCode solutions in JavaScript
+# 1,877 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1756,6 +1756,7 @@
 2305|[Fair Distribution of Cookies](./solutions/2305-fair-distribution-of-cookies.js)|Medium|
 2306|[Naming a Company](./solutions/2306-naming-a-company.js)|Hard|
 2309|[Greatest English Letter in Upper and Lower Case](./solutions/2309-greatest-english-letter-in-upper-and-lower-case.js)|Easy|
+2312|[Selling Pieces of Wood](./solutions/2312-selling-pieces-of-wood.js)|Hard|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
 2338|[Count the Number of Ideal Arrays](./solutions/2338-count-the-number-of-ideal-arrays.js)|Hard|
 2342|[Max Sum of a Pair With Equal Sum of Digits](./solutions/2342-max-sum-of-a-pair-with-equal-sum-of-digits.js)|Medium|
diff --git a/solutions/2312-selling-pieces-of-wood.js b/solutions/2312-selling-pieces-of-wood.js
new file mode 100644
index 00000000..6edab3a0
--- /dev/null
+++ b/solutions/2312-selling-pieces-of-wood.js
@@ -0,0 +1,46 @@
+/**
+ * 2312. Selling Pieces of Wood
+ * https://leetcode.com/problems/selling-pieces-of-wood/
+ * Difficulty: Hard
+ *
+ * You are given two integers m and n that represent the height and width of a rectangular piece
+ * of wood. You are also given a 2D integer array prices, where prices[i] = [hi, wi, pricei]
+ * indicates you can sell a rectangular piece of wood of height hi and width wi for pricei dollars.
+ *
+ * To cut a piece of wood, you must make a vertical or horizontal cut across the entire height
+ * or width of the piece to split it into two smaller pieces. After cutting a piece of wood into
+ * some number of smaller pieces, you can sell pieces according to prices. You may sell multiple
+ * pieces of the same shape, and you do not have to sell all the shapes. The grain of the wood
+ * makes a difference, so you cannot rotate a piece to swap its height and width.
+ *
+ * Return the maximum money you can earn after cutting an m x n piece of wood.
+ *
+ * Note that you can cut the piece of wood as many times as you want.
+ */
+
+/**
+ * @param {number} m
+ * @param {number} n
+ * @param {number[][]} prices
+ * @return {number}
+ */
+var sellingWood = function(m, n, prices) {
+  const dp = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));
+
+  for (const [h, w, price] of prices) {
+    dp[h][w] = price;
+  }
+
+  for (let i = 1; i <= m; i++) {
+    for (let j = 1; j <= n; j++) {
+      for (let k = 1; k < i; k++) {
+        dp[i][j] = Math.max(dp[i][j], dp[k][j] + dp[i - k][j]);
+      }
+      for (let k = 1; k < j; k++) {
+        dp[i][j] = Math.max(dp[i][j], dp[i][k] + dp[i][j - k]);
+      }
+    }
+  }
+
+  return dp[m][n];
+};

From cd91566e2a9954db0977430d1e21a8b4bba0e370 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 18 May 2025 00:27:46 -0500
Subject: [PATCH 169/571] Add solution #2315

---
 README.md                         |  3 ++-
 solutions/2315-count-asterisks.js | 32 +++++++++++++++++++++++++++++++
 2 files changed, 34 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2315-count-asterisks.js

diff --git a/README.md b/README.md
index a5724555..d511a7a2 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,877 LeetCode solutions in JavaScript
+# 1,878 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1757,6 +1757,7 @@
 2306|[Naming a Company](./solutions/2306-naming-a-company.js)|Hard|
 2309|[Greatest English Letter in Upper and Lower Case](./solutions/2309-greatest-english-letter-in-upper-and-lower-case.js)|Easy|
 2312|[Selling Pieces of Wood](./solutions/2312-selling-pieces-of-wood.js)|Hard|
+2315|[Count Asterisks](./solutions/2315-count-asterisks.js)|Easy|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
 2338|[Count the Number of Ideal Arrays](./solutions/2338-count-the-number-of-ideal-arrays.js)|Hard|
 2342|[Max Sum of a Pair With Equal Sum of Digits](./solutions/2342-max-sum-of-a-pair-with-equal-sum-of-digits.js)|Medium|
diff --git a/solutions/2315-count-asterisks.js b/solutions/2315-count-asterisks.js
new file mode 100644
index 00000000..650055eb
--- /dev/null
+++ b/solutions/2315-count-asterisks.js
@@ -0,0 +1,32 @@
+/**
+ * 2315. Count Asterisks
+ * https://leetcode.com/problems/count-asterisks/
+ * Difficulty: Easy
+ *
+ * You are given a string s, where every two consecutive vertical bars '|' are grouped into
+ * a pair. In other words, the 1st and 2nd '|' make a pair, the 3rd and 4th '|' make a pair,
+ * and so forth.
+ *
+ * Return the number of '*' in s, excluding the '*' between each pair of '|'.
+ *
+ * Note that each '|' will belong to exactly one pair.
+ */
+
+/**
+ * @param {string} s
+ * @return {number}
+ */
+var countAsterisks = function(s) {
+  let isInsidePair = false;
+  let result = 0;
+
+  for (const char of s) {
+    if (char === '|') {
+      isInsidePair = !isInsidePair;
+    } else if (char === '*' && !isInsidePair) {
+      result++;
+    }
+  }
+
+  return result;
+};

From 68fe034378ffc0b7a7c1c805b9775280a9d9b62e Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 18 May 2025 00:28:50 -0500
Subject: [PATCH 170/571] Add solution #2316

---
 README.md                                     |  3 +-
 ...e-pairs-of-nodes-in-an-undirected-graph.js | 48 +++++++++++++++++++
 2 files changed, 50 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2316-count-unreachable-pairs-of-nodes-in-an-undirected-graph.js

diff --git a/README.md b/README.md
index d511a7a2..d0e8eb2f 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,878 LeetCode solutions in JavaScript
+# 1,879 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1758,6 +1758,7 @@
 2309|[Greatest English Letter in Upper and Lower Case](./solutions/2309-greatest-english-letter-in-upper-and-lower-case.js)|Easy|
 2312|[Selling Pieces of Wood](./solutions/2312-selling-pieces-of-wood.js)|Hard|
 2315|[Count Asterisks](./solutions/2315-count-asterisks.js)|Easy|
+2316|[Count Unreachable Pairs of Nodes in an Undirected Graph](./solutions/2316-count-unreachable-pairs-of-nodes-in-an-undirected-graph.js)|Medium|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
 2338|[Count the Number of Ideal Arrays](./solutions/2338-count-the-number-of-ideal-arrays.js)|Hard|
 2342|[Max Sum of a Pair With Equal Sum of Digits](./solutions/2342-max-sum-of-a-pair-with-equal-sum-of-digits.js)|Medium|
diff --git a/solutions/2316-count-unreachable-pairs-of-nodes-in-an-undirected-graph.js b/solutions/2316-count-unreachable-pairs-of-nodes-in-an-undirected-graph.js
new file mode 100644
index 00000000..4de0c07b
--- /dev/null
+++ b/solutions/2316-count-unreachable-pairs-of-nodes-in-an-undirected-graph.js
@@ -0,0 +1,48 @@
+/**
+ * 2316. Count Unreachable Pairs of Nodes in an Undirected Graph
+ * https://leetcode.com/problems/count-unreachable-pairs-of-nodes-in-an-undirected-graph/
+ * Difficulty: Medium
+ *
+ * You are given an integer n. There is an undirected graph with n nodes, numbered from 0
+ * to n - 1. You are given a 2D integer array edges where edges[i] = [ai, bi] denotes that
+ * there exists an undirected edge connecting nodes ai and bi.
+ *
+ * Return the number of pairs of different nodes that are unreachable from each other.
+ */
+
+/**
+ * @param {number} n
+ * @param {number[][]} edges
+ * @return {number}
+ */
+var countPairs = function(n, edges) {
+  const graph = Array.from({ length: n }, () => []);
+  for (const [a, b] of edges) {
+    graph[a].push(b);
+    graph[b].push(a);
+  }
+
+  const visited = new Array(n).fill(false);
+  let result = 0;
+
+  let totalNodes = 0;
+  for (let node = 0; node < n; node++) {
+    if (!visited[node]) {
+      const componentSize = exploreComponent(node);
+      result += totalNodes * componentSize;
+      totalNodes += componentSize;
+    }
+  }
+
+  return result;
+
+  function exploreComponent(node) {
+    if (visited[node]) return 0;
+    visited[node] = true;
+    let size = 1;
+    for (const neighbor of graph[node]) {
+      size += exploreComponent(neighbor);
+    }
+    return size;
+  }
+};

From 6674bc66c5873a20ec9e98bfb64ae99f272c87ce Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 18 May 2025 00:30:03 -0500
Subject: [PATCH 171/571] Add solution #2317

---
 README.md                                     |  3 ++-
 .../2317-maximum-xor-after-operations.js      | 27 +++++++++++++++++++
 2 files changed, 29 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2317-maximum-xor-after-operations.js

diff --git a/README.md b/README.md
index d0e8eb2f..5a5c1623 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,879 LeetCode solutions in JavaScript
+# 1,880 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1759,6 +1759,7 @@
 2312|[Selling Pieces of Wood](./solutions/2312-selling-pieces-of-wood.js)|Hard|
 2315|[Count Asterisks](./solutions/2315-count-asterisks.js)|Easy|
 2316|[Count Unreachable Pairs of Nodes in an Undirected Graph](./solutions/2316-count-unreachable-pairs-of-nodes-in-an-undirected-graph.js)|Medium|
+2317|[Maximum XOR After Operations](./solutions/2317-maximum-xor-after-operations.js)|Medium|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
 2338|[Count the Number of Ideal Arrays](./solutions/2338-count-the-number-of-ideal-arrays.js)|Hard|
 2342|[Max Sum of a Pair With Equal Sum of Digits](./solutions/2342-max-sum-of-a-pair-with-equal-sum-of-digits.js)|Medium|
diff --git a/solutions/2317-maximum-xor-after-operations.js b/solutions/2317-maximum-xor-after-operations.js
new file mode 100644
index 00000000..7049675b
--- /dev/null
+++ b/solutions/2317-maximum-xor-after-operations.js
@@ -0,0 +1,27 @@
+/**
+ * 2317. Maximum XOR After Operations
+ * https://leetcode.com/problems/maximum-xor-after-operations/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed integer array nums. In one operation, select any non-negative
+ * integer x and an index i, then update nums[i] to be equal to nums[i] AND (nums[i] XOR x).
+ *
+ * Note that AND is the bitwise AND operation and XOR is the bitwise XOR operation.
+ *
+ * Return the maximum possible bitwise XOR of all elements of nums after applying the operation
+ * any number of times.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var maximumXOR = function(nums) {
+  let maxXor = 0;
+
+  for (const num of nums) {
+    maxXor |= num;
+  }
+
+  return maxXor;
+};

From 509c9916266212ad54e8cdf781949c9483d724a2 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Mon, 19 May 2025 18:57:53 -0500
Subject: [PATCH 172/571] Add solution #3024

---
 README.md                          |  3 ++-
 solutions/3024-type-of-triangle.js | 27 +++++++++++++++++++++++++++
 2 files changed, 29 insertions(+), 1 deletion(-)
 create mode 100644 solutions/3024-type-of-triangle.js

diff --git a/README.md b/README.md
index 5a5c1623..3fb04dbe 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,880 LeetCode solutions in JavaScript
+# 1,881 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1855,6 +1855,7 @@
 2962|[Count Subarrays Where Max Element Appears at Least K Times](./solutions/2962-count-subarrays-where-max-element-appears-at-least-k-times.js)|Medium|
 2965|[Find Missing and Repeated Values](./solutions/2965-find-missing-and-repeated-values.js)|Easy|
 2999|[Count the Number of Powerful Integers](./solutions/2999-count-the-number-of-powerful-integers.js)|Hard|
+3024|[Type of Triangle](./solutions/3024-type-of-triangle.js)|Easy|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
 3066|[Minimum Operations to Exceed Threshold Value II](./solutions/3066-minimum-operations-to-exceed-threshold-value-ii.js)|Medium|
 3105|[Longest Strictly Increasing or Strictly Decreasing Subarray](./solutions/3105-longest-strictly-increasing-or-strictly-decreasing-subarray.js)|Easy|
diff --git a/solutions/3024-type-of-triangle.js b/solutions/3024-type-of-triangle.js
new file mode 100644
index 00000000..0a62411d
--- /dev/null
+++ b/solutions/3024-type-of-triangle.js
@@ -0,0 +1,27 @@
+/**
+ * 3024. Type of Triangle
+ * https://leetcode.com/problems/type-of-triangle/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed integer array nums of size 3 which can form the sides of a triangle.
+ * - A triangle is called equilateral if it has all sides of equal length.
+ * - A triangle is called isosceles if it has exactly two sides of equal length.
+ * - A triangle is called scalene if all its sides are of different lengths.
+ *
+ * Return a string representing the type of triangle that can be formed or "none" if it cannot
+ * form a triangle.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {string}
+ */
+var triangleType = function(nums) {
+  const [sideA, sideB, sideC] = nums.sort((a, b) => a - b);
+
+  if (sideA + sideB <= sideC) return 'none';
+  if (sideA === sideB && sideB === sideC) return 'equilateral';
+  if (sideA === sideB || sideB === sideC) return 'isosceles';
+
+  return 'scalene';
+};

From 6a179c10160fb674f049602742e98a1207b6a624 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Mon, 19 May 2025 18:58:57 -0500
Subject: [PATCH 173/571] Add solution #2319

---
 README.md                                     |  3 +-
 solutions/2319-check-if-matrix-is-x-matrix.js | 32 +++++++++++++++++++
 2 files changed, 34 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2319-check-if-matrix-is-x-matrix.js

diff --git a/README.md b/README.md
index 3fb04dbe..3ee503ce 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,881 LeetCode solutions in JavaScript
+# 1,882 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1760,6 +1760,7 @@
 2315|[Count Asterisks](./solutions/2315-count-asterisks.js)|Easy|
 2316|[Count Unreachable Pairs of Nodes in an Undirected Graph](./solutions/2316-count-unreachable-pairs-of-nodes-in-an-undirected-graph.js)|Medium|
 2317|[Maximum XOR After Operations](./solutions/2317-maximum-xor-after-operations.js)|Medium|
+2319|[Check if Matrix Is X-Matrix](./solutions/2319-check-if-matrix-is-x-matrix.js)|Easy|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
 2338|[Count the Number of Ideal Arrays](./solutions/2338-count-the-number-of-ideal-arrays.js)|Hard|
 2342|[Max Sum of a Pair With Equal Sum of Digits](./solutions/2342-max-sum-of-a-pair-with-equal-sum-of-digits.js)|Medium|
diff --git a/solutions/2319-check-if-matrix-is-x-matrix.js b/solutions/2319-check-if-matrix-is-x-matrix.js
new file mode 100644
index 00000000..ee45ca42
--- /dev/null
+++ b/solutions/2319-check-if-matrix-is-x-matrix.js
@@ -0,0 +1,32 @@
+/**
+ * 2319. Check if Matrix Is X-Matrix
+ * https://leetcode.com/problems/check-if-matrix-is-x-matrix/
+ * Difficulty: Easy
+ *
+ * A square matrix is said to be an X-Matrix if both of the following conditions hold:
+ * 1. All the elements in the diagonals of the matrix are non-zero.
+ * 2. All other elements are 0.
+ *
+ * Given a 2D integer array grid of size n x n representing a square matrix, return true if grid
+ * is an X-Matrix. Otherwise, return false.
+ */
+
+/**
+ * @param {number[][]} grid
+ * @return {boolean}
+ */
+var checkXMatrix = function(grid) {
+  const size = grid.length;
+
+  for (let row = 0; row < size; row++) {
+    for (let col = 0; col < size; col++) {
+      const isDiagonal = row === col || row + col === size - 1;
+      const isNonZero = grid[row][col] !== 0;
+
+      if (isDiagonal && !isNonZero) return false;
+      if (!isDiagonal && isNonZero) return false;
+    }
+  }
+
+  return true;
+};

From 3298f0cc9fb8859dfea7e3f85ebb5e15932d2da3 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Mon, 19 May 2025 19:00:40 -0500
Subject: [PATCH 174/571] Add solution #2320

---
 README.md                                     |  3 +-
 ...20-count-number-of-ways-to-place-houses.js | 34 +++++++++++++++++++
 2 files changed, 36 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2320-count-number-of-ways-to-place-houses.js

diff --git a/README.md b/README.md
index 3ee503ce..6f303462 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,882 LeetCode solutions in JavaScript
+# 1,883 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1761,6 +1761,7 @@
 2316|[Count Unreachable Pairs of Nodes in an Undirected Graph](./solutions/2316-count-unreachable-pairs-of-nodes-in-an-undirected-graph.js)|Medium|
 2317|[Maximum XOR After Operations](./solutions/2317-maximum-xor-after-operations.js)|Medium|
 2319|[Check if Matrix Is X-Matrix](./solutions/2319-check-if-matrix-is-x-matrix.js)|Easy|
+2320|[Count Number of Ways to Place Houses](./solutions/2320-count-number-of-ways-to-place-houses.js)|Medium|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
 2338|[Count the Number of Ideal Arrays](./solutions/2338-count-the-number-of-ideal-arrays.js)|Hard|
 2342|[Max Sum of a Pair With Equal Sum of Digits](./solutions/2342-max-sum-of-a-pair-with-equal-sum-of-digits.js)|Medium|
diff --git a/solutions/2320-count-number-of-ways-to-place-houses.js b/solutions/2320-count-number-of-ways-to-place-houses.js
new file mode 100644
index 00000000..39c28f72
--- /dev/null
+++ b/solutions/2320-count-number-of-ways-to-place-houses.js
@@ -0,0 +1,34 @@
+/**
+ * 2320. Count Number of Ways to Place Houses
+ * https://leetcode.com/problems/count-number-of-ways-to-place-houses/
+ * Difficulty: Medium
+ *
+ * There is a street with n * 2 plots, where there are n plots on each side of the street. The plots
+ * on each side are numbered from 1 to n. On each plot, a house can be placed.
+ *
+ * Return the number of ways houses can be placed such that no two houses are adjacent to each other
+ * on the same side of the street. Since the answer may be very large, return it modulo 109 + 7.
+ *
+ * Note that if a house is placed on the ith plot on one side of the street, a house can also be
+ * placed on the ith plot on the other side of the street.
+ */
+
+/**
+ * @param {number} n
+ * @return {number}
+ */
+var countHousePlacements = function(n) {
+  const MOD = 1e9 + 7;
+  let empty = 1n;
+  let house = 1n;
+
+  for (let i = 2; i <= n; i++) {
+    const nextEmpty = (empty + house) % BigInt(MOD);
+    const nextHouse = empty;
+    empty = nextEmpty;
+    house = nextHouse;
+  }
+
+  const sideWays = (empty + house) % BigInt(MOD);
+  return Number((sideWays * sideWays) % BigInt(MOD));
+};

From 2ed286a058234050fc03b28f06b5a16b968f10fa Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Mon, 19 May 2025 19:06:05 -0500
Subject: [PATCH 175/571] Add solution #3355

---
 README.md                                     |  3 +-
 solutions/3355-zero-array-transformation-i.js | 43 +++++++++++++++++++
 2 files changed, 45 insertions(+), 1 deletion(-)
 create mode 100644 solutions/3355-zero-array-transformation-i.js

diff --git a/README.md b/README.md
index 6f303462..115378bd 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,883 LeetCode solutions in JavaScript
+# 1,884 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1877,6 +1877,7 @@
 3341|[Find Minimum Time to Reach Last Room I](./solutions/3341-find-minimum-time-to-reach-last-room-i.js)|Medium|
 3342|[Find Minimum Time to Reach Last Room II](./solutions/3342-find-minimum-time-to-reach-last-room-ii.js)|Medium|
 3343|[Count Number of Balanced Permutations](./solutions/3343-count-number-of-balanced-permutations.js)|Hard|
+3355|[Zero Array Transformation I](./solutions/3355-zero-array-transformation-i.js)|Medium|
 3356|[Zero Array Transformation II](./solutions/3356-zero-array-transformation-ii.js)|Medium|
 3375|[Minimum Operations to Make Array Values Equal to K](./solutions/3375-minimum-operations-to-make-array-values-equal-to-k.js)|Easy|
 3392|[Count Subarrays of Length Three With a Condition](./solutions/3392-count-subarrays-of-length-three-with-a-condition.js)|Easy|
diff --git a/solutions/3355-zero-array-transformation-i.js b/solutions/3355-zero-array-transformation-i.js
new file mode 100644
index 00000000..21b9bc13
--- /dev/null
+++ b/solutions/3355-zero-array-transformation-i.js
@@ -0,0 +1,43 @@
+/**
+ * 3355. Zero Array Transformation I
+ * https://leetcode.com/problems/zero-array-transformation-i/
+ * Difficulty: Medium
+ *
+ * You are given an integer array nums of length n and a 2D array queries, where
+ * queries[i] = [li, ri].
+ *
+ * For each queries[i]:
+ * - Select a subset of indices within the range [li, ri] in nums.
+ * - Decrement the values at the selected indices by 1.
+ *
+ * A Zero Array is an array where all elements are equal to 0.
+ *
+ * Return true if it is possible to transform nums into a Zero Array after processing all the
+ * queries sequentially, otherwise return false.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number[][]} queries
+ * @return {boolean}
+ */
+var isZeroArray = function(nums, queries) {
+  const maxDecrements = new Array(nums.length).fill(0);
+
+  for (const [left, right] of queries) {
+    maxDecrements[left]++;
+    if (right + 1 < nums.length) {
+      maxDecrements[right + 1]--;
+    }
+  }
+
+  let currentDecrements = 0;
+  for (let i = 0; i < nums.length; i++) {
+    currentDecrements += maxDecrements[i];
+    if (nums[i] > currentDecrements) {
+      return false;
+    }
+  }
+
+  return true;
+};

From 6858100e893c4cd98c20f35c944ee067288281e6 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Mon, 19 May 2025 19:08:43 -0500
Subject: [PATCH 176/571] Add solution #2318

---
 README.md                                     |  3 +-
 .../2318-number-of-distinct-roll-sequences.js | 55 +++++++++++++++++++
 2 files changed, 57 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2318-number-of-distinct-roll-sequences.js

diff --git a/README.md b/README.md
index 115378bd..dc05171d 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,884 LeetCode solutions in JavaScript
+# 1,885 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1760,6 +1760,7 @@
 2315|[Count Asterisks](./solutions/2315-count-asterisks.js)|Easy|
 2316|[Count Unreachable Pairs of Nodes in an Undirected Graph](./solutions/2316-count-unreachable-pairs-of-nodes-in-an-undirected-graph.js)|Medium|
 2317|[Maximum XOR After Operations](./solutions/2317-maximum-xor-after-operations.js)|Medium|
+2318|[Number of Distinct Roll Sequences](./solutions/2318-number-of-distinct-roll-sequences.js)|Hard|
 2319|[Check if Matrix Is X-Matrix](./solutions/2319-check-if-matrix-is-x-matrix.js)|Easy|
 2320|[Count Number of Ways to Place Houses](./solutions/2320-count-number-of-ways-to-place-houses.js)|Medium|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
diff --git a/solutions/2318-number-of-distinct-roll-sequences.js b/solutions/2318-number-of-distinct-roll-sequences.js
new file mode 100644
index 00000000..5f67f5c0
--- /dev/null
+++ b/solutions/2318-number-of-distinct-roll-sequences.js
@@ -0,0 +1,55 @@
+/**
+ * 2318. Number of Distinct Roll Sequences
+ * https://leetcode.com/problems/number-of-distinct-roll-sequences/
+ * Difficulty: Hard
+ *
+ * You are given an integer n. You roll a fair 6-sided dice n times. Determine the total number
+ * of distinct sequences of rolls possible such that the following conditions are satisfied:
+ * 1. The greatest common divisor of any adjacent values in the sequence is equal to 1.
+ * 2. There is at least a gap of 2 rolls between equal valued rolls. More formally, if the
+ *    value of the ith roll is equal to the value of the jth roll, then abs(i - j) > 2.
+ *
+ * Return the total number of distinct sequences possible. Since the answer may be very large,
+ * return it modulo 109 + 7.
+ *
+ * Two sequences are considered distinct if at least one element is different.
+ */
+
+/**
+ * @param {number} n
+ * @return {number}
+ */
+var distinctSequences = function(n) {
+  const MOD = 1e9 + 7;
+  const gcd = (a, b) => b === 0 ? a : gcd(b, a % b);
+
+  const dp = new Array(n + 1)
+    .fill()
+    .map(() => new Array(7).fill().map(() => new Array(7).fill(0)));
+
+  for (let i = 1; i <= 6; i++) {
+    dp[1][i][0] = 1;
+  }
+
+  for (let len = 2; len <= n; len++) {
+    for (let curr = 1; curr <= 6; curr++) {
+      for (let prev = 0; prev <= 6; prev++) {
+        for (let prevPrev = 0; prevPrev <= 6; prevPrev++) {
+          if (dp[len - 1][prev][prevPrev] === 0) continue;
+          if (curr === prev || curr === prevPrev) continue;
+          if (prev !== 0 && gcd(curr, prev) !== 1) continue;
+          dp[len][curr][prev] = (dp[len][curr][prev] + dp[len - 1][prev][prevPrev]) % MOD;
+        }
+      }
+    }
+  }
+
+  let result = 0;
+  for (let curr = 1; curr <= 6; curr++) {
+    for (let prev = 0; prev <= 6; prev++) {
+      result = (result + dp[n][curr][prev]) % MOD;
+    }
+  }
+
+  return result;
+};

From 6280be03be4dbbbce3b3e567674e3300744217e5 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Mon, 19 May 2025 23:22:06 -0500
Subject: [PATCH 177/571] Add solution #2321

---
 README.md                                     |  3 +-
 .../2321-maximum-score-of-spliced-array.js    | 52 +++++++++++++++++++
 2 files changed, 54 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2321-maximum-score-of-spliced-array.js

diff --git a/README.md b/README.md
index dc05171d..f20841a4 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,885 LeetCode solutions in JavaScript
+# 1,886 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1763,6 +1763,7 @@
 2318|[Number of Distinct Roll Sequences](./solutions/2318-number-of-distinct-roll-sequences.js)|Hard|
 2319|[Check if Matrix Is X-Matrix](./solutions/2319-check-if-matrix-is-x-matrix.js)|Easy|
 2320|[Count Number of Ways to Place Houses](./solutions/2320-count-number-of-ways-to-place-houses.js)|Medium|
+2321|[Maximum Score Of Spliced Array](./solutions/2321-maximum-score-of-spliced-array.js)|Hard|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
 2338|[Count the Number of Ideal Arrays](./solutions/2338-count-the-number-of-ideal-arrays.js)|Hard|
 2342|[Max Sum of a Pair With Equal Sum of Digits](./solutions/2342-max-sum-of-a-pair-with-equal-sum-of-digits.js)|Medium|
diff --git a/solutions/2321-maximum-score-of-spliced-array.js b/solutions/2321-maximum-score-of-spliced-array.js
new file mode 100644
index 00000000..3ecf5068
--- /dev/null
+++ b/solutions/2321-maximum-score-of-spliced-array.js
@@ -0,0 +1,52 @@
+/**
+ * 2321. Maximum Score Of Spliced Array
+ * https://leetcode.com/problems/maximum-score-of-spliced-array/
+ * Difficulty: Hard
+ *
+ * You are given two 0-indexed integer arrays nums1 and nums2, both of length n.
+ *
+ * You can choose two integers left and right where 0 <= left <= right < n and swap the subarray
+ * nums1[left...right] with the subarray nums2[left...right].
+ * - For example, if nums1 = [1,2,3,4,5] and nums2 = [11,12,13,14,15] and you choose left = 1 and
+ *   right = 2, nums1 becomes [1,12,13,4,5] and nums2 becomes [11,2,3,14,15].
+ *
+ * You may choose to apply the mentioned operation once or not do anything.
+ *
+ * The score of the arrays is the maximum of sum(nums1) and sum(nums2), where sum(arr) is the sum
+ * of all the elements in the array arr.
+ *
+ * Return the maximum possible score.
+ *
+ * A subarray is a contiguous sequence of elements within an array. arr[left...right] denotes the
+ * subarray that contains the elements of nums between indices left and right (inclusive).
+ */
+
+/**
+ * @param {number[]} nums1
+ * @param {number[]} nums2
+ * @return {number}
+ */
+var maximumsSplicedArray = function(nums1, nums2) {
+  const length = nums1.length;
+  let sum1 = 0;
+  let sum2 = 0;
+
+  for (let i = 0; i < length; i++) {
+    sum1 += nums1[i];
+    sum2 += nums2[i];
+  }
+
+  let maxGain1 = 0;
+  let maxGain2 = 0;
+  let currGain1 = 0;
+  let currGain2 = 0;
+
+  for (let i = 0; i < length; i++) {
+    currGain1 = Math.max(0, currGain1 + nums2[i] - nums1[i]);
+    currGain2 = Math.max(0, currGain2 + nums1[i] - nums2[i]);
+    maxGain1 = Math.max(maxGain1, currGain1);
+    maxGain2 = Math.max(maxGain2, currGain2);
+  }
+
+  return Math.max(sum1 + maxGain1, sum2 + maxGain2);
+};

From ce8272ff89d8c1feeb04aae86097d967f789001a Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Mon, 19 May 2025 23:35:19 -0500
Subject: [PATCH 178/571] Add solution #2322

---
 README.md                                     |   3 +-
 ...-minimum-score-after-removals-on-a-tree.js | 112 ++++++++++++++++++
 2 files changed, 114 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2322-minimum-score-after-removals-on-a-tree.js

diff --git a/README.md b/README.md
index f20841a4..88dcffe8 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,886 LeetCode solutions in JavaScript
+# 1,887 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1764,6 +1764,7 @@
 2319|[Check if Matrix Is X-Matrix](./solutions/2319-check-if-matrix-is-x-matrix.js)|Easy|
 2320|[Count Number of Ways to Place Houses](./solutions/2320-count-number-of-ways-to-place-houses.js)|Medium|
 2321|[Maximum Score Of Spliced Array](./solutions/2321-maximum-score-of-spliced-array.js)|Hard|
+2322|[Minimum Score After Removals on a Tree](./solutions/2322-minimum-score-after-removals-on-a-tree.js)|Hard|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
 2338|[Count the Number of Ideal Arrays](./solutions/2338-count-the-number-of-ideal-arrays.js)|Hard|
 2342|[Max Sum of a Pair With Equal Sum of Digits](./solutions/2342-max-sum-of-a-pair-with-equal-sum-of-digits.js)|Medium|
diff --git a/solutions/2322-minimum-score-after-removals-on-a-tree.js b/solutions/2322-minimum-score-after-removals-on-a-tree.js
new file mode 100644
index 00000000..4b0b6cd0
--- /dev/null
+++ b/solutions/2322-minimum-score-after-removals-on-a-tree.js
@@ -0,0 +1,112 @@
+/**
+ * 2322. Minimum Score After Removals on a Tree
+ * https://leetcode.com/problems/minimum-score-after-removals-on-a-tree/
+ * Difficulty: Hard
+ *
+ * There is an undirected connected tree with n nodes labeled from 0 to n - 1 and n - 1 edges.
+ *
+ * You are given a 0-indexed integer array nums of length n where nums[i] represents the value
+ * of the ith node. You are also given a 2D integer array edges of length n - 1 where
+ * edges[i] = [ai, bi] indicates that there is an edge between nodes ai and bi in the tree.
+ *
+ * Remove two distinct edges of the tree to form three connected components. For a pair of
+ * removed edges, the following steps are defined:
+ * 1. Get the XOR of all the values of the nodes for each of the three components respectively.
+ * 2. The difference between the largest XOR value and the smallest XOR value is the score of
+ *    the pair.
+ * 3. For example, say the three components have the node values: [4,5,7], [1,9], and [3,3,3].
+ *    The three XOR values are 4 ^ 5 ^ 7 = 6, 1 ^ 9 = 8, and 3 ^ 3 ^ 3 = 3. The largest XOR
+ *    value is 8 and the smallest XOR value is 3. The score is then 8 - 3 = 5.
+ *
+ * Return the minimum score of any possible pair of edge removals on the given tree.
+ */
+
+/**
+* @param {number[]} nums
+* @param {number[][]} edges
+* @return {number}
+*/
+var minimumScore = function(nums, edges) {
+  const n = nums.length;
+  const graph = Array.from({ length: n }, () => []);
+
+  for (const [a, b] of edges) {
+    graph[a].push(b);
+    graph[b].push(a);
+  }
+
+  const totalXor = nums.reduce((acc, num) => acc ^ num, 0);
+
+  const subtreeXor = new Array(n).fill(0);
+
+  const tin = new Array(n);
+  const tout = new Array(n);
+  let timer = 0;
+
+  function dfs(node, parent) {
+    tin[node] = timer++;
+    subtreeXor[node] = nums[node];
+
+    for (const neighbor of graph[node]) {
+      if (neighbor !== parent) {
+        dfs(neighbor, node);
+        subtreeXor[node] ^= subtreeXor[neighbor];
+      }
+    }
+
+    tout[node] = timer++;
+  }
+
+  dfs(0, -1);
+
+  function isAncestor(a, b) {
+    return tin[a] <= tin[b] && tout[a] >= tout[b];
+  }
+
+  let result = Infinity;
+  for (let i = 0; i < n - 1; i++) {
+    for (let j = i + 1; j < n - 1; j++) {
+      const edge1 = edges[i];
+      const edge2 = edges[j];
+
+      let node1;
+      if (isAncestor(edge1[0], edge1[1])) {
+        node1 = edge1[1];
+      } else {
+        node1 = edge1[0];
+      }
+      const subtree1 = subtreeXor[node1];
+
+      let node2;
+      if (isAncestor(edge2[0], edge2[1])) {
+        node2 = edge2[1];
+      } else {
+        node2 = edge2[0];
+      }
+      const subtree2 = subtreeXor[node2];
+
+      let component1;
+      let component2;
+      let component3;
+      if (isAncestor(node1, node2)) {
+        component1 = subtree2;
+        component2 = subtree1 ^ component1;
+        component3 = totalXor ^ subtree1;
+      } else if (isAncestor(node2, node1)) {
+        component1 = subtree1;
+        component2 = subtree2 ^ component1;
+        component3 = totalXor ^ subtree2;
+      } else {
+        component1 = subtree1;
+        component2 = subtree2;
+        component3 = totalXor ^ component1 ^ component2;
+      }
+
+      const maxXor = Math.max(component1, component2, component3);
+      const minXor = Math.min(component1, component2, component3);
+      result = Math.min(result, maxXor - minXor);
+    }
+  }
+
+  return result;
+};

From 9dd0030b28d2c412c8ad7cc7b988dbbde589b47b Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Mon, 19 May 2025 23:36:15 -0500
Subject: [PATCH 179/571] Add solution #2325

---
 README.md                            |  3 +-
 solutions/2325-decode-the-message.js | 41 ++++++++++++++++++++++++++++
 2 files changed, 43 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2325-decode-the-message.js

diff --git a/README.md b/README.md
index 88dcffe8..67d1a520 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,887 LeetCode solutions in JavaScript
+# 1,888 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1765,6 +1765,7 @@
 2320|[Count Number of Ways to Place Houses](./solutions/2320-count-number-of-ways-to-place-houses.js)|Medium|
 2321|[Maximum Score Of Spliced Array](./solutions/2321-maximum-score-of-spliced-array.js)|Hard|
 2322|[Minimum Score After Removals on a Tree](./solutions/2322-minimum-score-after-removals-on-a-tree.js)|Hard|
+2325|[Decode the Message](./solutions/2325-decode-the-message.js)|Easy|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
 2338|[Count the Number of Ideal Arrays](./solutions/2338-count-the-number-of-ideal-arrays.js)|Hard|
 2342|[Max Sum of a Pair With Equal Sum of Digits](./solutions/2342-max-sum-of-a-pair-with-equal-sum-of-digits.js)|Medium|
diff --git a/solutions/2325-decode-the-message.js b/solutions/2325-decode-the-message.js
new file mode 100644
index 00000000..bde90e23
--- /dev/null
+++ b/solutions/2325-decode-the-message.js
@@ -0,0 +1,41 @@
+/**
+ * 2325. Decode the Message
+ * https://leetcode.com/problems/decode-the-message/
+ * Difficulty: Easy
+ *
+ * You are given the strings key and message, which represent a cipher key and a secret message,
+ * respectively. The steps to decode message are as follows:
+ * 1. Use the first appearance of all 26 lowercase English letters in key as the order of the
+ *    substitution table.
+ * 2. Align the substitution table with the regular English alphabet.
+ * 3. Each letter in message is then substituted using the table.
+ * 4. Spaces ' ' are transformed to themselves.
+ * 5. For example, given key = "happy boy" (actual key would have at least one instance of each
+ *    letter in the alphabet), we have the partial substitution table of ('h' -> 'a', 'a' -> 'b',
+ *    'p' -> 'c', 'y' -> 'd', 'b' -> 'e', 'o' -> 'f').
+ *
+ * Return the decoded message.
+ */
+
+/**
+ * @param {string} key
+ * @param {string} message
+ * @return {string}
+ */
+var decodeMessage = function(key, message) {
+  const substitution = new Map();
+  let alphabetIndex = 0;
+
+  for (const char of key) {
+    if (char !== ' ' && !substitution.has(char)) {
+      substitution.set(char, String.fromCharCode(97 + alphabetIndex++));
+    }
+  }
+
+  let result = '';
+  for (const char of message) {
+    result += char === ' ' ? ' ' : substitution.get(char);
+  }
+
+  return result;
+};

From 170f3eeb4a6d445e16eaf8c7b03c563f113c095d Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Mon, 19 May 2025 23:37:38 -0500
Subject: [PATCH 180/571] Add solution #2326

---
 README.md                          |  3 +-
 solutions/2326-spiral-matrix-iv.js | 65 ++++++++++++++++++++++++++++++
 2 files changed, 67 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2326-spiral-matrix-iv.js

diff --git a/README.md b/README.md
index 67d1a520..09bbbbca 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,888 LeetCode solutions in JavaScript
+# 1,889 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1766,6 +1766,7 @@
 2321|[Maximum Score Of Spliced Array](./solutions/2321-maximum-score-of-spliced-array.js)|Hard|
 2322|[Minimum Score After Removals on a Tree](./solutions/2322-minimum-score-after-removals-on-a-tree.js)|Hard|
 2325|[Decode the Message](./solutions/2325-decode-the-message.js)|Easy|
+2326|[Spiral Matrix IV](./solutions/2326-spiral-matrix-iv.js)|Medium|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
 2338|[Count the Number of Ideal Arrays](./solutions/2338-count-the-number-of-ideal-arrays.js)|Hard|
 2342|[Max Sum of a Pair With Equal Sum of Digits](./solutions/2342-max-sum-of-a-pair-with-equal-sum-of-digits.js)|Medium|
diff --git a/solutions/2326-spiral-matrix-iv.js b/solutions/2326-spiral-matrix-iv.js
new file mode 100644
index 00000000..1fa98050
--- /dev/null
+++ b/solutions/2326-spiral-matrix-iv.js
@@ -0,0 +1,65 @@
+/**
+ * 2326. Spiral Matrix IV
+ * https://leetcode.com/problems/spiral-matrix-iv/
+ * Difficulty: Medium
+ *
+ * You are given two integers m and n, which represent the dimensions of a matrix.
+ *
+ * You are also given the head of a linked list of integers.
+ *
+ * Generate an m x n matrix that contains the integers in the linked list presented in spiral
+ * order (clockwise), starting from the top-left of the matrix. If there are remaining empty
+ * spaces, fill them with -1.
+ *
+ * Return the generated matrix.
+ */
+
+/**
+ * Definition for singly-linked list.
+ * function ListNode(val, next) {
+ *     this.val = (val===undefined ? 0 : val)
+ *     this.next = (next===undefined ? null : next)
+ * }
+ */
+/**
+ * @param {number} m
+ * @param {number} n
+ * @param {ListNode} head
+ * @return {number[][]}
+ */
+var spiralMatrix = function(m, n, head) {
+  const matrix = new Array(m).fill().map(() => new Array(n).fill(-1));
+  let top = 0;
+  let bottom = m - 1;
+  let left = 0;
+  let right = n - 1;
+  let current = head;
+
+  while (top <= bottom && left <= right && current) {
+    for (let col = left; col <= right && current; col++) {
+      matrix[top][col] = current.val;
+      current = current.next;
+    }
+    top++;
+
+    for (let row = top; row <= bottom && current; row++) {
+      matrix[row][right] = current.val;
+      current = current.next;
+    }
+    right--;
+
+    for (let col = right; col >= left && current; col--) {
+      matrix[bottom][col] = current.val;
+      current = current.next;
+    }
+    bottom--;
+
+    for (let row = bottom; row >= top && current; row--) {
+      matrix[row][left] = current.val;
+      current = current.next;
+    }
+    left++;
+  }
+
+  return matrix;
+};

From 5c034238bdf96d95dddb195e2c1ac206da9768d3 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Mon, 19 May 2025 23:39:19 -0500
Subject: [PATCH 181/571] Add solution #2328

---
 README.md                                     |  3 +-
 ...28-number-of-increasing-paths-in-a-grid.js | 53 +++++++++++++++++++
 2 files changed, 55 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2328-number-of-increasing-paths-in-a-grid.js

diff --git a/README.md b/README.md
index 09bbbbca..25a09019 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,889 LeetCode solutions in JavaScript
+# 1,890 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1767,6 +1767,7 @@
 2322|[Minimum Score After Removals on a Tree](./solutions/2322-minimum-score-after-removals-on-a-tree.js)|Hard|
 2325|[Decode the Message](./solutions/2325-decode-the-message.js)|Easy|
 2326|[Spiral Matrix IV](./solutions/2326-spiral-matrix-iv.js)|Medium|
+2328|[Number of Increasing Paths in a Grid](./solutions/2328-number-of-increasing-paths-in-a-grid.js)|Hard|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
 2338|[Count the Number of Ideal Arrays](./solutions/2338-count-the-number-of-ideal-arrays.js)|Hard|
 2342|[Max Sum of a Pair With Equal Sum of Digits](./solutions/2342-max-sum-of-a-pair-with-equal-sum-of-digits.js)|Medium|
diff --git a/solutions/2328-number-of-increasing-paths-in-a-grid.js b/solutions/2328-number-of-increasing-paths-in-a-grid.js
new file mode 100644
index 00000000..f239c80c
--- /dev/null
+++ b/solutions/2328-number-of-increasing-paths-in-a-grid.js
@@ -0,0 +1,53 @@
+/**
+ * 2328. Number of Increasing Paths in a Grid
+ * https://leetcode.com/problems/number-of-increasing-paths-in-a-grid/
+ * Difficulty: Hard
+ *
+ * You are given an m x n integer matrix grid, where you can move from a cell to any adjacent
+ * cell in all 4 directions.
+ *
+ * Return the number of strictly increasing paths in the grid such that you can start from any
+ * cell and end at any cell. Since the answer may be very large, return it modulo 109 + 7.
+ *
+ * Two paths are considered different if they do not have exactly the same sequence of visited
+ * cells.
+ */
+
+/**
+ * @param {number[][]} grid
+ * @return {number}
+ */
+var countPaths = function(grid) {
+  const MOD = 1e9 + 7;
+  const rows = grid.length;
+  const cols = grid[0].length;
+  const cache = new Array(rows).fill().map(() => new Array(cols).fill(0));
+  const directions = [[0, 1], [1, 0], [0, -1], [-1, 0]];
+
+  function explore(row, col) {
+    if (cache[row][col]) return cache[row][col];
+
+    let paths = 1;
+    for (const [dr, dc] of directions) {
+      const newRow = row + dr;
+      const newCol = col + dc;
+      if (
+        newRow >= 0 && newRow < rows && newCol >= 0
+        && newCol < cols && grid[newRow][newCol] > grid[row][col]
+      ) {
+        paths = (paths + explore(newRow, newCol)) % MOD;
+      }
+    }
+
+    return cache[row][col] = paths;
+  }
+
+  let total = 0;
+  for (let i = 0; i < rows; i++) {
+    for (let j = 0; j < cols; j++) {
+      total = (total + explore(i, j)) % MOD;
+    }
+  }
+
+  return total;
+};

From 592bcca94fd740c12088872ec24306d56266e117 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Mon, 19 May 2025 23:45:30 -0500
Subject: [PATCH 182/571] Add solution #2331

---
 README.md                                     |  3 +-
 .../2331-evaluate-boolean-binary-tree.js      | 42 +++++++++++++++++++
 2 files changed, 44 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2331-evaluate-boolean-binary-tree.js

diff --git a/README.md b/README.md
index 25a09019..81c5cb79 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,890 LeetCode solutions in JavaScript
+# 1,891 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1768,6 +1768,7 @@
 2325|[Decode the Message](./solutions/2325-decode-the-message.js)|Easy|
 2326|[Spiral Matrix IV](./solutions/2326-spiral-matrix-iv.js)|Medium|
 2328|[Number of Increasing Paths in a Grid](./solutions/2328-number-of-increasing-paths-in-a-grid.js)|Hard|
+2331|[Evaluate Boolean Binary Tree](./solutions/2331-evaluate-boolean-binary-tree.js)|Easy|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
 2338|[Count the Number of Ideal Arrays](./solutions/2338-count-the-number-of-ideal-arrays.js)|Hard|
 2342|[Max Sum of a Pair With Equal Sum of Digits](./solutions/2342-max-sum-of-a-pair-with-equal-sum-of-digits.js)|Medium|
diff --git a/solutions/2331-evaluate-boolean-binary-tree.js b/solutions/2331-evaluate-boolean-binary-tree.js
new file mode 100644
index 00000000..d6f4d851
--- /dev/null
+++ b/solutions/2331-evaluate-boolean-binary-tree.js
@@ -0,0 +1,42 @@
+/**
+ * 2331. Evaluate Boolean Binary Tree
+ * https://leetcode.com/problems/evaluate-boolean-binary-tree/
+ * Difficulty: Easy
+ *
+ * You are given the root of a full binary tree with the following properties:
+ * - Leaf nodes have either the value 0 or 1, where 0 represents False and 1 represents True.
+ * - Non-leaf nodes have either the value 2 or 3, where 2 represents the boolean OR and 3 represents
+ *   the boolean AND.
+ *
+ * The evaluation of a node is as follows:
+ * - If the node is a leaf node, the evaluation is the value of the node, i.e. True or False.
+ * - Otherwise, evaluate the node's two children and apply the boolean operation of its value with
+ *   the children's evaluations.
+ *
+ * Return the boolean result of evaluating the root node.
+ *
+ * A full binary tree is a binary tree where each node has either 0 or 2 children.
+ *
+ * A leaf node is a node that has zero children.
+ */
+
+/**
+ * Definition for a binary tree node.
+ * function TreeNode(val, left, right) {
+ *     this.val = (val===undefined ? 0 : val)
+ *     this.left = (left===undefined ? null : left)
+ *     this.right = (right===undefined ? null : right)
+ * }
+ */
+/**
+ * @param {TreeNode} root
+ * @return {boolean}
+ */
+var evaluateTree = function(root) {
+  if (!root.left && !root.right) return root.val === 1;
+
+  const leftResult = evaluateTree(root.left);
+  const rightResult = evaluateTree(root.right);
+
+  return root.val === 2 ? leftResult || rightResult : leftResult && rightResult;
+};

From 21f422e158d97269b6a02f5b2efa4788bfe75076 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Mon, 19 May 2025 23:47:51 -0500
Subject: [PATCH 183/571] Add solution #2334

---
 README.md                                     |  3 +-
 ...elements-greater-than-varying-threshold.js | 43 +++++++++++++++++++
 2 files changed, 45 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2334-subarray-with-elements-greater-than-varying-threshold.js

diff --git a/README.md b/README.md
index 81c5cb79..576739b6 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,891 LeetCode solutions in JavaScript
+# 1,892 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1769,6 +1769,7 @@
 2326|[Spiral Matrix IV](./solutions/2326-spiral-matrix-iv.js)|Medium|
 2328|[Number of Increasing Paths in a Grid](./solutions/2328-number-of-increasing-paths-in-a-grid.js)|Hard|
 2331|[Evaluate Boolean Binary Tree](./solutions/2331-evaluate-boolean-binary-tree.js)|Easy|
+2334|[Subarray With Elements Greater Than Varying Threshold](./solutions/2334-subarray-with-elements-greater-than-varying-threshold.js)|Hard|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
 2338|[Count the Number of Ideal Arrays](./solutions/2338-count-the-number-of-ideal-arrays.js)|Hard|
 2342|[Max Sum of a Pair With Equal Sum of Digits](./solutions/2342-max-sum-of-a-pair-with-equal-sum-of-digits.js)|Medium|
diff --git a/solutions/2334-subarray-with-elements-greater-than-varying-threshold.js b/solutions/2334-subarray-with-elements-greater-than-varying-threshold.js
new file mode 100644
index 00000000..789a5ff3
--- /dev/null
+++ b/solutions/2334-subarray-with-elements-greater-than-varying-threshold.js
@@ -0,0 +1,43 @@
+/**
+ * 2334. Subarray With Elements Greater Than Varying Threshold
+ * https://leetcode.com/problems/subarray-with-elements-greater-than-varying-threshold/
+ * Difficulty: Hard
+ *
+ * You are given an integer array nums and an integer threshold.
+ *
+ * Find any subarray of nums of length k such that every element in the subarray is greater
+ * than threshold / k.
+ *
+ * Return the size of any such subarray. If there is no such subarray, return -1.
+ *
+ * A subarray is a contiguous non-empty sequence of elements within an array.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} threshold
+ * @return {number}
+ */
+var validSubarraySize = function(nums, threshold) {
+  const n = nums.length;
+  const stack = [];
+  const nextSmaller = new Array(n).fill(n);
+  const prevSmaller = new Array(n).fill(-1);
+
+  for (let i = 0; i < n; i++) {
+    while (stack.length && nums[stack[stack.length - 1]] >= nums[i]) {
+      nextSmaller[stack.pop()] = i;
+    }
+    if (stack.length) prevSmaller[i] = stack[stack.length - 1];
+    stack.push(i);
+  }
+
+  for (let i = 0; i < n; i++) {
+    const k = nextSmaller[i] - prevSmaller[i] - 1;
+    if (k > 0 && nums[i] > threshold / k) {
+      return k;
+    }
+  }
+
+  return -1;
+};

From 6fa77e5f691a17d00ce55d80ff8937d07046c274 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Mon, 19 May 2025 23:49:01 -0500
Subject: [PATCH 184/571] Add solution #2337

---
 README.md                                     |  3 +-
 .../2337-move-pieces-to-obtain-a-string.js    | 41 +++++++++++++++++++
 2 files changed, 43 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2337-move-pieces-to-obtain-a-string.js

diff --git a/README.md b/README.md
index 576739b6..6ea96646 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,892 LeetCode solutions in JavaScript
+# 1,893 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1771,6 +1771,7 @@
 2331|[Evaluate Boolean Binary Tree](./solutions/2331-evaluate-boolean-binary-tree.js)|Easy|
 2334|[Subarray With Elements Greater Than Varying Threshold](./solutions/2334-subarray-with-elements-greater-than-varying-threshold.js)|Hard|
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
+2337|[Move Pieces to Obtain a String](./solutions/2337-move-pieces-to-obtain-a-string.js)|Medium|
 2338|[Count the Number of Ideal Arrays](./solutions/2338-count-the-number-of-ideal-arrays.js)|Hard|
 2342|[Max Sum of a Pair With Equal Sum of Digits](./solutions/2342-max-sum-of-a-pair-with-equal-sum-of-digits.js)|Medium|
 2349|[Design a Number Container System](./solutions/2349-design-a-number-container-system.js)|Medium|
diff --git a/solutions/2337-move-pieces-to-obtain-a-string.js b/solutions/2337-move-pieces-to-obtain-a-string.js
new file mode 100644
index 00000000..64f29a9a
--- /dev/null
+++ b/solutions/2337-move-pieces-to-obtain-a-string.js
@@ -0,0 +1,41 @@
+/**
+ * 2337. Move Pieces to Obtain a String
+ * https://leetcode.com/problems/move-pieces-to-obtain-a-string/
+ * Difficulty: Medium
+ *
+ * You are given two strings start and target, both of length n. Each string consists only of
+ * the characters 'L', 'R', and '_' where:
+ * - The characters 'L' and 'R' represent pieces, where a piece 'L' can move to the left only if
+ *   there is a blank space directly to its left, and a piece 'R' can move to the right only if
+ *   there is a blank space directly to its right.
+ * - The character '_' represents a blank space that can be occupied by any of the 'L' or 'R'
+ *   pieces.
+ *
+ * Return true if it is possible to obtain the string target by moving the pieces of the string
+ * start any number of times. Otherwise, return false.
+ */
+
+/**
+ * @param {string} start
+ * @param {string} target
+ * @return {boolean}
+ */
+var canChange = function(start, target) {
+  const pieces = [];
+  const targetPieces = [];
+
+  for (let i = 0; i < start.length; i++) {
+    if (start[i] !== '_') pieces.push([start[i], i]);
+    if (target[i] !== '_') targetPieces.push([target[i], i]);
+  }
+
+  if (pieces.length !== targetPieces.length) return false;
+
+  for (let i = 0; i < pieces.length; i++) {
+    if (pieces[i][0] !== targetPieces[i][0]) return false;
+    if (pieces[i][0] === 'L' && pieces[i][1] < targetPieces[i][1]) return false;
+    if (pieces[i][0] === 'R' && pieces[i][1] > targetPieces[i][1]) return false;
+  }
+
+  return true;
+};

From 1fdb40cb99420b157229c8afef70905506d15248 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Mon, 19 May 2025 23:50:26 -0500
Subject: [PATCH 185/571] Add solution #2341

---
 README.md                                     |  3 +-
 .../2341-maximum-number-of-pairs-in-array.js  | 35 +++++++++++++++++++
 2 files changed, 37 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2341-maximum-number-of-pairs-in-array.js

diff --git a/README.md b/README.md
index 6ea96646..33118caa 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,893 LeetCode solutions in JavaScript
+# 1,894 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1773,6 +1773,7 @@
 2336|[Smallest Number in Infinite Set](./solutions/2336-smallest-number-in-infinite-set.js)|Medium|
 2337|[Move Pieces to Obtain a String](./solutions/2337-move-pieces-to-obtain-a-string.js)|Medium|
 2338|[Count the Number of Ideal Arrays](./solutions/2338-count-the-number-of-ideal-arrays.js)|Hard|
+2341|[Maximum Number of Pairs in Array](./solutions/2341-maximum-number-of-pairs-in-array.js)|Easy|
 2342|[Max Sum of a Pair With Equal Sum of Digits](./solutions/2342-max-sum-of-a-pair-with-equal-sum-of-digits.js)|Medium|
 2349|[Design a Number Container System](./solutions/2349-design-a-number-container-system.js)|Medium|
 2352|[Equal Row and Column Pairs](./solutions/2352-equal-row-and-column-pairs.js)|Medium|
diff --git a/solutions/2341-maximum-number-of-pairs-in-array.js b/solutions/2341-maximum-number-of-pairs-in-array.js
new file mode 100644
index 00000000..2cdcce2c
--- /dev/null
+++ b/solutions/2341-maximum-number-of-pairs-in-array.js
@@ -0,0 +1,35 @@
+/**
+ * 2341. Maximum Number of Pairs in Array
+ * https://leetcode.com/problems/maximum-number-of-pairs-in-array/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed integer array nums. In one operation, you may do the following:
+ * - Choose two integers in nums that are equal.
+ * - Remove both integers from nums, forming a pair.
+ *
+ * The operation is done on nums as many times as possible.
+ *
+ * Return a 0-indexed integer array answer of size 2 where answer[0] is the number of pairs that
+ * are formed and answer[1] is the number of leftover integers in nums after doing the operation
+ * as many times as possible.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number[]}
+ */
+var numberOfPairs = function(nums) {
+  const frequency = new Map();
+  let pairs = 0;
+
+  for (const num of nums) {
+    frequency.set(num, (frequency.get(num) || 0) + 1);
+    if (frequency.get(num) === 2) {
+      pairs++;
+      frequency.set(num, 0);
+    }
+  }
+
+  const leftovers = nums.length - pairs * 2;
+  return [pairs, leftovers];
+};

From e13fb6acfdf45479f1f82a1f8edf6a6dc507c6cf Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Mon, 19 May 2025 23:52:39 -0500
Subject: [PATCH 186/571] Add solution #2347

---
 README.md                         |  3 ++-
 solutions/2347-best-poker-hand.js | 41 +++++++++++++++++++++++++++++++
 2 files changed, 43 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2347-best-poker-hand.js

diff --git a/README.md b/README.md
index 33118caa..92d4f641 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,894 LeetCode solutions in JavaScript
+# 1,895 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1775,6 +1775,7 @@
 2338|[Count the Number of Ideal Arrays](./solutions/2338-count-the-number-of-ideal-arrays.js)|Hard|
 2341|[Maximum Number of Pairs in Array](./solutions/2341-maximum-number-of-pairs-in-array.js)|Easy|
 2342|[Max Sum of a Pair With Equal Sum of Digits](./solutions/2342-max-sum-of-a-pair-with-equal-sum-of-digits.js)|Medium|
+2347|[Best Poker Hand](./solutions/2347-best-poker-hand.js)|Easy|
 2349|[Design a Number Container System](./solutions/2349-design-a-number-container-system.js)|Medium|
 2352|[Equal Row and Column Pairs](./solutions/2352-equal-row-and-column-pairs.js)|Medium|
 2364|[Count Number of Bad Pairs](./solutions/2364-count-number-of-bad-pairs.js)|Medium|
diff --git a/solutions/2347-best-poker-hand.js b/solutions/2347-best-poker-hand.js
new file mode 100644
index 00000000..586dcda2
--- /dev/null
+++ b/solutions/2347-best-poker-hand.js
@@ -0,0 +1,41 @@
+/**
+ * 2347. Best Poker Hand
+ * https://leetcode.com/problems/best-poker-hand/
+ * Difficulty: Easy
+ *
+ * You are given an integer array ranks and a character array suits. You have 5 cards where the
+ * ith card has a rank of ranks[i] and a suit of suits[i].
+ *
+ * The following are the types of poker hands you can make from best to worst:
+ * 1. "Flush": Five cards of the same suit.
+ * 2. "Three of a Kind": Three cards of the same rank.
+ * 3. "Pair": Two cards of the same rank.
+ * 4. "High Card": Any single card.
+ *
+ * Return a string representing the best type of poker hand you can make with the given cards.
+ *
+ * Note that the return values are case-sensitive.
+ */
+
+/**
+ * @param {number[]} ranks
+ * @param {character[]} suits
+ * @return {string}
+ */
+var bestHand = function(ranks, suits) {
+  const suitCount = new Map();
+  const rankCount = new Map();
+
+  for (let i = 0; i < 5; i++) {
+    suitCount.set(suits[i], (suitCount.get(suits[i]) || 0) + 1);
+    rankCount.set(ranks[i], (rankCount.get(ranks[i]) || 0) + 1);
+  }
+
+  if (suitCount.size === 1) return 'Flush';
+
+  const maxRankCount = Math.max(...rankCount.values());
+  if (maxRankCount >= 3) return 'Three of a Kind';
+  if (maxRankCount === 2) return 'Pair';
+
+  return 'High Card';
+};

From 9f085ae5b7ab89a49c95329c1cebaf9f24665a91 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 20 May 2025 18:32:45 -0500
Subject: [PATCH 187/571] Add solution #2258

---
 README.md                                   |   3 +-
 solutions/2258-escape-the-spreading-fire.js | 118 ++++++++++++++++++++
 2 files changed, 120 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2258-escape-the-spreading-fire.js

diff --git a/README.md b/README.md
index 92d4f641..39ad8d01 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,895 LeetCode solutions in JavaScript
+# 1,896 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1725,6 +1725,7 @@
 2255|[Count Prefixes of a Given String](./solutions/2255-count-prefixes-of-a-given-string.js)|Easy|
 2256|[Minimum Average Difference](./solutions/2256-minimum-average-difference.js)|Medium|
 2257|[Count Unguarded Cells in the Grid](./solutions/2257-count-unguarded-cells-in-the-grid.js)|Medium|
+2258|[Escape the Spreading Fire](./solutions/2258-escape-the-spreading-fire.js)|Hard|
 2259|[Remove Digit From Number to Maximize Result](./solutions/2259-remove-digit-from-number-to-maximize-result.js)|Easy|
 2260|[Minimum Consecutive Cards to Pick Up](./solutions/2260-minimum-consecutive-cards-to-pick-up.js)|Medium|
 2261|[K Divisible Elements Subarrays](./solutions/2261-k-divisible-elements-subarrays.js)|Medium|
diff --git a/solutions/2258-escape-the-spreading-fire.js b/solutions/2258-escape-the-spreading-fire.js
new file mode 100644
index 00000000..7e26720a
--- /dev/null
+++ b/solutions/2258-escape-the-spreading-fire.js
@@ -0,0 +1,118 @@
+/**
+ * 2258. Escape the Spreading Fire
+ * https://leetcode.com/problems/escape-the-spreading-fire/
+ * Difficulty: Hard
+ *
+ * You are given a 0-indexed 2D integer array grid of size m x n which represents a field.
+ * Each cell has one of three values:
+ * - 0 represents grass,
+ * - 1 represents fire,
+ * - 2 represents a wall that you and fire cannot pass through.
+ *
+ * You are situated in the top-left cell, (0, 0), and you want to travel to the safehouse at the
+ * bottom-right cell, (m - 1, n - 1). Every minute, you may move to an adjacent grass cell. After
+ * your move, every fire cell will spread to all adjacent cells that are not walls.
+ *
+ * Return the maximum number of minutes that you can stay in your initial position before moving
+ * while still safely reaching the safehouse. If this is impossible, return -1. If you can always
+ * reach the safehouse regardless of the minutes stayed, return 109.
+ *
+ * Note that even if the fire spreads to the safehouse immediately after you have reached it, it
+ * will be counted as safely reaching the safehouse.
+ *
+ * A cell is adjacent to another cell if the former is directly north, east, south, or west of the
+ * latter (i.e., their sides are touching).
+ */
+
+/**
+ * @param {number[][]} grid
+ * @return {number}
+ */
+var maximumMinutes = function(grid) {
+  const m = grid.length;
+  const n = grid[0].length;
+  const directions = [[0, 1], [1, 0], [0, -1], [-1, 0]];
+  const MAX_ANSWER = 1000000000;
+
+  function isValid(x, y) {
+    return x >= 0 && x < m && y >= 0 && y < n && grid[x][y] === 0;
+  }
+
+  function calculateFireTime() {
+    const fireTime = new Array(m).fill().map(() => new Array(n).fill(Infinity));
+    const queue = [];
+
+    for (let i = 0; i < m; i++) {
+      for (let j = 0; j < n; j++) {
+        if (grid[i][j] === 1) {
+          queue.push([i, j, 0]);
+          fireTime[i][j] = 0;
+        }
+      }
+    }
+
+    while (queue.length > 0) {
+      const [x, y, time] = queue.shift();
+
+      for (const [dx, dy] of directions) {
+        const nx = x + dx;
+        const ny = y + dy;
+
+        if (isValid(nx, ny) && fireTime[nx][ny] === Infinity) {
+          fireTime[nx][ny] = time + 1;
+          queue.push([nx, ny, time + 1]);
+        }
+      }
+    }
+
+    return fireTime;
+  }
+
+  function canReachSafehouse(delay) {
+    const fireTime = calculateFireTime();
+    const visited = new Array(m).fill().map(() => new Array(n).fill(false));
+    const queue = [[0, 0, delay]];
+    visited[0][0] = true;
+
+    while (queue.length > 0) {
+      const [x, y, time] = queue.shift();
+
+      for (const [dx, dy] of directions) {
+        const nx = x + dx;
+        const ny = y + dy;
+
+        if (!isValid(nx, ny) || visited[nx][ny]) continue;
+
+        if (nx === m - 1 && ny === n - 1) {
+          if (time + 1 <= fireTime[nx][ny] || fireTime[nx][ny] === Infinity) {
+            return true;
+          }
+        }
+
+        if (time + 1 < fireTime[nx][ny]) {
+          visited[nx][ny] = true;
+          queue.push([nx, ny, time + 1]);
+        }
+      }
+    }
+
+    return false;
+  }
+
+  let left = 0;
+  let right = MAX_ANSWER;
+  let result = -1;
+
+  while (left <= right) {
+    const mid = Math.floor((left + right) / 2);
+
+    if (canReachSafehouse(mid)) {
+      result = mid;
+      left = mid + 1;
+    } else {
+      right = mid - 1;
+    }
+  }
+
+  return result;
+};

From b69f25da593609a9b2383a55406fe8f722f20aec Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 20 May 2025 18:35:22 -0500
Subject: [PATCH 188/571] Add solution #2267

---
 README.md                                     |  3 +-
 ...here-is-a-valid-parentheses-string-path.js | 57 +++++++++++++++++++
 2 files changed, 59 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2267-check-if-there-is-a-valid-parentheses-string-path.js

diff --git a/README.md b/README.md
index 39ad8d01..a2027bde 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,896 LeetCode solutions in JavaScript
+# 1,897 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1733,6 +1733,7 @@
 2264|[Largest 3-Same-Digit Number in String](./solutions/2264-largest-3-same-digit-number-in-string.js)|Easy|
 2265|[Count Nodes Equal to Average of Subtree](./solutions/2265-count-nodes-equal-to-average-of-subtree.js)|Medium|
 2266|[Count Number of Texts](./solutions/2266-count-number-of-texts.js)|Medium|
+2267|[Check if There Is a Valid Parentheses String Path](./solutions/2267-check-if-there-is-a-valid-parentheses-string-path.js)|Hard|
 2269|[Find the K-Beauty of a Number](./solutions/2269-find-the-k-beauty-of-a-number.js)|Easy|
 2270|[Number of Ways to Split Array](./solutions/2270-number-of-ways-to-split-array.js)|Medium|
 2272|[Substring With Largest Variance](./solutions/2272-substring-with-largest-variance.js)|Hard|
diff --git a/solutions/2267-check-if-there-is-a-valid-parentheses-string-path.js b/solutions/2267-check-if-there-is-a-valid-parentheses-string-path.js
new file mode 100644
index 00000000..8dc163ed
--- /dev/null
+++ b/solutions/2267-check-if-there-is-a-valid-parentheses-string-path.js
@@ -0,0 +1,57 @@
+/**
+ * 2267. Check if There Is a Valid Parentheses String Path
+ * https://leetcode.com/problems/check-if-there-is-a-valid-parentheses-string-path/
+ * Difficulty: Hard
+ *
+ * A parentheses string is a non-empty string consisting only of '(' and ')'. It is valid if any of
+ * the following conditions is true:
+ * - It is ().
+ * - It can be written as AB (A concatenated with B), where A and B are valid parentheses strings.
+ * - It can be written as (A), where A is a valid parentheses string.
+ *
+ * You are given an m x n matrix of parentheses grid. A valid parentheses string path in the grid
+ * is a path satisfying all of the following conditions:
+ * - The path starts from the upper left cell (0, 0).
+ * - The path ends at the bottom-right cell (m - 1, n - 1).
+ * - The path only ever moves down or right.
+ * - The resulting parentheses string formed by the path is valid.
+ *
+ * Return true if there exists a valid parentheses string path in the grid. Otherwise, return false.
+ */
+
+/**
+* @param {character[][]} grid
+* @return {boolean}
+*/
+var hasValidPath = function(grid) {
+  const m = grid.length;
+  const n = grid[0].length;
+
+  if ((m + n - 1) % 2 !== 0) {
+    return false;
+  }
+
+  if (grid[0][0] === ')' || grid[m - 1][n - 1] === '(') {
+    return false;
+  }
+
+  const visited = new Set();
+  return dfs(0, 0, 0);
+
+  function dfs(i, j, openCount) {
+    if (i >= m || j >= n || openCount < 0) {
+      return false;
+    }
+    openCount += grid[i][j] === '(' ? 1 : -1;
+    if (i === m - 1 && j === n - 1) {
+      return openCount === 0;
+    }
+    const key = `${i},${j},${openCount}`;
+    if (visited.has(key)) {
+      return false;
+    }
+    visited.add(key);
+
+    return dfs(i + 1, j, openCount) || dfs(i, j + 1, openCount);
+  }
+};

From d9624c85256bb2b8bea911a7bbd2a1b55a6bdb6f Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 20 May 2025 18:39:40 -0500
Subject: [PATCH 189/571] Add solution #2271

---
 README.md                                     |  3 +-
 ...maximum-white-tiles-covered-by-a-carpet.js | 50 +++++++++++++++++++
 2 files changed, 52 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2271-maximum-white-tiles-covered-by-a-carpet.js

diff --git a/README.md b/README.md
index a2027bde..68703de1 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,897 LeetCode solutions in JavaScript
+# 1,898 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1736,6 +1736,7 @@
 2267|[Check if There Is a Valid Parentheses String Path](./solutions/2267-check-if-there-is-a-valid-parentheses-string-path.js)|Hard|
 2269|[Find the K-Beauty of a Number](./solutions/2269-find-the-k-beauty-of-a-number.js)|Easy|
 2270|[Number of Ways to Split Array](./solutions/2270-number-of-ways-to-split-array.js)|Medium|
+2271|[Maximum White Tiles Covered by a Carpet](./solutions/2271-maximum-white-tiles-covered-by-a-carpet.js)|Medium|
 2272|[Substring With Largest Variance](./solutions/2272-substring-with-largest-variance.js)|Hard|
 2273|[Find Resultant Array After Removing Anagrams](./solutions/2273-find-resultant-array-after-removing-anagrams.js)|Easy|
 2274|[Maximum Consecutive Floors Without Special Floors](./solutions/2274-maximum-consecutive-floors-without-special-floors.js)|Medium|
diff --git a/solutions/2271-maximum-white-tiles-covered-by-a-carpet.js b/solutions/2271-maximum-white-tiles-covered-by-a-carpet.js
new file mode 100644
index 00000000..0af443fc
--- /dev/null
+++ b/solutions/2271-maximum-white-tiles-covered-by-a-carpet.js
@@ -0,0 +1,50 @@
+/**
+ * 2271. Maximum White Tiles Covered by a Carpet
+ * https://leetcode.com/problems/maximum-white-tiles-covered-by-a-carpet/
+ * Difficulty: Medium
+ *
+ * You are given a 2D integer array tiles where tiles[i] = [li, ri] represents that every tile
+ * j in the range li <= j <= ri is colored white.
+ *
+ * You are also given an integer carpetLen, the length of a single carpet that can be placed
+ * anywhere.
+ *
+ * Return the maximum number of white tiles that can be covered by the carpet.
+ */
+
+/**
+ * @param {number[][]} tiles
+ * @param {number} carpetLen
+ * @return {number}
+ */
+var maximumWhiteTiles = function(tiles, carpetLen) {
+  tiles.sort((a, b) => a[0] - b[0]);
+
+  let result = 0;
+  let covered = 0;
+  let j = 0;
+
+  for (let i = 0; i < tiles.length; i++) {
+    const carpetEnd = tiles[i][0] + carpetLen - 1;
+
+    while (j < tiles.length && tiles[j][0] <= carpetEnd) {
+      if (tiles[j][1] <= carpetEnd) {
+        covered += tiles[j][1] - tiles[j][0] + 1;
+        j++;
+      } else {
+        covered += carpetEnd - tiles[j][0] + 1;
+        result = Math.max(result, covered);
+        covered -= carpetEnd - tiles[j][0] + 1;
+        break;
+      }
+    }
+
+    result = Math.max(result, covered);
+
+    if (j === tiles.length) break;
+
+    covered -= tiles[i][1] - tiles[i][0] + 1;
+  }
+
+  return result;
+};

From d3e0b1196e0719a9591721c17f67a9c86cf5078a Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 20 May 2025 18:56:20 -0500
Subject: [PATCH 190/571] Add solution #2280

---
 README.md                                     |  3 +-
 ...minimum-lines-to-represent-a-line-chart.js | 38 +++++++++++++++++++
 2 files changed, 40 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2280-minimum-lines-to-represent-a-line-chart.js

diff --git a/README.md b/README.md
index 68703de1..e38866ea 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,898 LeetCode solutions in JavaScript
+# 1,899 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1743,6 +1743,7 @@
 2275|[Largest Combination With Bitwise AND Greater Than Zero](./solutions/2275-largest-combination-with-bitwise-and-greater-than-zero.js)|Medium|
 2278|[Percentage of Letter in String](./solutions/2278-percentage-of-letter-in-string.js)|Easy|
 2279|[Maximum Bags With Full Capacity of Rocks](./solutions/2279-maximum-bags-with-full-capacity-of-rocks.js)|Medium|
+2280|[Minimum Lines to Represent a Line Chart](./solutions/2280-minimum-lines-to-represent-a-line-chart.js)|Medium|
 2283|[Check if Number Has Equal Digit Count and Digit Value](./solutions/2283-check-if-number-has-equal-digit-count-and-digit-value.js)|Easy|
 2284|[Sender With Largest Word Count](./solutions/2284-sender-with-largest-word-count.js)|Medium|
 2287|[Rearrange Characters to Make Target String](./solutions/2287-rearrange-characters-to-make-target-string.js)|Easy|
diff --git a/solutions/2280-minimum-lines-to-represent-a-line-chart.js b/solutions/2280-minimum-lines-to-represent-a-line-chart.js
new file mode 100644
index 00000000..ff401c32
--- /dev/null
+++ b/solutions/2280-minimum-lines-to-represent-a-line-chart.js
@@ -0,0 +1,38 @@
+/**
+ * 2280. Minimum Lines to Represent a Line Chart
+ * https://leetcode.com/problems/minimum-lines-to-represent-a-line-chart/
+ * Difficulty: Medium
+ *
+ * You are given a 2D integer array stockPrices where stockPrices[i] = [dayi, pricei] indicates
+ * the price of the stock on day dayi is pricei. A line chart is created from the array by
+ * plotting the points on an XY plane with the X-axis representing the day and the Y-axis
+ * representing the price and connecting adjacent points. One such example is shown below.
+ *
+ * Return the minimum number of lines needed to represent the line chart.
+ */
+
+/**
+ * @param {number[][]} stockPrices
+ * @return {number}
+ */
+var minimumLines = function(stockPrices) {
+  if (stockPrices.length <= 2) return stockPrices.length - 1;
+
+  stockPrices.sort((a, b) => a[0] - b[0]);
+
+  let lines = 1;
+  for (let i = 2; i < stockPrices.length; i++) {
+    const [x0, y0] = stockPrices[i - 2];
+    const [x1, y1] = stockPrices[i - 1];
+    const [x2, y2] = stockPrices[i];
+
+    const dx1 = BigInt(x1 - x0);
+    const dy1 = BigInt(y1 - y0);
+    const dx2 = BigInt(x2 - x1);
+    const dy2 = BigInt(y2 - y1);
+
+    if (dy1 * dx2 !== dy2 * dx1) lines++;
+  }
+
+  return lines;
+};

From 72bd6aecc26e393763a399a20f1fa535edb4c9fb Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 20 May 2025 18:57:56 -0500
Subject: [PATCH 191/571] Add solution #2288

---
 README.md                                  |  3 +-
 solutions/2288-apply-discount-to-prices.js | 37 ++++++++++++++++++++++
 2 files changed, 39 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2288-apply-discount-to-prices.js

diff --git a/README.md b/README.md
index e38866ea..6c3c2311 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,899 LeetCode solutions in JavaScript
+# 1,900 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1747,6 +1747,7 @@
 2283|[Check if Number Has Equal Digit Count and Digit Value](./solutions/2283-check-if-number-has-equal-digit-count-and-digit-value.js)|Easy|
 2284|[Sender With Largest Word Count](./solutions/2284-sender-with-largest-word-count.js)|Medium|
 2287|[Rearrange Characters to Make Target String](./solutions/2287-rearrange-characters-to-make-target-string.js)|Easy|
+2288|[Apply Discount to Prices](./solutions/2288-apply-discount-to-prices.js)|Medium|
 2293|[Min Max Game](./solutions/2293-min-max-game.js)|Easy|
 2294|[Partition Array Such That Maximum Difference Is K](./solutions/2294-partition-array-such-that-maximum-difference-is-k.js)|Medium|
 2295|[Replace Elements in an Array](./solutions/2295-replace-elements-in-an-array.js)|Medium|
diff --git a/solutions/2288-apply-discount-to-prices.js b/solutions/2288-apply-discount-to-prices.js
new file mode 100644
index 00000000..4645204e
--- /dev/null
+++ b/solutions/2288-apply-discount-to-prices.js
@@ -0,0 +1,37 @@
+/**
+ * 2288. Apply Discount to Prices
+ * https://leetcode.com/problems/apply-discount-to-prices/
+ * Difficulty: Medium
+ *
+ * A sentence is a string of single-space separated words where each word can contain digits,
+ * lowercase letters, and the dollar sign '$'. A word represents a price if it is a sequence
+ * of digits preceded by a dollar sign.
+ * - For example, "$100", "$23", and "$6" represent prices while "100", "$", and "$1e5" do not.
+ *
+ * You are given a string sentence representing a sentence and an integer discount. For each
+ * word representing a price, apply a discount of discount% on the price and update the word
+ * in the sentence. All updated prices should be represented with exactly two decimal places.
+ *
+ * Return a string representing the modified sentence.
+ *
+ * Note that all prices will contain at most 10 digits.
+ */
+
+/**
+ * @param {string} sentence
+ * @param {number} discount
+ * @return {string}
+ */
+var discountPrices = function(sentence, discount) {
+  const words = sentence.split(' ');
+  const discountFactor = 1 - discount / 100;
+
+  for (let i = 0; i < words.length; i++) {
+    if (words[i].startsWith('$') && /^[0-9]+$/.test(words[i].slice(1))) {
+      const price = parseInt(words[i].slice(1)) * discountFactor;
+      words[i] = `$${price.toFixed(2)}`;
+    }
+  }
+
+  return words.join(' ');
+};

From b71de0717b05bac9b340777ba9cfdc94b79a0785 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 20 May 2025 22:32:43 -0500
Subject: [PATCH 192/571] Add solution #2348

---
 README.md                                     |  3 +-
 .../2348-number-of-zero-filled-subarrays.js   | 29 +++++++++++++++++++
 2 files changed, 31 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2348-number-of-zero-filled-subarrays.js

diff --git a/README.md b/README.md
index 6c3c2311..13749350 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,900 LeetCode solutions in JavaScript
+# 1,901 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1781,6 +1781,7 @@
 2341|[Maximum Number of Pairs in Array](./solutions/2341-maximum-number-of-pairs-in-array.js)|Easy|
 2342|[Max Sum of a Pair With Equal Sum of Digits](./solutions/2342-max-sum-of-a-pair-with-equal-sum-of-digits.js)|Medium|
 2347|[Best Poker Hand](./solutions/2347-best-poker-hand.js)|Easy|
+2348|[Number of Zero-Filled Subarrays](./solutions/2348-number-of-zero-filled-subarrays.js)|Medium|
 2349|[Design a Number Container System](./solutions/2349-design-a-number-container-system.js)|Medium|
 2352|[Equal Row and Column Pairs](./solutions/2352-equal-row-and-column-pairs.js)|Medium|
 2364|[Count Number of Bad Pairs](./solutions/2364-count-number-of-bad-pairs.js)|Medium|
diff --git a/solutions/2348-number-of-zero-filled-subarrays.js b/solutions/2348-number-of-zero-filled-subarrays.js
new file mode 100644
index 00000000..fa93ec19
--- /dev/null
+++ b/solutions/2348-number-of-zero-filled-subarrays.js
@@ -0,0 +1,29 @@
+/**
+ * 2348. Number of Zero-Filled Subarrays
+ * https://leetcode.com/problems/number-of-zero-filled-subarrays/
+ * Difficulty: Medium
+ *
+ * Given an integer array nums, return the number of subarrays filled with 0.
+ *
+ * A subarray is a contiguous non-empty sequence of elements within an array.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var zeroFilledSubarray = function(nums) {
+  let result = 0;
+  let zeroCount = 0;
+
+  for (const num of nums) {
+    if (num === 0) {
+      zeroCount++;
+      result += zeroCount;
+    } else {
+      zeroCount = 0;
+    }
+  }
+
+  return result;
+};

From 7cb8ddc2bf62b7a3064ae08b860687c9d239b144 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 20 May 2025 22:35:21 -0500
Subject: [PATCH 193/571] Add solution #2350

---
 README.md                                     |  3 +-
 ...0-shortest-impossible-sequence-of-rolls.js | 32 +++++++++++++++++++
 2 files changed, 34 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2350-shortest-impossible-sequence-of-rolls.js

diff --git a/README.md b/README.md
index 13749350..daa32385 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,901 LeetCode solutions in JavaScript
+# 1,902 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1783,6 +1783,7 @@
 2347|[Best Poker Hand](./solutions/2347-best-poker-hand.js)|Easy|
 2348|[Number of Zero-Filled Subarrays](./solutions/2348-number-of-zero-filled-subarrays.js)|Medium|
 2349|[Design a Number Container System](./solutions/2349-design-a-number-container-system.js)|Medium|
+2350|[Shortest Impossible Sequence of Rolls](./solutions/2350-shortest-impossible-sequence-of-rolls.js)|Hard|
 2352|[Equal Row and Column Pairs](./solutions/2352-equal-row-and-column-pairs.js)|Medium|
 2364|[Count Number of Bad Pairs](./solutions/2364-count-number-of-bad-pairs.js)|Medium|
 2375|[Construct Smallest Number From DI String](./solutions/2375-construct-smallest-number-from-di-string.js)|Medium|
diff --git a/solutions/2350-shortest-impossible-sequence-of-rolls.js b/solutions/2350-shortest-impossible-sequence-of-rolls.js
new file mode 100644
index 00000000..ea27a604
--- /dev/null
+++ b/solutions/2350-shortest-impossible-sequence-of-rolls.js
@@ -0,0 +1,32 @@
+/**
+ * 2350. Shortest Impossible Sequence of Rolls
+ * https://leetcode.com/problems/shortest-impossible-sequence-of-rolls/
+ * Difficulty: Hard
+ *
+ * You are given an integer array rolls of length n and an integer k. You roll a k sided dice
+ * numbered from 1 to k, n times, where the result of the ith roll is rolls[i].
+ *
+ * Return the length of the shortest sequence of rolls so that there's no such subsequence in rolls.
+ *
+ * A sequence of rolls of length len is the result of rolling a k sided dice len times.
+ */
+
+/**
+ * @param {number[]} rolls
+ * @param {number} k
+ * @return {number}
+ */
+var shortestSequence = function(rolls, k) {
+  const set = new Set();
+  let sequences = 0;
+
+  for (const roll of rolls) {
+    set.add(roll);
+    if (set.size === k) {
+      sequences++;
+      set.clear();
+    }
+  }
+
+  return sequences + 1;
+};

From cf4a8d071da1fc14a12ce287db7debbdd362fa38 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 20 May 2025 22:36:33 -0500
Subject: [PATCH 194/571] Add solution #2351

---
 README.md                                     |  3 ++-
 .../2351-first-letter-to-appear-twice.js      | 26 +++++++++++++++++++
 2 files changed, 28 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2351-first-letter-to-appear-twice.js

diff --git a/README.md b/README.md
index daa32385..caa3439b 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,902 LeetCode solutions in JavaScript
+# 1,903 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1784,6 +1784,7 @@
 2348|[Number of Zero-Filled Subarrays](./solutions/2348-number-of-zero-filled-subarrays.js)|Medium|
 2349|[Design a Number Container System](./solutions/2349-design-a-number-container-system.js)|Medium|
 2350|[Shortest Impossible Sequence of Rolls](./solutions/2350-shortest-impossible-sequence-of-rolls.js)|Hard|
+2351|[First Letter to Appear Twice](./solutions/2351-first-letter-to-appear-twice.js)|Easy|
 2352|[Equal Row and Column Pairs](./solutions/2352-equal-row-and-column-pairs.js)|Medium|
 2364|[Count Number of Bad Pairs](./solutions/2364-count-number-of-bad-pairs.js)|Medium|
 2375|[Construct Smallest Number From DI String](./solutions/2375-construct-smallest-number-from-di-string.js)|Medium|
diff --git a/solutions/2351-first-letter-to-appear-twice.js b/solutions/2351-first-letter-to-appear-twice.js
new file mode 100644
index 00000000..b5fff8f5
--- /dev/null
+++ b/solutions/2351-first-letter-to-appear-twice.js
@@ -0,0 +1,26 @@
+/**
+ * 2351. First Letter to Appear Twice
+ * https://leetcode.com/problems/first-letter-to-appear-twice/
+ * Difficulty: Easy
+ *
+ * Given a string s consisting of lowercase English letters, return the first letter
+ * to appear twice.
+ *
+ * Note:
+ * - A letter a appears twice before another letter b if the second occurrence of a is before
+ *   the second occurrence of b.
+ * - s will contain at least one letter that appears twice.
+ */
+
+/**
+ * @param {string} s
+ * @return {character}
+ */
+var repeatedCharacter = function(s) {
+  const set = new Set();
+
+  for (const char of s) {
+    if (set.has(char)) return char;
+    set.add(char);
+  }
+};

From 763f1736e90c3bb9b4d9e18b63ea036722209059 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 20 May 2025 22:43:45 -0500
Subject: [PATCH 195/571] Add solution #2354

---
 README.md                                   |  3 +-
 solutions/2354-number-of-excellent-pairs.js | 46 +++++++++++++++++++++
 2 files changed, 48 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2354-number-of-excellent-pairs.js

diff --git a/README.md b/README.md
index caa3439b..8bfec8a3 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,903 LeetCode solutions in JavaScript
+# 1,904 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1786,6 +1786,7 @@
 2350|[Shortest Impossible Sequence of Rolls](./solutions/2350-shortest-impossible-sequence-of-rolls.js)|Hard|
 2351|[First Letter to Appear Twice](./solutions/2351-first-letter-to-appear-twice.js)|Easy|
 2352|[Equal Row and Column Pairs](./solutions/2352-equal-row-and-column-pairs.js)|Medium|
+2354|[Number of Excellent Pairs](./solutions/2354-number-of-excellent-pairs.js)|Hard|
 2364|[Count Number of Bad Pairs](./solutions/2364-count-number-of-bad-pairs.js)|Medium|
 2375|[Construct Smallest Number From DI String](./solutions/2375-construct-smallest-number-from-di-string.js)|Medium|
 2379|[Minimum Recolors to Get K Consecutive Black Blocks](./solutions/2379-minimum-recolors-to-get-k-consecutive-black-blocks.js)|Easy|
diff --git a/solutions/2354-number-of-excellent-pairs.js b/solutions/2354-number-of-excellent-pairs.js
new file mode 100644
index 00000000..bf60424a
--- /dev/null
+++ b/solutions/2354-number-of-excellent-pairs.js
@@ -0,0 +1,46 @@
+/**
+ * 2354. Number of Excellent Pairs
+ * https://leetcode.com/problems/number-of-excellent-pairs/
+ * Difficulty: Hard
+ *
+ * You are given a 0-indexed positive integer array nums and a positive integer k.
+ *
+ * A pair of numbers (num1, num2) is called excellent if the following conditions are satisfied:
+ * - Both the numbers num1 and num2 exist in the array nums.
+ * - The sum of the number of set bits in num1 OR num2 and num1 AND num2 is greater than or equal
+ *   to k, where OR is the bitwise OR operation and AND is the bitwise AND operation.
+ *
+ * Return the number of distinct excellent pairs.
+ *
+ * Two pairs (a, b) and (c, d) are considered distinct if either a != c or b != d. For example,
+ * (1, 2) and (2, 1) are distinct.
+ *
+ * Note that a pair (num1, num2) such that num1 == num2 can also be excellent if you have at least
+ * one occurrence of num1 in the array.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} k
+ * @return {number}
+ */
+var countExcellentPairs = function(nums, k) {
+  const map = new Map();
+  const set = new Set(nums);
+
+  for (const num of set) {
+    const bits = num.toString(2).split('0').join('').length;
+    map.set(bits, (map.get(bits) || 0) + 1);
+  }
+
+  let result = 0;
+  for (const [i, countI] of map) {
+    for (const [j, countJ] of map) {
+      if (i + j >= k) {
+        result += countI * countJ;
+      }
+    }
+  }
+
+  return result;
+};

From c74a23edc25eab3047f328edf9760388a9841c5d Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 20 May 2025 22:45:18 -0500
Subject: [PATCH 196/571] Add solution #2358

---
 README.md                                     |  3 +-
 ...number-of-groups-entering-a-competition.js | 31 +++++++++++++++++++
 2 files changed, 33 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2358-maximum-number-of-groups-entering-a-competition.js

diff --git a/README.md b/README.md
index 8bfec8a3..57a163df 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,904 LeetCode solutions in JavaScript
+# 1,905 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1787,6 +1787,7 @@
 2351|[First Letter to Appear Twice](./solutions/2351-first-letter-to-appear-twice.js)|Easy|
 2352|[Equal Row and Column Pairs](./solutions/2352-equal-row-and-column-pairs.js)|Medium|
 2354|[Number of Excellent Pairs](./solutions/2354-number-of-excellent-pairs.js)|Hard|
+2358|[Maximum Number of Groups Entering a Competition](./solutions/2358-maximum-number-of-groups-entering-a-competition.js)|Medium|
 2364|[Count Number of Bad Pairs](./solutions/2364-count-number-of-bad-pairs.js)|Medium|
 2375|[Construct Smallest Number From DI String](./solutions/2375-construct-smallest-number-from-di-string.js)|Medium|
 2379|[Minimum Recolors to Get K Consecutive Black Blocks](./solutions/2379-minimum-recolors-to-get-k-consecutive-black-blocks.js)|Easy|
diff --git a/solutions/2358-maximum-number-of-groups-entering-a-competition.js b/solutions/2358-maximum-number-of-groups-entering-a-competition.js
new file mode 100644
index 00000000..2637927b
--- /dev/null
+++ b/solutions/2358-maximum-number-of-groups-entering-a-competition.js
@@ -0,0 +1,31 @@
+/**
+ * 2358. Maximum Number of Groups Entering a Competition
+ * https://leetcode.com/problems/maximum-number-of-groups-entering-a-competition/
+ * Difficulty: Medium
+ *
+ * You are given a positive integer array grades which represents the grades of students in
+ * a university. You would like to enter all these students into a competition in ordered
+ * non-empty groups, such that the ordering meets the following conditions:
+ * - The sum of the grades of students in the ith group is less than the sum of the grades of
+ *   students in the (i + 1)th group, for all groups (except the last).
+ * - The total number of students in the ith group is less than the total number of students
+ *   in the (i + 1)th group, for all groups (except the last).
+ *
+ * Return the maximum number of groups that can be formed.
+ */
+
+/**
+ * @param {number[]} grades
+ * @return {number}
+ */
+var maximumGroups = function(grades) {
+  let result = 0;
+  let studentsUsed = 0;
+
+  while (studentsUsed + result + 1 <= grades.length) {
+    result++;
+    studentsUsed += result;
+  }
+
+  return result;
+};

From e7d2b1bc922119c7f066c49d1271e30e9d93fa95 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 20 May 2025 22:47:18 -0500
Subject: [PATCH 197/571] Add solution #2359

---
 README.md                                     |  3 +-
 ...59-find-closest-node-to-given-two-nodes.js | 63 +++++++++++++++++++
 2 files changed, 65 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2359-find-closest-node-to-given-two-nodes.js

diff --git a/README.md b/README.md
index 57a163df..f841a548 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,905 LeetCode solutions in JavaScript
+# 1,906 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1788,6 +1788,7 @@
 2352|[Equal Row and Column Pairs](./solutions/2352-equal-row-and-column-pairs.js)|Medium|
 2354|[Number of Excellent Pairs](./solutions/2354-number-of-excellent-pairs.js)|Hard|
 2358|[Maximum Number of Groups Entering a Competition](./solutions/2358-maximum-number-of-groups-entering-a-competition.js)|Medium|
+2359|[Find Closest Node to Given Two Nodes](./solutions/2359-find-closest-node-to-given-two-nodes.js)|Medium|
 2364|[Count Number of Bad Pairs](./solutions/2364-count-number-of-bad-pairs.js)|Medium|
 2375|[Construct Smallest Number From DI String](./solutions/2375-construct-smallest-number-from-di-string.js)|Medium|
 2379|[Minimum Recolors to Get K Consecutive Black Blocks](./solutions/2379-minimum-recolors-to-get-k-consecutive-black-blocks.js)|Easy|
diff --git a/solutions/2359-find-closest-node-to-given-two-nodes.js b/solutions/2359-find-closest-node-to-given-two-nodes.js
new file mode 100644
index 00000000..c048153f
--- /dev/null
+++ b/solutions/2359-find-closest-node-to-given-two-nodes.js
@@ -0,0 +1,63 @@
+/**
+ * 2359. Find Closest Node to Given Two Nodes
+ * https://leetcode.com/problems/find-closest-node-to-given-two-nodes/
+ * Difficulty: Medium
+ *
+ * You are given a directed graph of n nodes numbered from 0 to n - 1, where each node has at
+ * most one outgoing edge.
+ *
+ * The graph is represented with a given 0-indexed array edges of size n, indicating that there
+ * is a directed edge from node i to node edges[i]. If there is no outgoing edge from i, then
+ * edges[i] == -1.
+ *
+ * You are also given two integers node1 and node2.
+ *
+ * Return the index of the node that can be reached from both node1 and node2, such that the maximum
+ * between the distance from node1 to that node, and from node2 to that node is minimized. If there
+ * are multiple answers, return the node with the smallest index, and if no possible answer exists,
+ * return -1.
+ *
+ * Note that edges may contain cycles.
+ */
+
+/**
+ * @param {number[]} edges
+ * @param {number} node1
+ * @param {number} node2
+ * @return {number}
+ */
+var closestMeetingNode = function(edges, node1, node2) {
+  const n = edges.length;
+  const dist1 = new Array(n).fill(Infinity);
+  const dist2 = new Array(n).fill(Infinity);
+
+  computeDistances(node1, dist1);
+  computeDistances(node2, dist2);
+
+  let minDist = Infinity;
+  let result = -1;
+
+  for (let i = 0; i < n; i++) {
+    if (dist1[i] !== Infinity && dist2[i] !== Infinity) {
+      const maxDist = Math.max(dist1[i], dist2[i]);
+      if (maxDist < minDist) {
+        minDist = maxDist;
+        result = i;
+      }
+    }
+  }
+
+  return result;
+
+  function computeDistances(start, distances) {
+    let current = start;
+    let steps = 0;
+    const visited = new Set();
+
+    while (current !== -1 && !visited.has(current)) {
+      distances[current] = steps++;
+      visited.add(current);
+      current = edges[current];
+    }
+  }
+};

From c684d4728355d4a99e5ad5cb631979983eee69c0 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 20 May 2025 22:48:52 -0500
Subject: [PATCH 198/571] Add solution #2360

---
 README.md                                  |  3 +-
 solutions/2360-longest-cycle-in-a-graph.js | 53 ++++++++++++++++++++++
 2 files changed, 55 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2360-longest-cycle-in-a-graph.js

diff --git a/README.md b/README.md
index f841a548..03b67642 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,906 LeetCode solutions in JavaScript
+# 1,907 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1789,6 +1789,7 @@
 2354|[Number of Excellent Pairs](./solutions/2354-number-of-excellent-pairs.js)|Hard|
 2358|[Maximum Number of Groups Entering a Competition](./solutions/2358-maximum-number-of-groups-entering-a-competition.js)|Medium|
 2359|[Find Closest Node to Given Two Nodes](./solutions/2359-find-closest-node-to-given-two-nodes.js)|Medium|
+2360|[Longest Cycle in a Graph](./solutions/2360-longest-cycle-in-a-graph.js)|Hard|
 2364|[Count Number of Bad Pairs](./solutions/2364-count-number-of-bad-pairs.js)|Medium|
 2375|[Construct Smallest Number From DI String](./solutions/2375-construct-smallest-number-from-di-string.js)|Medium|
 2379|[Minimum Recolors to Get K Consecutive Black Blocks](./solutions/2379-minimum-recolors-to-get-k-consecutive-black-blocks.js)|Easy|
diff --git a/solutions/2360-longest-cycle-in-a-graph.js b/solutions/2360-longest-cycle-in-a-graph.js
new file mode 100644
index 00000000..6da96750
--- /dev/null
+++ b/solutions/2360-longest-cycle-in-a-graph.js
@@ -0,0 +1,53 @@
+/**
+ * 2360. Longest Cycle in a Graph
+ * https://leetcode.com/problems/longest-cycle-in-a-graph/
+ * Difficulty: Hard
+ *
+ * You are given a directed graph of n nodes numbered from 0 to n - 1, where each node has at
+ * most one outgoing edge.
+ *
+ * The graph is represented with a given 0-indexed array edges of size n, indicating that
+ * there is a directed edge from node i to node edges[i]. If there is no outgoing edge from
+ * node i, then edges[i] == -1.
+ *
+ * Return the length of the longest cycle in the graph. If no cycle exists, return -1.
+ *
+ * A cycle is a path that starts and ends at the same node.
+ */
+
+/**
+ * @param {number[]} edges
+ * @return {number}
+ */
+var longestCycle = function(edges) {
+  const n = edges.length;
+  const visited = new Array(n).fill(false);
+  let result = -1;
+
+  for (let i = 0; i < n; i++) {
+    if (!visited[i]) {
+      findCycle(i, 0, []);
+    }
+  }
+
+  return result;
+
+  function findCycle(node, steps, path) {
+    if (visited[node]) {
+      const cycleStart = path.indexOf(node);
+      if (cycleStart !== -1) {
+        result = Math.max(result, steps - cycleStart);
+      }
+      return;
+    }
+
+    visited[node] = true;
+    path.push(node);
+
+    if (edges[node] !== -1) {
+      findCycle(edges[node], steps + 1, path);
+    }
+
+    path.pop();
+  }
+};

From 171a21163d8e5d476520c89bf4e313a4a759b42f Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 20 May 2025 22:50:04 -0500
Subject: [PATCH 199/571] Add solution #2363

---
 README.md                             |  3 +-
 solutions/2363-merge-similar-items.js | 40 +++++++++++++++++++++++++++
 2 files changed, 42 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2363-merge-similar-items.js

diff --git a/README.md b/README.md
index 03b67642..0a7247f9 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,907 LeetCode solutions in JavaScript
+# 1,908 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1790,6 +1790,7 @@
 2358|[Maximum Number of Groups Entering a Competition](./solutions/2358-maximum-number-of-groups-entering-a-competition.js)|Medium|
 2359|[Find Closest Node to Given Two Nodes](./solutions/2359-find-closest-node-to-given-two-nodes.js)|Medium|
 2360|[Longest Cycle in a Graph](./solutions/2360-longest-cycle-in-a-graph.js)|Hard|
+2363|[Merge Similar Items](./solutions/2363-merge-similar-items.js)|Easy|
 2364|[Count Number of Bad Pairs](./solutions/2364-count-number-of-bad-pairs.js)|Medium|
 2375|[Construct Smallest Number From DI String](./solutions/2375-construct-smallest-number-from-di-string.js)|Medium|
 2379|[Minimum Recolors to Get K Consecutive Black Blocks](./solutions/2379-minimum-recolors-to-get-k-consecutive-black-blocks.js)|Easy|
diff --git a/solutions/2363-merge-similar-items.js b/solutions/2363-merge-similar-items.js
new file mode 100644
index 00000000..da16c478
--- /dev/null
+++ b/solutions/2363-merge-similar-items.js
@@ -0,0 +1,40 @@
+/**
+ * 2363. Merge Similar Items
+ * https://leetcode.com/problems/merge-similar-items/
+ * Difficulty: Easy
+ *
+ * You are given two 2D integer arrays, items1 and items2, representing two sets of items.
+ * Each array items has the following properties:
+ * - items[i] = [valuei, weighti] where valuei represents the value and weighti represents
+ *   the weight of the ith item.
+ * - The value of each item in items is unique.
+ *
+ * Return a 2D integer array ret where ret[i] = [valuei, weighti], with weighti being the sum of
+ * weights of all items with value valuei.
+ *
+ * Note: ret should be returned in ascending order by value.
+ */
+
+/**
+ * @param {number[][]} items1
+ * @param {number[][]} items2
+ * @return {number[][]}
+ */
+var mergeSimilarItems = function(items1, items2) {
+  const map = new Map();
+
+  for (const [value, weight] of items1) {
+    map.set(value, (map.get(value) || 0) + weight);
+  }
+
+  for (const [value, weight] of items2) {
+    map.set(value, (map.get(value) || 0) + weight);
+  }
+
+  const merged = [];
+  for (const [value, weight] of map) {
+    merged.push([value, weight]);
+  }
+
+  return merged.sort((a, b) => a[0] - b[0]);
+};

From 8dc5e13dce70f12780f2418939e4e733a9693601 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 20 May 2025 22:51:20 -0500
Subject: [PATCH 200/571] Add solution #2365

---
 README.md                           |  3 ++-
 solutions/2365-task-scheduler-ii.js | 41 +++++++++++++++++++++++++++++
 2 files changed, 43 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2365-task-scheduler-ii.js

diff --git a/README.md b/README.md
index 0a7247f9..7386af02 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,908 LeetCode solutions in JavaScript
+# 1,909 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1792,6 +1792,7 @@
 2360|[Longest Cycle in a Graph](./solutions/2360-longest-cycle-in-a-graph.js)|Hard|
 2363|[Merge Similar Items](./solutions/2363-merge-similar-items.js)|Easy|
 2364|[Count Number of Bad Pairs](./solutions/2364-count-number-of-bad-pairs.js)|Medium|
+2365|[Task Scheduler II](./solutions/2365-task-scheduler-ii.js)|Medium|
 2375|[Construct Smallest Number From DI String](./solutions/2375-construct-smallest-number-from-di-string.js)|Medium|
 2379|[Minimum Recolors to Get K Consecutive Black Blocks](./solutions/2379-minimum-recolors-to-get-k-consecutive-black-blocks.js)|Easy|
 2381|[Shifting Letters II](./solutions/2381-shifting-letters-ii.js)|Medium|
diff --git a/solutions/2365-task-scheduler-ii.js b/solutions/2365-task-scheduler-ii.js
new file mode 100644
index 00000000..166fdfdf
--- /dev/null
+++ b/solutions/2365-task-scheduler-ii.js
@@ -0,0 +1,41 @@
+/**
+ * 2365. Task Scheduler II
+ * https://leetcode.com/problems/task-scheduler-ii/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed array of positive integers tasks, representing tasks that need
+ * to be completed in order, where tasks[i] represents the type of the ith task.
+ *
+ * You are also given a positive integer space, which represents the minimum number of days
+ * that must pass after the completion of a task before another task of the same type can be
+ * performed.
+ *
+ * Each day, until all tasks have been completed, you must either:
+ * - Complete the next task from tasks, or
+ * - Take a break.
+ *
+ * Return the minimum number of days needed to complete all tasks.
+ */
+
+/**
+ * @param {number[]} tasks
+ * @param {number} space
+ * @return {number}
+ */
+var taskSchedulerII = function(tasks, space) {
+  const map = new Map();
+  let result = 0;
+
+  for (const task of tasks) {
+    result++;
+    if (map.has(task)) {
+      const lastDay = map.get(task);
+      if (result - lastDay <= space) {
+        result = lastDay + space + 1;
+      }
+    }
+    map.set(task, result);
+  }
+
+  return result;
+};

From a69d2e0dbc1faae259d5f6b1ee8816e9acfedfd5 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 20 May 2025 22:52:17 -0500
Subject: [PATCH 201/571] Add solution #2366

---
 README.md                                     |  3 +-
 ...-minimum-replacements-to-sort-the-array.js | 33 +++++++++++++++++++
 2 files changed, 35 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2366-minimum-replacements-to-sort-the-array.js

diff --git a/README.md b/README.md
index 7386af02..3a3bb6f3 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,909 LeetCode solutions in JavaScript
+# 1,910 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1793,6 +1793,7 @@
 2363|[Merge Similar Items](./solutions/2363-merge-similar-items.js)|Easy|
 2364|[Count Number of Bad Pairs](./solutions/2364-count-number-of-bad-pairs.js)|Medium|
 2365|[Task Scheduler II](./solutions/2365-task-scheduler-ii.js)|Medium|
+2366|[Minimum Replacements to Sort the Array](./solutions/2366-minimum-replacements-to-sort-the-array.js)|Hard|
 2375|[Construct Smallest Number From DI String](./solutions/2375-construct-smallest-number-from-di-string.js)|Medium|
 2379|[Minimum Recolors to Get K Consecutive Black Blocks](./solutions/2379-minimum-recolors-to-get-k-consecutive-black-blocks.js)|Easy|
 2381|[Shifting Letters II](./solutions/2381-shifting-letters-ii.js)|Medium|
diff --git a/solutions/2366-minimum-replacements-to-sort-the-array.js b/solutions/2366-minimum-replacements-to-sort-the-array.js
new file mode 100644
index 00000000..422d21f6
--- /dev/null
+++ b/solutions/2366-minimum-replacements-to-sort-the-array.js
@@ -0,0 +1,33 @@
+/**
+ * 2366. Minimum Replacements to Sort the Array
+ * https://leetcode.com/problems/minimum-replacements-to-sort-the-array/
+ * Difficulty: Hard
+ *
+ * You are given a 0-indexed integer array nums. In one operation you can replace any element
+ * of the array with any two elements that sum to it.
+ * - For example, consider nums = [5,6,7]. In one operation, we can replace nums[1] with 2 and 4
+ *   and convert nums to [5,2,4,7].
+ *
+ * Return the minimum number of operations to make an array that is sorted in non-decreasing order.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var minimumReplacement = function(nums) {
+  let result = 0;
+  let prev = nums[nums.length - 1];
+
+  for (let i = nums.length - 2; i >= 0; i--) {
+    if (nums[i] > prev) {
+      const splits = Math.ceil(nums[i] / prev);
+      result += splits - 1;
+      prev = Math.floor(nums[i] / splits);
+    } else {
+      prev = nums[i];
+    }
+  }
+
+  return result;
+};

From 30a3a718b6084261428e3897df8949f8c4329f64 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 20 May 2025 22:55:44 -0500
Subject: [PATCH 202/571] Add solution #2367

---
 README.md                                     |  3 +-
 .../2367-number-of-arithmetic-triplets.js     | 41 +++++++++++++++++++
 2 files changed, 43 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2367-number-of-arithmetic-triplets.js

diff --git a/README.md b/README.md
index 3a3bb6f3..e477c10b 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,910 LeetCode solutions in JavaScript
+# 1,911 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1794,6 +1794,7 @@
 2364|[Count Number of Bad Pairs](./solutions/2364-count-number-of-bad-pairs.js)|Medium|
 2365|[Task Scheduler II](./solutions/2365-task-scheduler-ii.js)|Medium|
 2366|[Minimum Replacements to Sort the Array](./solutions/2366-minimum-replacements-to-sort-the-array.js)|Hard|
+2367|[Number of Arithmetic Triplets](./solutions/2367-number-of-arithmetic-triplets.js)|Easy|
 2375|[Construct Smallest Number From DI String](./solutions/2375-construct-smallest-number-from-di-string.js)|Medium|
 2379|[Minimum Recolors to Get K Consecutive Black Blocks](./solutions/2379-minimum-recolors-to-get-k-consecutive-black-blocks.js)|Easy|
 2381|[Shifting Letters II](./solutions/2381-shifting-letters-ii.js)|Medium|
diff --git a/solutions/2367-number-of-arithmetic-triplets.js b/solutions/2367-number-of-arithmetic-triplets.js
new file mode 100644
index 00000000..21c02a86
--- /dev/null
+++ b/solutions/2367-number-of-arithmetic-triplets.js
@@ -0,0 +1,41 @@
+/**
+ * 2367. Number of Arithmetic Triplets
+ * https://leetcode.com/problems/number-of-arithmetic-triplets/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed, strictly increasing integer array nums and a positive integer diff.
+ * A triplet (i, j, k) is an arithmetic triplet if the following conditions are met:
+ * - i < j < k,
+ * - nums[j] - nums[i] == diff, and
+ * - nums[k] - nums[j] == diff.
+ *
+ * Return the number of unique arithmetic triplets.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} diff
+ * @return {number}
+ */
+var arithmeticTriplets = function(nums, diff) {
+  let result = 0;
+
+  for (let j = 1; j < nums.length - 1; j++) {
+    let i = j - 1;
+    let k = j + 1;
+
+    while (i >= 0 && nums[j] - nums[i] <= diff) {
+      if (nums[j] - nums[i] === diff) {
+        while (k < nums.length && nums[k] - nums[j] <= diff) {
+          if (nums[k] - nums[j] === diff) {
+            result++;
+          }
+          k++;
+        }
+      }
+      i--;
+    }
+  }
+
+  return result;
+};

From 1251590740d8a99658d7d1f9259d3dfb77e3ff18 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 20 May 2025 22:57:54 -0500
Subject: [PATCH 203/571] Add solution #2368

---
 README.md                                     |  3 +-
 .../2368-reachable-nodes-with-restrictions.js | 43 +++++++++++++++++++
 2 files changed, 45 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2368-reachable-nodes-with-restrictions.js

diff --git a/README.md b/README.md
index e477c10b..846df114 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,911 LeetCode solutions in JavaScript
+# 1,912 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1795,6 +1795,7 @@
 2365|[Task Scheduler II](./solutions/2365-task-scheduler-ii.js)|Medium|
 2366|[Minimum Replacements to Sort the Array](./solutions/2366-minimum-replacements-to-sort-the-array.js)|Hard|
 2367|[Number of Arithmetic Triplets](./solutions/2367-number-of-arithmetic-triplets.js)|Easy|
+2368|[Reachable Nodes With Restrictions](./solutions/2368-reachable-nodes-with-restrictions.js)|Medium|
 2375|[Construct Smallest Number From DI String](./solutions/2375-construct-smallest-number-from-di-string.js)|Medium|
 2379|[Minimum Recolors to Get K Consecutive Black Blocks](./solutions/2379-minimum-recolors-to-get-k-consecutive-black-blocks.js)|Easy|
 2381|[Shifting Letters II](./solutions/2381-shifting-letters-ii.js)|Medium|
diff --git a/solutions/2368-reachable-nodes-with-restrictions.js b/solutions/2368-reachable-nodes-with-restrictions.js
new file mode 100644
index 00000000..1ecd0821
--- /dev/null
+++ b/solutions/2368-reachable-nodes-with-restrictions.js
@@ -0,0 +1,43 @@
+/**
+ * 2368. Reachable Nodes With Restrictions
+ * https://leetcode.com/problems/reachable-nodes-with-restrictions/
+ * Difficulty: Medium
+ *
+ * There is an undirected tree with n nodes labeled from 0 to n - 1 and n - 1 edges.
+ *
+ * You are given a 2D integer array edges of length n - 1 where edges[i] = [ai, bi] indicates
+ * that there is an edge between nodes ai and bi in the tree. You are also given an integer
+ * array restricted which represents restricted nodes.
+ *
+ * Return the maximum number of nodes you can reach from node 0 without visiting a restricted node.
+ *
+ * Note that node 0 will not be a restricted node.
+ */
+
+/**
+ * @param {number} n
+ * @param {number[][]} edges
+ * @param {number[]} restricted
+ * @return {number}
+ */
+var reachableNodes = function(n, edges, restricted) {
+  const graph = Array(n).fill().map(() => []);
+  const restrictedSet = new Set(restricted);
+  const visited = new Set();
+
+  for (const [u, v] of edges) {
+    graph[u].push(v);
+    graph[v].push(u);
+  }
+
+  explore(0);
+  return visited.size;
+
+  function explore(node) {
+    if (visited.has(node) || restrictedSet.has(node)) return;
+    visited.add(node);
+    for (const neighbor of graph[node]) {
+      explore(neighbor);
+    }
+  }
+};

From 49b8e99f546310077efd62313ac012da23360a2c Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 20 May 2025 22:59:17 -0500
Subject: [PATCH 204/571] Add solution #2369

---
 README.md                                     |  3 +-
 ...here-is-a-valid-partition-for-the-array.js | 44 +++++++++++++++++++
 2 files changed, 46 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2369-check-if-there-is-a-valid-partition-for-the-array.js

diff --git a/README.md b/README.md
index 846df114..8de02670 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,912 LeetCode solutions in JavaScript
+# 1,913 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1796,6 +1796,7 @@
 2366|[Minimum Replacements to Sort the Array](./solutions/2366-minimum-replacements-to-sort-the-array.js)|Hard|
 2367|[Number of Arithmetic Triplets](./solutions/2367-number-of-arithmetic-triplets.js)|Easy|
 2368|[Reachable Nodes With Restrictions](./solutions/2368-reachable-nodes-with-restrictions.js)|Medium|
+2369|[Check if There is a Valid Partition For The Array](./solutions/2369-check-if-there-is-a-valid-partition-for-the-array.js)|Medium|
 2375|[Construct Smallest Number From DI String](./solutions/2375-construct-smallest-number-from-di-string.js)|Medium|
 2379|[Minimum Recolors to Get K Consecutive Black Blocks](./solutions/2379-minimum-recolors-to-get-k-consecutive-black-blocks.js)|Easy|
 2381|[Shifting Letters II](./solutions/2381-shifting-letters-ii.js)|Medium|
diff --git a/solutions/2369-check-if-there-is-a-valid-partition-for-the-array.js b/solutions/2369-check-if-there-is-a-valid-partition-for-the-array.js
new file mode 100644
index 00000000..be0e9844
--- /dev/null
+++ b/solutions/2369-check-if-there-is-a-valid-partition-for-the-array.js
@@ -0,0 +1,44 @@
+/**
+ * 2369. Check if There is a Valid Partition For The Array
+ * https://leetcode.com/problems/check-if-there-is-a-valid-partition-for-the-array/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed integer array nums. You have to partition the array into one or
+ * more contiguous subarrays.
+ *
+ * We call a partition of the array valid if each of the obtained subarrays satisfies one of
+ * the following conditions:
+ * 1. The subarray consists of exactly 2, equal elements. For example, the subarray [2,2] is good.
+ * 2. The subarray consists of exactly 3, equal elements. For example, the subarray [4,4,4] is good.
+ * 3. The subarray consists of exactly 3 consecutive increasing elements, that is, the difference
+ *    between adjacent elements is 1. For example, the subarray [3,4,5] is good, but the subarray
+ *    [1,3,5] is not.
+ *
+ * Return true if the array has at least one valid partition. Otherwise, return false.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {boolean}
+ */
+var validPartition = function(nums) {
+  const n = nums.length;
+  const dp = new Array(n + 1).fill(false);
+  dp[0] = true;
+
+  for (let i = 2; i <= n; i++) {
+    if (nums[i - 1] === nums[i - 2]) {
+      dp[i] = dp[i] || dp[i - 2];
+    }
+    if (i >= 3) {
+      if (nums[i - 1] === nums[i - 2] && nums[i - 2] === nums[i - 3]) {
+        dp[i] = dp[i] || dp[i - 3];
+      }
+      if (nums[i - 1] === nums[i - 2] + 1 && nums[i - 2] === nums[i - 3] + 1) {
+        dp[i] = dp[i] || dp[i - 3];
+      }
+    }
+  }
+
+  return dp[n];
+};

From 30326f2c4ba55a276d205fd64fcd2c2281a17422 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 20 May 2025 23:00:30 -0500
Subject: [PATCH 205/571] Add solution #2370

---
 README.md                                   |  3 +-
 solutions/2370-longest-ideal-subsequence.js | 43 +++++++++++++++++++++
 2 files changed, 45 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2370-longest-ideal-subsequence.js

diff --git a/README.md b/README.md
index 8de02670..33b186cc 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,913 LeetCode solutions in JavaScript
+# 1,914 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1797,6 +1797,7 @@
 2367|[Number of Arithmetic Triplets](./solutions/2367-number-of-arithmetic-triplets.js)|Easy|
 2368|[Reachable Nodes With Restrictions](./solutions/2368-reachable-nodes-with-restrictions.js)|Medium|
 2369|[Check if There is a Valid Partition For The Array](./solutions/2369-check-if-there-is-a-valid-partition-for-the-array.js)|Medium|
+2370|[Longest Ideal Subsequence](./solutions/2370-longest-ideal-subsequence.js)|Medium|
 2375|[Construct Smallest Number From DI String](./solutions/2375-construct-smallest-number-from-di-string.js)|Medium|
 2379|[Minimum Recolors to Get K Consecutive Black Blocks](./solutions/2379-minimum-recolors-to-get-k-consecutive-black-blocks.js)|Easy|
 2381|[Shifting Letters II](./solutions/2381-shifting-letters-ii.js)|Medium|
diff --git a/solutions/2370-longest-ideal-subsequence.js b/solutions/2370-longest-ideal-subsequence.js
new file mode 100644
index 00000000..c07e27f9
--- /dev/null
+++ b/solutions/2370-longest-ideal-subsequence.js
@@ -0,0 +1,43 @@
+/**
+ * 2370. Longest Ideal Subsequence
+ * https://leetcode.com/problems/longest-ideal-subsequence/
+ * Difficulty: Medium
+ *
+ * You are given a string s consisting of lowercase letters and an integer k. We call a string
+ * t ideal if the following conditions are satisfied:
+ * - t is a subsequence of the string s.
+ * - The absolute difference in the alphabet order of every two adjacent letters in t is less
+ *   than or equal to k.
+ *
+ * Return the length of the longest ideal string.
+ *
+ * A subsequence is a string that can be derived from another string by deleting some or no
+ * characters without changing the order of the remaining characters.
+ *
+ * Note that the alphabet order is not cyclic. For example, the absolute difference in the
+ * alphabet order of 'a' and 'z' is 25, not 1.
+ */
+
+/**
+ * @param {string} s
+ * @param {number} k
+ * @return {number}
+ */
+var longestIdealString = function(s, k) {
+  const dp = new Array(26).fill(0);
+  let result = 0;
+
+  for (const char of s) {
+    const idx = char.charCodeAt(0) - 97;
+    let currentMax = 0;
+
+    for (let i = Math.max(0, idx - k); i <= Math.min(25, idx + k); i++) {
+      currentMax = Math.max(currentMax, dp[i]);
+    }
+
+    dp[idx] = currentMax + 1;
+    result = Math.max(result, dp[idx]);
+  }
+
+  return result;
+};

From 61ab392d631ddc53e0a877a17427720ab6d38347 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 20 May 2025 23:01:36 -0500
Subject: [PATCH 206/571] Add solution #2373

---
 README.md                                     |  3 +-
 .../2373-largest-local-values-in-a-matrix.js  | 38 +++++++++++++++++++
 2 files changed, 40 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2373-largest-local-values-in-a-matrix.js

diff --git a/README.md b/README.md
index 33b186cc..227abdff 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,914 LeetCode solutions in JavaScript
+# 1,915 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1798,6 +1798,7 @@
 2368|[Reachable Nodes With Restrictions](./solutions/2368-reachable-nodes-with-restrictions.js)|Medium|
 2369|[Check if There is a Valid Partition For The Array](./solutions/2369-check-if-there-is-a-valid-partition-for-the-array.js)|Medium|
 2370|[Longest Ideal Subsequence](./solutions/2370-longest-ideal-subsequence.js)|Medium|
+2373|[Largest Local Values in a Matrix](./solutions/2373-largest-local-values-in-a-matrix.js)|Easy|
 2375|[Construct Smallest Number From DI String](./solutions/2375-construct-smallest-number-from-di-string.js)|Medium|
 2379|[Minimum Recolors to Get K Consecutive Black Blocks](./solutions/2379-minimum-recolors-to-get-k-consecutive-black-blocks.js)|Easy|
 2381|[Shifting Letters II](./solutions/2381-shifting-letters-ii.js)|Medium|
diff --git a/solutions/2373-largest-local-values-in-a-matrix.js b/solutions/2373-largest-local-values-in-a-matrix.js
new file mode 100644
index 00000000..46a65c45
--- /dev/null
+++ b/solutions/2373-largest-local-values-in-a-matrix.js
@@ -0,0 +1,38 @@
+/**
+ * 2373. Largest Local Values in a Matrix
+ * https://leetcode.com/problems/largest-local-values-in-a-matrix/
+ * Difficulty: Easy
+ *
+ * You are given an n x n integer matrix grid.
+ *
+ * Generate an integer matrix maxLocal of size (n - 2) x (n - 2) such that:
+ * - maxLocal[i][j] is equal to the largest value of the 3 x 3 matrix in grid centered around
+ *   row i + 1 and column j + 1.
+ *
+ * In other words, we want to find the largest value in every contiguous 3 x 3 matrix in grid.
+ *
+ * Return the generated matrix.
+ */
+
+/**
+ * @param {number[][]} grid
+ * @return {number[][]}
+ */
+var largestLocal = function(grid) {
+  const n = grid.length;
+  const result = new Array(n - 2).fill().map(() => new Array(n - 2).fill(0));
+
+  for (let i = 0; i < n - 2; i++) {
+    for (let j = 0; j < n - 2; j++) {
+      let maxVal = 0;
+      for (let r = i; r < i + 3; r++) {
+        for (let c = j; c < j + 3; c++) {
+          maxVal = Math.max(maxVal, grid[r][c]);
+        }
+      }
+      result[i][j] = maxVal;
+    }
+  }
+
+  return result;
+};

From 7db08cea0ff74e5f2b51fcc0835b3f4d03f228f5 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 21 May 2025 00:20:07 -0500
Subject: [PATCH 207/571] Add solution #2374

---
 README.md                                     |  3 +-
 .../2374-node-with-highest-edge-score.js      | 39 +++++++++++++++++++
 2 files changed, 41 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2374-node-with-highest-edge-score.js

diff --git a/README.md b/README.md
index 227abdff..950146c4 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,915 LeetCode solutions in JavaScript
+# 1,916 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1799,6 +1799,7 @@
 2369|[Check if There is a Valid Partition For The Array](./solutions/2369-check-if-there-is-a-valid-partition-for-the-array.js)|Medium|
 2370|[Longest Ideal Subsequence](./solutions/2370-longest-ideal-subsequence.js)|Medium|
 2373|[Largest Local Values in a Matrix](./solutions/2373-largest-local-values-in-a-matrix.js)|Easy|
+2374|[Node With Highest Edge Score](./solutions/2374-node-with-highest-edge-score.js)|Medium|
 2375|[Construct Smallest Number From DI String](./solutions/2375-construct-smallest-number-from-di-string.js)|Medium|
 2379|[Minimum Recolors to Get K Consecutive Black Blocks](./solutions/2379-minimum-recolors-to-get-k-consecutive-black-blocks.js)|Easy|
 2381|[Shifting Letters II](./solutions/2381-shifting-letters-ii.js)|Medium|
diff --git a/solutions/2374-node-with-highest-edge-score.js b/solutions/2374-node-with-highest-edge-score.js
new file mode 100644
index 00000000..b8597422
--- /dev/null
+++ b/solutions/2374-node-with-highest-edge-score.js
@@ -0,0 +1,39 @@
+/**
+ * 2374. Node With Highest Edge Score
+ * https://leetcode.com/problems/node-with-highest-edge-score/
+ * Difficulty: Medium
+ *
+ * You are given a directed graph with n nodes labeled from 0 to n - 1, where each node has
+ * exactly one outgoing edge.
+ *
+ * The graph is represented by a given 0-indexed integer array edges of length n, where edges[i]
+ * indicates that there is a directed edge from node i to node edges[i].
+ *
+ * The edge score of a node i is defined as the sum of the labels of all the nodes that have an
+ * edge pointing to i.
+ *
+ * Return the node with the highest edge score. If multiple nodes have the same edge score, return
+ * the node with the smallest index.
+ */
+
+/**
+ * @param {number[]} edges
+ * @return {number}
+ */
+var edgeScore = function(edges) {
+  const scores = new Array(edges.length).fill(0);
+
+  for (let i = 0; i < edges.length; i++) {
+    scores[edges[i]] += i;
+  }
+  let maxScore = 0;
+  let result = 0;
+  for (let i = 0; i < scores.length; i++) {
+    if (scores[i] > maxScore) {
+      maxScore = scores[i];
+      result = i;
+    }
+  }
+
+  return result;
+};

From 75bb422a0aded22bfa9017164c2f04a69bca968e Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 21 May 2025 00:21:18 -0500
Subject: [PATCH 208/571] Add solution #2380

---
 README.md                                     |  3 +-
 ...ime-needed-to-rearrange-a-binary-string.js | 32 +++++++++++++++++++
 2 files changed, 34 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2380-time-needed-to-rearrange-a-binary-string.js

diff --git a/README.md b/README.md
index 950146c4..6027a60c 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,916 LeetCode solutions in JavaScript
+# 1,917 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1802,6 +1802,7 @@
 2374|[Node With Highest Edge Score](./solutions/2374-node-with-highest-edge-score.js)|Medium|
 2375|[Construct Smallest Number From DI String](./solutions/2375-construct-smallest-number-from-di-string.js)|Medium|
 2379|[Minimum Recolors to Get K Consecutive Black Blocks](./solutions/2379-minimum-recolors-to-get-k-consecutive-black-blocks.js)|Easy|
+2380|[Time Needed to Rearrange a Binary String](./solutions/2380-time-needed-to-rearrange-a-binary-string.js)|Medium|
 2381|[Shifting Letters II](./solutions/2381-shifting-letters-ii.js)|Medium|
 2390|[Removing Stars From a String](./solutions/2390-removing-stars-from-a-string.js)|Medium|
 2396|[Strictly Palindromic Number](./solutions/2396-strictly-palindromic-number.js)|Medium|
diff --git a/solutions/2380-time-needed-to-rearrange-a-binary-string.js b/solutions/2380-time-needed-to-rearrange-a-binary-string.js
new file mode 100644
index 00000000..d85d2234
--- /dev/null
+++ b/solutions/2380-time-needed-to-rearrange-a-binary-string.js
@@ -0,0 +1,32 @@
+/**
+ * 2380. Time Needed to Rearrange a Binary String
+ * https://leetcode.com/problems/time-needed-to-rearrange-a-binary-string/
+ * Difficulty: Medium
+ *
+ * You are given a binary string s. In one second, all occurrences of "01" are simultaneously
+ * replaced with "10". This process repeats until no occurrences of "01" exist.
+ *
+ * Return the number of seconds needed to complete this process.
+ */
+
+/**
+ * @param {string} s
+ * @return {number}
+ */
+var secondsToRemoveOccurrences = function(s) {
+  const binary = s.split('');
+  let result = 0;
+
+  while (binary.join('').includes('01')) {
+    for (let i = 0; i < binary.length - 1; i++) {
+      if (binary[i] === '0' && binary[i + 1] === '1') {
+        binary[i] = '1';
+        binary[i + 1] = '0';
+        i++;
+      }
+    }
+    result++;
+  }
+
+  return result;
+};

From c2d44e6c8f2e5a026afb311fddb42bde653c6da0 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 21 May 2025 00:25:01 -0500
Subject: [PATCH 209/571] Add solution #2382

---
 README.md                                     |  3 +-
 ...2382-maximum-segment-sum-after-removals.js | 84 +++++++++++++++++++
 2 files changed, 86 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2382-maximum-segment-sum-after-removals.js

diff --git a/README.md b/README.md
index 6027a60c..67895454 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,917 LeetCode solutions in JavaScript
+# 1,918 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1804,6 +1804,7 @@
 2379|[Minimum Recolors to Get K Consecutive Black Blocks](./solutions/2379-minimum-recolors-to-get-k-consecutive-black-blocks.js)|Easy|
 2380|[Time Needed to Rearrange a Binary String](./solutions/2380-time-needed-to-rearrange-a-binary-string.js)|Medium|
 2381|[Shifting Letters II](./solutions/2381-shifting-letters-ii.js)|Medium|
+2382|[Maximum Segment Sum After Removals](./solutions/2382-maximum-segment-sum-after-removals.js)|Hard|
 2390|[Removing Stars From a String](./solutions/2390-removing-stars-from-a-string.js)|Medium|
 2396|[Strictly Palindromic Number](./solutions/2396-strictly-palindromic-number.js)|Medium|
 2401|[Longest Nice Subarray](./solutions/2401-longest-nice-subarray.js)|Medium|
diff --git a/solutions/2382-maximum-segment-sum-after-removals.js b/solutions/2382-maximum-segment-sum-after-removals.js
new file mode 100644
index 00000000..78065c5e
--- /dev/null
+++ b/solutions/2382-maximum-segment-sum-after-removals.js
@@ -0,0 +1,84 @@
+/**
+ * 2382. Maximum Segment Sum After Removals
+ * https://leetcode.com/problems/maximum-segment-sum-after-removals/
+ * Difficulty: Hard
+ *
+ * You are given two 0-indexed integer arrays nums and removeQueries, both of length n. For
+ * the ith query, the element in nums at the index removeQueries[i] is removed, splitting
+ * nums into different segments.
+ *
+ * A segment is a contiguous sequence of positive integers in nums. A segment sum is the sum
+ * of every element in a segment.
+ *
+ * Return an integer array answer, of length n, where answer[i] is the maximum segment sum after
+ * applying the ith removal.
+ *
+ * Note: The same index will not be removed more than once.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number[]} removeQueries
+ * @return {number[]}
+ */
+var maximumSegmentSum = function(nums, removeQueries) {
+  const n = nums.length;
+  const result = new Array(n);
+  const prefixSum = new Array(n + 1).fill(0);
+  const parents = new Array(n).fill(-1);
+  const sizes = new Array(n).fill(0);
+  const sums = new Array(n).fill(0);
+  let maxSum = 0;
+
+  for (let i = 0; i < n; i++) {
+    prefixSum[i + 1] = prefixSum[i] + nums[i];
+  }
+
+  for (let i = n - 1; i >= 0; i--) {
+    result[i] = maxSum;
+    const index = removeQueries[i];
+
+    parents[index] = index;
+    sizes[index] = 1;
+    sums[index] = nums[index];
+
+    if (index > 0 && parents[index - 1] !== -1) {
+      const leftRoot = findRoot(parents, index - 1);
+      const segmentSum = sums[leftRoot] + sums[index];
+
+      parents[index] = leftRoot;
+      sizes[leftRoot] += sizes[index];
+      sums[leftRoot] = segmentSum;
+    }
+
+    if (index < n - 1 && parents[index + 1] !== -1) {
+      const root = findRoot(parents, index);
+      const rightRoot = findRoot(parents, index + 1);
+
+      if (root !== rightRoot) {
+        const segmentSum = sums[root] + sums[rightRoot];
+
+        if (sizes[root] < sizes[rightRoot]) {
+          parents[root] = rightRoot;
+          sizes[rightRoot] += sizes[root];
+          sums[rightRoot] = segmentSum;
+        } else {
+          parents[rightRoot] = root;
+          sizes[root] += sizes[rightRoot];
+          sums[root] = segmentSum;
+        }
+      }
+    }
+
+    maxSum = Math.max(maxSum, sums[findRoot(parents, index)]);
+  }
+
+  return result;
+};
+
+function findRoot(parents, x) {
+  if (parents[x] !== x) {
+    parents[x] = findRoot(parents, parents[x]);
+  }
+  return parents[x];
+}

From 46585b513e7a5b1ee81d64ce47242223797ff38b Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 21 May 2025 00:26:23 -0500
Subject: [PATCH 210/571] Add solution #2383

---
 README.md                                     |  3 +-
 ...-hours-of-training-to-win-a-competition.js | 55 +++++++++++++++++++
 2 files changed, 57 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2383-minimum-hours-of-training-to-win-a-competition.js

diff --git a/README.md b/README.md
index 67895454..ad60c194 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,918 LeetCode solutions in JavaScript
+# 1,919 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1805,6 +1805,7 @@
 2380|[Time Needed to Rearrange a Binary String](./solutions/2380-time-needed-to-rearrange-a-binary-string.js)|Medium|
 2381|[Shifting Letters II](./solutions/2381-shifting-letters-ii.js)|Medium|
 2382|[Maximum Segment Sum After Removals](./solutions/2382-maximum-segment-sum-after-removals.js)|Hard|
+2383|[Minimum Hours of Training to Win a Competition](./solutions/2383-minimum-hours-of-training-to-win-a-competition.js)|Easy|
 2390|[Removing Stars From a String](./solutions/2390-removing-stars-from-a-string.js)|Medium|
 2396|[Strictly Palindromic Number](./solutions/2396-strictly-palindromic-number.js)|Medium|
 2401|[Longest Nice Subarray](./solutions/2401-longest-nice-subarray.js)|Medium|
diff --git a/solutions/2383-minimum-hours-of-training-to-win-a-competition.js b/solutions/2383-minimum-hours-of-training-to-win-a-competition.js
new file mode 100644
index 00000000..0699fdcc
--- /dev/null
+++ b/solutions/2383-minimum-hours-of-training-to-win-a-competition.js
@@ -0,0 +1,55 @@
+/**
+ * 2383. Minimum Hours of Training to Win a Competition
+ * https://leetcode.com/problems/minimum-hours-of-training-to-win-a-competition/
+ * Difficulty: Easy
+ *
+ * You are entering a competition, and are given two positive integers initialEnergy and
+ * initialExperience denoting your initial energy and initial experience respectively.
+ *
+ * You are also given two 0-indexed integer arrays energy and experience, both of length n.
+ *
+ * You will face n opponents in order. The energy and experience of the ith opponent is
+ * denoted by energy[i] and experience[i] respectively. When you face an opponent, you need
+ * to have both strictly greater experience and energy to defeat them and move to the next
+ * opponent if available.
+ *
+ * Defeating the ith opponent increases your experience by experience[i], but decreases your
+ * energy by energy[i].
+ *
+ * Before starting the competition, you can train for some number of hours. After each hour
+ * of training, you can either choose to increase your initial experience by one, or increase
+ * your initial energy by one.
+ *
+ * Return the minimum number of training hours required to defeat all n opponents.
+ */
+
+/**
+ * @param {number} initialEnergy
+ * @param {number} initialExperience
+ * @param {number[]} energy
+ * @param {number[]} experience
+ * @return {number}
+ */
+var minNumberOfHours = function(initialEnergy, initialExperience, energy, experience) {
+  let energyNeeded = 0;
+  let experienceNeeded = 0;
+  let currentEnergy = initialEnergy;
+  let currentExperience = initialExperience;
+
+  for (let i = 0; i < energy.length; i++) {
+    if (currentEnergy <= energy[i]) {
+      const deficit = energy[i] - currentEnergy + 1;
+      energyNeeded += deficit;
+      currentEnergy += deficit;
+    }
+    if (currentExperience <= experience[i]) {
+      const deficit = experience[i] - currentExperience + 1;
+      experienceNeeded += deficit;
+      currentExperience += deficit;
+    }
+    currentEnergy -= energy[i];
+    currentExperience += experience[i];
+  }
+
+  return energyNeeded + experienceNeeded;
+};

From e0dd87855ffa251d536439a84c9ddb688f15306e Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 21 May 2025 00:28:30 -0500
Subject: [PATCH 211/571] Add solution #2385

---
 README.md                                     |  3 +-
 ...-of-time-for-binary-tree-to-be-infected.js | 70 +++++++++++++++++++
 2 files changed, 72 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2385-amount-of-time-for-binary-tree-to-be-infected.js

diff --git a/README.md b/README.md
index ad60c194..3654f15f 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,919 LeetCode solutions in JavaScript
+# 1,920 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1806,6 +1806,7 @@
 2381|[Shifting Letters II](./solutions/2381-shifting-letters-ii.js)|Medium|
 2382|[Maximum Segment Sum After Removals](./solutions/2382-maximum-segment-sum-after-removals.js)|Hard|
 2383|[Minimum Hours of Training to Win a Competition](./solutions/2383-minimum-hours-of-training-to-win-a-competition.js)|Easy|
+2385|[Amount of Time for Binary Tree to Be Infected](./solutions/2385-amount-of-time-for-binary-tree-to-be-infected.js)|Medium|
 2390|[Removing Stars From a String](./solutions/2390-removing-stars-from-a-string.js)|Medium|
 2396|[Strictly Palindromic Number](./solutions/2396-strictly-palindromic-number.js)|Medium|
 2401|[Longest Nice Subarray](./solutions/2401-longest-nice-subarray.js)|Medium|
diff --git a/solutions/2385-amount-of-time-for-binary-tree-to-be-infected.js b/solutions/2385-amount-of-time-for-binary-tree-to-be-infected.js
new file mode 100644
index 00000000..00bd2ddd
--- /dev/null
+++ b/solutions/2385-amount-of-time-for-binary-tree-to-be-infected.js
@@ -0,0 +1,70 @@
+/**
+ * 2385. Amount of Time for Binary Tree to Be Infected
+ * https://leetcode.com/problems/amount-of-time-for-binary-tree-to-be-infected/
+ * Difficulty: Medium
+ *
+ * You are given the root of a binary tree with unique values, and an integer start.
+ * At minute 0, an infection starts from the node with value start.
+ *
+ * Each minute, a node becomes infected if:
+ * - The node is currently uninfected.
+ * - The node is adjacent to an infected node.
+ *
+ * Return the number of minutes needed for the entire tree to be infected.
+ */
+
+/**
+ * Definition for a binary tree node.
+ * function TreeNode(val, left, right) {
+ *     this.val = (val===undefined ? 0 : val)
+ *     this.left = (left===undefined ? null : left)
+ *     this.right = (right===undefined ? null : right)
+ * }
+ */
+/**
+ * @param {TreeNode} root
+ * @param {number} start
+ * @return {number}
+ */
+var amountOfTime = function(root, start) {
+  const graph = new Map();
+  const queue = [start];
+  const visited = new Set([start]);
+  let result = -1;
+
+  buildGraph(root, null);
+
+  while (queue.length) {
+    result++;
+    const levelSize = queue.length;
+    for (let i = 0; i < levelSize; i++) {
+      const current = queue.shift();
+      for (const neighbor of graph.get(current) || []) {
+        if (!visited.has(neighbor)) {
+          visited.add(neighbor);
+          queue.push(neighbor);
+        }
+      }
+    }
+  }
+
+  return result;
+
+  function buildGraph(node, parent) {
+    if (!node) return;
+    if (!graph.has(node.val)) graph.set(node.val, []);
+    if (parent) graph.get(node.val).push(parent.val);
+    if (node.left) {
+      graph.get(node.val).push(node.left.val);
+      graph.set(node.left.val, graph.get(node.left.val) || []);
+      graph.get(node.left.val).push(node.val);
+    }
+    if (node.right) {
+      graph.get(node.val).push(node.right.val);
+      graph.set(node.right.val, graph.get(node.right.val) || []);
+      graph.get(node.right.val).push(node.val);
+    }
+    buildGraph(node.left, node);
+    buildGraph(node.right, node);
+  }
+};

From d3f050a9a7d3f73a036a91a7c1eee0bd4b9573f7 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 00:37:04 -0500
Subject: [PATCH 212/571] Add solution #2389

---
 README.md                                     |  3 +-
 ...89-longest-subsequence-with-limited-sum.js | 43 +++++++++++++++++++
 2 files changed, 45 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2389-longest-subsequence-with-limited-sum.js

diff --git a/README.md b/README.md
index 3654f15f..8b6e8cf2 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,920 LeetCode solutions in JavaScript
+# 1,921 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1807,6 +1807,7 @@
 2382|[Maximum Segment Sum After Removals](./solutions/2382-maximum-segment-sum-after-removals.js)|Hard|
 2383|[Minimum Hours of Training to Win a Competition](./solutions/2383-minimum-hours-of-training-to-win-a-competition.js)|Easy|
 2385|[Amount of Time for Binary Tree to Be Infected](./solutions/2385-amount-of-time-for-binary-tree-to-be-infected.js)|Medium|
+2389|[Longest Subsequence With Limited Sum](./solutions/2389-longest-subsequence-with-limited-sum.js)|Easy|
 2390|[Removing Stars From a String](./solutions/2390-removing-stars-from-a-string.js)|Medium|
 2396|[Strictly Palindromic Number](./solutions/2396-strictly-palindromic-number.js)|Medium|
 2401|[Longest Nice Subarray](./solutions/2401-longest-nice-subarray.js)|Medium|
diff --git a/solutions/2389-longest-subsequence-with-limited-sum.js b/solutions/2389-longest-subsequence-with-limited-sum.js
new file mode 100644
index 00000000..a498b7c8
--- /dev/null
+++ b/solutions/2389-longest-subsequence-with-limited-sum.js
@@ -0,0 +1,43 @@
+/**
+ * 2389. Longest Subsequence With Limited Sum
+ * https://leetcode.com/problems/longest-subsequence-with-limited-sum/
+ * Difficulty: Easy
+ *
+ * You are given an integer array nums of length n, and an integer array queries of length m.
+ *
+ * Return an array answer of length m where answer[i] is the maximum size of a subsequence that
+ * you can take from nums such that the sum of its elements is less than or equal to queries[i].
+ *
+ * A subsequence is an array that can be derived from another array by deleting some or no elements
+ * without changing the order of the remaining elements.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number[]} queries
+ * @return {number[]}
+ */
+var answerQueries = function(nums, queries) {
+  nums.sort((a, b) => a - b);
+  const prefixSums = [0];
+  for (const num of nums) {
+    prefixSums.push(prefixSums.at(-1) + num);
+  }
+
+  const result = new Array(queries.length);
+  for (let i = 0; i < queries.length; i++) {
+    let left = 0;
+    let right = nums.length;
+    while (left < right) {
+      const mid = Math.floor((left + right + 1) / 2);
+      if (prefixSums[mid] <= queries[i]) {
+        left = mid;
+      } else {
+        right = mid - 1;
+      }
+    }
+    result[i] = left;
+  }
+
+  return result;
+};

From 30f7bee1afd6a898b1afb4767c28eab0749fa7a0 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 00:39:15 -0500
Subject: [PATCH 213/571] Add solution #2391

---
 README.md                                     |  3 +-
 ...nimum-amount-of-time-to-collect-garbage.js | 50 +++++++++++++++++++
 2 files changed, 52 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2391-minimum-amount-of-time-to-collect-garbage.js

diff --git a/README.md b/README.md
index 8b6e8cf2..66bef67e 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,921 LeetCode solutions in JavaScript
+# 1,922 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1809,6 +1809,7 @@
 2385|[Amount of Time for Binary Tree to Be Infected](./solutions/2385-amount-of-time-for-binary-tree-to-be-infected.js)|Medium|
 2389|[Longest Subsequence With Limited Sum](./solutions/2389-longest-subsequence-with-limited-sum.js)|Easy|
 2390|[Removing Stars From a String](./solutions/2390-removing-stars-from-a-string.js)|Medium|
+2391|[Minimum Amount of Time to Collect Garbage](./solutions/2391-minimum-amount-of-time-to-collect-garbage.js)|Medium|
 2396|[Strictly Palindromic Number](./solutions/2396-strictly-palindromic-number.js)|Medium|
 2401|[Longest Nice Subarray](./solutions/2401-longest-nice-subarray.js)|Medium|
 2413|[Smallest Even Multiple](./solutions/2413-smallest-even-multiple.js)|Easy|
diff --git a/solutions/2391-minimum-amount-of-time-to-collect-garbage.js b/solutions/2391-minimum-amount-of-time-to-collect-garbage.js
new file mode 100644
index 00000000..bbddfc01
--- /dev/null
+++ b/solutions/2391-minimum-amount-of-time-to-collect-garbage.js
@@ -0,0 +1,50 @@
+/**
+ * 2391. Minimum Amount of Time to Collect Garbage
+ * https://leetcode.com/problems/minimum-amount-of-time-to-collect-garbage/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed array of strings garbage where garbage[i] represents the assortment
+ * of garbage at the ith house. garbage[i] consists only of the characters 'M', 'P' and 'G'
+ * representing one unit of metal, paper and glass garbage respectively. Picking up one unit of
+ * any type of garbage takes 1 minute.
+ *
+ * You are also given a 0-indexed integer array travel where travel[i] is the number of minutes
+ * needed to go from house i to house i + 1.
+ *
+ * There are three garbage trucks in the city, each responsible for picking up one type of garbage.
+ * Each garbage truck starts at house 0 and must visit each house in order; however, they do not
+ * need to visit every house.
+ *
+ * Only one garbage truck may be used at any given moment. While one truck is driving or picking up
+ * garbage, the other two trucks cannot do anything.
+ *
+ * Return the minimum number of minutes needed to pick up all the garbage.
+ */
+
+/**
+ * @param {string[]} garbage
+ * @param {number[]} travel
+ * @return {number}
+ */
+var garbageCollection = function(garbage, travel) {
+  let result = 0;
+  const lastHouse = {'M': 0, 'P': 0, 'G': 0};
+
+  for (let i = 0; i < garbage.length; i++) {
+    result += garbage[i].length;
+    for (const type of garbage[i]) {
+      lastHouse[type] = i;
+    }
+  }
+
+  const prefixTravel = [0];
+  for (const time of travel) {
+    prefixTravel.push(prefixTravel.at(-1) + time);
+  }
+
+  Object.keys(lastHouse).forEach(type => {
+    result += prefixTravel[lastHouse[type]];
+  });
+
+  return result;
+};

From 92d1ae40437e560c7a616199b431e7db036f361e Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 00:47:20 -0500
Subject: [PATCH 214/571] Add solution #2392

---
 README.md                                     |  3 +-
 .../2392-build-a-matrix-with-conditions.js    | 76 +++++++++++++++++++
 2 files changed, 78 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2392-build-a-matrix-with-conditions.js

diff --git a/README.md b/README.md
index 66bef67e..4baa4776 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,922 LeetCode solutions in JavaScript
+# 1,923 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1810,6 +1810,7 @@
 2389|[Longest Subsequence With Limited Sum](./solutions/2389-longest-subsequence-with-limited-sum.js)|Easy|
 2390|[Removing Stars From a String](./solutions/2390-removing-stars-from-a-string.js)|Medium|
 2391|[Minimum Amount of Time to Collect Garbage](./solutions/2391-minimum-amount-of-time-to-collect-garbage.js)|Medium|
+2392|[Build a Matrix With Conditions](./solutions/2392-build-a-matrix-with-conditions.js)|Hard|
 2396|[Strictly Palindromic Number](./solutions/2396-strictly-palindromic-number.js)|Medium|
 2401|[Longest Nice Subarray](./solutions/2401-longest-nice-subarray.js)|Medium|
 2413|[Smallest Even Multiple](./solutions/2413-smallest-even-multiple.js)|Easy|
diff --git a/solutions/2392-build-a-matrix-with-conditions.js b/solutions/2392-build-a-matrix-with-conditions.js
new file mode 100644
index 00000000..b55cdd0f
--- /dev/null
+++ b/solutions/2392-build-a-matrix-with-conditions.js
@@ -0,0 +1,76 @@
+/**
+ * 2392. Build a Matrix With Conditions
+ * https://leetcode.com/problems/build-a-matrix-with-conditions/
+ * Difficulty: Hard
+ *
+ * You are given a positive integer k. You are also given:
+ * - a 2D integer array rowConditions of size n where rowConditions[i] = [abovei, belowi], and
+ * - a 2D integer array colConditions of size m where colConditions[i] = [lefti, righti].
+ *
+ * The two arrays contain integers from 1 to k.
+ *
+ * You have to build a k x k matrix that contains each of the numbers from 1 to k exactly once.
+ * The remaining cells should have the value 0.
+ *
+ * The matrix should also satisfy the following conditions:
+ * - The number abovei should appear in a row that is strictly above the row at which the number
+ *   belowi appears for all i from 0 to n - 1.
+ * - The number lefti should appear in a column that is strictly left of the column at which the
+ *   number righti appears for all i from 0 to m - 1.
+ *
+ * Return any matrix that satisfies the conditions. If no answer exists, return an empty matrix.
+ */
+
+/**
+ * @param {number} k
+ * @param {number[][]} rowConditions
+ * @param {number[][]} colConditions
+ * @return {number[][]}
+ */
+var buildMatrix = function(k, rowConditions, colConditions) {
+  const rowOrder = helper(rowConditions, k);
+  if (!rowOrder.length) return [];
+
+  const colOrder = helper(colConditions, k);
+  if (!colOrder.length) return [];
+
+  const matrix = Array.from({ length: k }, () => new Array(k).fill(0));
+  const rowIndex = new Array(k + 1).fill(0);
+  const colIndex = new Array(k + 1).fill(0);
+
+  for (let i = 0; i < k; i++) {
+    rowIndex[rowOrder[i]] = i;
+    colIndex[colOrder[i]] = i;
+  }
+
+  for (let num = 1; num <= k; num++) {
+    matrix[rowIndex[num]][colIndex[num]] = num;
+  }
+
+  return matrix;
+
+  function helper(edges, size) {
+    const graph = Array.from({ length: size + 1 }, () => []);
+    const inDegree = new Array(size + 1).fill(0);
+    for (const [u, v] of edges) {
+      graph[u].push(v);
+      inDegree[v]++;
+    }
+
+    const queue = [];
+    for (let i = 1; i <= size; i++) {
+      if (inDegree[i] === 0) queue.push(i);
+    }
+
+    const order = [];
+    while (queue.length) {
+      const node = queue.shift();
+      order.push(node);
+      for (const next of graph[node]) {
+        if (--inDegree[next] === 0) queue.push(next);
+      }
+    }
+
+    return order.length === size ? order : [];
+  }
+};

From c77c198fbbc67850a81853eabf03e8cf52fd14a1 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 00:48:39 -0500
Subject: [PATCH 215/571] Add solution #2395

---
 README.md                                     |  3 +-
 .../2395-find-subarrays-with-equal-sum.js     | 28 +++++++++++++++++++
 2 files changed, 30 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2395-find-subarrays-with-equal-sum.js

diff --git a/README.md b/README.md
index 4baa4776..98e8beb3 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,923 LeetCode solutions in JavaScript
+# 1,924 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1811,6 +1811,7 @@
 2390|[Removing Stars From a String](./solutions/2390-removing-stars-from-a-string.js)|Medium|
 2391|[Minimum Amount of Time to Collect Garbage](./solutions/2391-minimum-amount-of-time-to-collect-garbage.js)|Medium|
 2392|[Build a Matrix With Conditions](./solutions/2392-build-a-matrix-with-conditions.js)|Hard|
+2395|[Find Subarrays With Equal Sum](./solutions/2395-find-subarrays-with-equal-sum.js)|Easy|
 2396|[Strictly Palindromic Number](./solutions/2396-strictly-palindromic-number.js)|Medium|
 2401|[Longest Nice Subarray](./solutions/2401-longest-nice-subarray.js)|Medium|
 2413|[Smallest Even Multiple](./solutions/2413-smallest-even-multiple.js)|Easy|
diff --git a/solutions/2395-find-subarrays-with-equal-sum.js b/solutions/2395-find-subarrays-with-equal-sum.js
new file mode 100644
index 00000000..9b4ec520
--- /dev/null
+++ b/solutions/2395-find-subarrays-with-equal-sum.js
@@ -0,0 +1,28 @@
+/**
+ * 2395. Find Subarrays With Equal Sum
+ * https://leetcode.com/problems/find-subarrays-with-equal-sum/
+ * Difficulty: Easy
+ *
+ * Given a 0-indexed integer array nums, determine whether there exist two subarrays of length
+ * 2 with equal sum. Note that the two subarrays must begin at different indices.
+ *
+ * Return true if these subarrays exist, and false otherwise.
+ *
+ * A subarray is a contiguous non-empty sequence of elements within an array.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {boolean}
+ */
+var findSubarrays = function(nums) {
+  const set = new Set();
+
+  for (let i = 0; i < nums.length - 1; i++) {
+    const sum = nums[i] + nums[i + 1];
+    if (set.has(sum)) return true;
+    set.add(sum);
+  }
+
+  return false;
+};

From 888178229ae997e06c8c6e8cdcea7686b4cfee2c Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 00:50:21 -0500
Subject: [PATCH 216/571] Add solution #2397

---
 README.md                                     |  3 +-
 .../2397-maximum-rows-covered-by-columns.js   | 61 +++++++++++++++++++
 2 files changed, 63 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2397-maximum-rows-covered-by-columns.js

diff --git a/README.md b/README.md
index 98e8beb3..ae51f11f 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,924 LeetCode solutions in JavaScript
+# 1,925 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1813,6 +1813,7 @@
 2392|[Build a Matrix With Conditions](./solutions/2392-build-a-matrix-with-conditions.js)|Hard|
 2395|[Find Subarrays With Equal Sum](./solutions/2395-find-subarrays-with-equal-sum.js)|Easy|
 2396|[Strictly Palindromic Number](./solutions/2396-strictly-palindromic-number.js)|Medium|
+2397|[Maximum Rows Covered by Columns](./solutions/2397-maximum-rows-covered-by-columns.js)|Medium|
 2401|[Longest Nice Subarray](./solutions/2401-longest-nice-subarray.js)|Medium|
 2413|[Smallest Even Multiple](./solutions/2413-smallest-even-multiple.js)|Easy|
 2425|[Bitwise XOR of All Pairings](./solutions/2425-bitwise-xor-of-all-pairings.js)|Medium|
diff --git a/solutions/2397-maximum-rows-covered-by-columns.js b/solutions/2397-maximum-rows-covered-by-columns.js
new file mode 100644
index 00000000..0fa68a2b
--- /dev/null
+++ b/solutions/2397-maximum-rows-covered-by-columns.js
@@ -0,0 +1,61 @@
+/**
+ * 2397. Maximum Rows Covered by Columns
+ * https://leetcode.com/problems/maximum-rows-covered-by-columns/
+ * Difficulty: Medium
+ *
+ * You are given an m x n binary matrix matrix and an integer numSelect.
+ *
+ * Your goal is to select exactly numSelect distinct columns from matrix such that you cover
+ * as many rows as possible.
+ *
+ * A row is considered covered if all the 1's in that row are also part of a column that you
+ * have selected. If a row does not have any 1s, it is also considered covered.
+ *
+ * More formally, let us consider selected = {c1, c2, ...., cnumSelect} as the set of columns
+ * selected by you. A row i is covered by selected if:
+ * - For each cell where matrix[i][j] == 1, the column j is in selected.
+ * - Or, no cell in row i has a value of 1.
+ *
+ * Return the maximum number of rows that can be covered by a set of numSelect columns.
+ */
+
+/**
+ * @param {number[][]} matrix
+ * @param {number} numSelect
+ * @return {number}
+ */
+var maximumRows = function(matrix, numSelect) {
+  const rows = matrix.length;
+  const cols = matrix[0].length;
+  let result = 0;
+
+  backtrack(0, 0, 0);
+
+  return result;
+
+  function countCovered(selected) {
+    let covered = 0;
+    for (let i = 0; i < rows; i++) {
+      let isCovered = true;
+      for (let j = 0; j < cols; j++) {
+        if (matrix[i][j] === 1 && !(selected & (1 << j))) {
+          isCovered = false;
+          break;
+        }
+      }
+      if (isCovered) covered++;
+    }
+    return covered;
+  }
+
+  function backtrack(index, selected, count) {
+    if (count === numSelect) {
+      result = Math.max(result, countCovered(selected));
+      return;
+    }
+    if (index >= cols || cols - index + count < numSelect) return;
+
+    backtrack(index + 1, selected | (1 << index), count + 1);
+    backtrack(index + 1, selected, count);
+  }
+};

From f74e3a968570fd75886c1669dff0fad9461c0274 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 01:03:08 -0500
Subject: [PATCH 217/571] Add solution #2399

---
 README.md                                     |  3 +-
 ...99-check-distances-between-same-letters.js | 44 +++++++++++++++++++
 2 files changed, 46 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2399-check-distances-between-same-letters.js

diff --git a/README.md b/README.md
index ae51f11f..0bbb9b86 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,925 LeetCode solutions in JavaScript
+# 1,926 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1814,6 +1814,7 @@
 2395|[Find Subarrays With Equal Sum](./solutions/2395-find-subarrays-with-equal-sum.js)|Easy|
 2396|[Strictly Palindromic Number](./solutions/2396-strictly-palindromic-number.js)|Medium|
 2397|[Maximum Rows Covered by Columns](./solutions/2397-maximum-rows-covered-by-columns.js)|Medium|
+2399|[Check Distances Between Same Letters](./solutions/2399-check-distances-between-same-letters.js)|Easy|
 2401|[Longest Nice Subarray](./solutions/2401-longest-nice-subarray.js)|Medium|
 2413|[Smallest Even Multiple](./solutions/2413-smallest-even-multiple.js)|Easy|
 2425|[Bitwise XOR of All Pairings](./solutions/2425-bitwise-xor-of-all-pairings.js)|Medium|
diff --git a/solutions/2399-check-distances-between-same-letters.js b/solutions/2399-check-distances-between-same-letters.js
new file mode 100644
index 00000000..7f977d1e
--- /dev/null
+++ b/solutions/2399-check-distances-between-same-letters.js
@@ -0,0 +1,44 @@
+/**
+ * 2399. Check Distances Between Same Letters
+ * https://leetcode.com/problems/check-distances-between-same-letters/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed string s consisting of only lowercase English letters, where each
+ * letter in s appears exactly twice. You are also given a 0-indexed integer array distance of
+ * length 26.
+ *
+ * Each letter in the alphabet is numbered from 0 to 25 (i.e. 'a' -> 0, 'b' -> 1,
+ * 'c' -> 2, ... , 'z' -> 25).
+ *
+ * In a well-spaced string, the number of letters between the two occurrences of the ith letter
+ * is distance[i]. If the ith letter does not appear in s, then distance[i] can be ignored.
+ *
+ * Return true if s is a well-spaced string, otherwise return false.
+ */
+
+/**
+ * @param {string} s
+ * @param {number[]} distance
+ * @return {boolean}
+ */
+var checkDistances = function(s, distance) {
+  const map = new Map();
+
+  for (let i = 0; i < s.length; i++) {
+    const char = s[i];
+    if (map.has(char)) {
+      map.get(char).push(i);
+    } else {
+      map.set(char, [i]);
+    }
+  }
+
+  for (const [char, positions] of map) {
+    const letterIndex = char.charCodeAt(0) - 'a'.charCodeAt(0);
+    if (positions[1] - positions[0] - 1 !== distance[letterIndex]) {
+      return false;
+    }
+  }
+
+  return true;
+};

From b77b5f6b2c12fddf21f44b88bcaadf35b99bf5d1 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 01:05:16 -0500
Subject: [PATCH 218/571] Add solution #2404

---
 README.md                                    |  3 +-
 solutions/2404-most-frequent-even-element.js | 33 ++++++++++++++++++++
 2 files changed, 35 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2404-most-frequent-even-element.js

diff --git a/README.md b/README.md
index 0bbb9b86..32c4149e 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,926 LeetCode solutions in JavaScript
+# 1,927 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1816,6 +1816,7 @@
 2397|[Maximum Rows Covered by Columns](./solutions/2397-maximum-rows-covered-by-columns.js)|Medium|
 2399|[Check Distances Between Same Letters](./solutions/2399-check-distances-between-same-letters.js)|Easy|
 2401|[Longest Nice Subarray](./solutions/2401-longest-nice-subarray.js)|Medium|
+2404|[Most Frequent Even Element](./solutions/2404-most-frequent-even-element.js)|Easy|
 2413|[Smallest Even Multiple](./solutions/2413-smallest-even-multiple.js)|Easy|
 2425|[Bitwise XOR of All Pairings](./solutions/2425-bitwise-xor-of-all-pairings.js)|Medium|
 2427|[Number of Common Factors](./solutions/2427-number-of-common-factors.js)|Easy|
diff --git a/solutions/2404-most-frequent-even-element.js b/solutions/2404-most-frequent-even-element.js
new file mode 100644
index 00000000..e5fcd0c6
--- /dev/null
+++ b/solutions/2404-most-frequent-even-element.js
@@ -0,0 +1,33 @@
+/**
+ * 2404. Most Frequent Even Element
+ * https://leetcode.com/problems/most-frequent-even-element/
+ * Difficulty: Easy
+ *
+ * Given an integer array nums, return the most frequent even element.
+ *
+ * If there is a tie, return the smallest one. If there is no such element, return -1.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var mostFrequentEven = function(nums) {
+  const map = new Map();
+  let maxCount = 0;
+  let result = -1;
+
+  for (const num of nums) {
+    if (num % 2 === 0) {
+      const count = (map.get(num) || 0) + 1;
+      map.set(num, count);
+      if (count > maxCount || (count === maxCount && num < result)) {
+        maxCount = count;
+        result = num;
+      }
+    }
+  }
+
+  return result;
+};
+

From c2ea326081c748cf689c4b0d14dcc035d13b9f94 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 01:06:44 -0500
Subject: [PATCH 219/571] Add solution #2405

---
 README.md                                     |  3 +-
 solutions/2405-optimal-partition-of-string.js | 31 +++++++++++++++++++
 2 files changed, 33 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2405-optimal-partition-of-string.js

diff --git a/README.md b/README.md
index 32c4149e..3976a369 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,927 LeetCode solutions in JavaScript
+# 1,928 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1817,6 +1817,7 @@
 2399|[Check Distances Between Same Letters](./solutions/2399-check-distances-between-same-letters.js)|Easy|
 2401|[Longest Nice Subarray](./solutions/2401-longest-nice-subarray.js)|Medium|
 2404|[Most Frequent Even Element](./solutions/2404-most-frequent-even-element.js)|Easy|
+2405|[Optimal Partition of String](./solutions/2405-optimal-partition-of-string.js)|Medium|
 2413|[Smallest Even Multiple](./solutions/2413-smallest-even-multiple.js)|Easy|
 2425|[Bitwise XOR of All Pairings](./solutions/2425-bitwise-xor-of-all-pairings.js)|Medium|
 2427|[Number of Common Factors](./solutions/2427-number-of-common-factors.js)|Easy|
diff --git a/solutions/2405-optimal-partition-of-string.js b/solutions/2405-optimal-partition-of-string.js
new file mode 100644
index 00000000..eb2849bc
--- /dev/null
+++ b/solutions/2405-optimal-partition-of-string.js
@@ -0,0 +1,31 @@
+/**
+ * 2405. Optimal Partition of String
+ * https://leetcode.com/problems/optimal-partition-of-string/
+ * Difficulty: Medium
+ *
+ * Given a string s, partition the string into one or more substrings such that the characters
+ * in each substring are unique. That is, no letter appears in a single substring more than once.
+ *
+ * Return the minimum number of substrings in such a partition.
+ *
+ * Note that each character should belong to exactly one substring in a partition.
+ */
+
+/**
+ * @param {string} s
+ * @return {number}
+ */
+var partitionString = function(s) {
+  const set = new Set();
+  let result = 1;
+
+  for (const char of s) {
+    if (set.has(char)) {
+      set.clear();
+      result++;
+    }
+    set.add(char);
+  }
+
+  return result;
+};

From 1a45ae55762c8e0ed6cb4b50f55b1bd6bd0d88af Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 01:07:49 -0500
Subject: [PATCH 220/571] Add solution #2409

---
 README.md                                   |  3 +-
 solutions/2409-count-days-spent-together.js | 48 +++++++++++++++++++++
 2 files changed, 50 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2409-count-days-spent-together.js

diff --git a/README.md b/README.md
index 3976a369..d604ee7c 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,928 LeetCode solutions in JavaScript
+# 1,929 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1818,6 +1818,7 @@
 2401|[Longest Nice Subarray](./solutions/2401-longest-nice-subarray.js)|Medium|
 2404|[Most Frequent Even Element](./solutions/2404-most-frequent-even-element.js)|Easy|
 2405|[Optimal Partition of String](./solutions/2405-optimal-partition-of-string.js)|Medium|
+2409|[Count Days Spent Together](./solutions/2409-count-days-spent-together.js)|Easy|
 2413|[Smallest Even Multiple](./solutions/2413-smallest-even-multiple.js)|Easy|
 2425|[Bitwise XOR of All Pairings](./solutions/2425-bitwise-xor-of-all-pairings.js)|Medium|
 2427|[Number of Common Factors](./solutions/2427-number-of-common-factors.js)|Easy|
diff --git a/solutions/2409-count-days-spent-together.js b/solutions/2409-count-days-spent-together.js
new file mode 100644
index 00000000..1047ab0b
--- /dev/null
+++ b/solutions/2409-count-days-spent-together.js
@@ -0,0 +1,48 @@
+/**
+ * 2409. Count Days Spent Together
+ * https://leetcode.com/problems/count-days-spent-together/
+ * Difficulty: Easy
+ *
+ * Alice and Bob are traveling to Rome for separate business meetings.
+ *
+ * You are given 4 strings arriveAlice, leaveAlice, arriveBob, and leaveBob. Alice will be in
+ * the city from the dates arriveAlice to leaveAlice (inclusive), while Bob will be in the city
+ * from the dates arriveBob to leaveBob (inclusive). Each will be a 5-character string in the
+ * format "MM-DD", corresponding to the month and day of the date.
+ *
+ * Return the total number of days that Alice and Bob are in Rome together.
+ *
+ * You can assume that all dates occur in the same calendar year, which is not a leap year. Note
+ * that the number of days per month can be represented as: [31, 28, 31, 30, 31, 30, 31, 31, 30,
+ * 31, 30, 31].
+ */
+
+/**
+ * @param {string} arriveAlice
+ * @param {string} leaveAlice
+ * @param {string} arriveBob
+ * @param {string} leaveBob
+ * @return {number}
+ */
+var countDaysTogether = function(arriveAlice, leaveAlice, arriveBob, leaveBob) {
+  const daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
+
+  function toDays(date) {
+    const [month, day] = date.split('-').map(Number);
+    let totalDays = 0;
+    for (let i = 0; i < month - 1; i++) {
+      totalDays += daysInMonth[i];
+    }
+    return totalDays + day;
+  }
+
+  const aliceStart = toDays(arriveAlice);
+  const aliceEnd = toDays(leaveAlice);
+  const bobStart = toDays(arriveBob);
+  const bobEnd = toDays(leaveBob);
+
+  const overlapStart = Math.max(aliceStart, bobStart);
+  const overlapEnd = Math.min(aliceEnd, bobEnd);
+
+  return Math.max(0, overlapEnd - overlapStart + 1);
+};

From e8040a90511255a51854967c58bb296a65e448f1 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 01:09:53 -0500
Subject: [PATCH 221/571] Add solution #2410

---
 README.md                                     |  3 +-
 ...ximum-matching-of-players-with-trainers.js | 35 +++++++++++++++++++
 2 files changed, 37 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2410-maximum-matching-of-players-with-trainers.js

diff --git a/README.md b/README.md
index d604ee7c..019f142b 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,929 LeetCode solutions in JavaScript
+# 1,930 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1819,6 +1819,7 @@
 2404|[Most Frequent Even Element](./solutions/2404-most-frequent-even-element.js)|Easy|
 2405|[Optimal Partition of String](./solutions/2405-optimal-partition-of-string.js)|Medium|
 2409|[Count Days Spent Together](./solutions/2409-count-days-spent-together.js)|Easy|
+2410|[Maximum Matching of Players With Trainers](./solutions/2410-maximum-matching-of-players-with-trainers.js)|Medium|
 2413|[Smallest Even Multiple](./solutions/2413-smallest-even-multiple.js)|Easy|
 2425|[Bitwise XOR of All Pairings](./solutions/2425-bitwise-xor-of-all-pairings.js)|Medium|
 2427|[Number of Common Factors](./solutions/2427-number-of-common-factors.js)|Easy|
diff --git a/solutions/2410-maximum-matching-of-players-with-trainers.js b/solutions/2410-maximum-matching-of-players-with-trainers.js
new file mode 100644
index 00000000..885db445
--- /dev/null
+++ b/solutions/2410-maximum-matching-of-players-with-trainers.js
@@ -0,0 +1,35 @@
+/**
+ * 2410. Maximum Matching of Players With Trainers
+ * https://leetcode.com/problems/maximum-matching-of-players-with-trainers/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed integer array players, where players[i] represents the ability of
+ * the ith player. You are also given a 0-indexed integer array trainers, where trainers[j]
+ * represents the training capacity of the jth trainer.
+ *
+ * The ith player can match with the jth trainer if the player's ability is less than or equal
+ * to the trainer's training capacity. Additionally, the ith player can be matched with at most
+ * one trainer, and the jth trainer can be matched with at most one player.
+ *
+ * Return the maximum number of matchings between players and trainers that satisfy these
+ * conditions.
+ */
+
+/**
+ * @param {number[]} players
+ * @param {number[]} trainers
+ * @return {number}
+ */
+var matchPlayersAndTrainers = function(players, trainers) {
+  players.sort((a, b) => a - b);
+  trainers.sort((a, b) => a - b);
+
+  let result = 0;
+  for (let j = 0; result < players.length && j < trainers.length; j++) {
+    if (trainers[j] >= players[result]) {
+      result++;
+    }
+  }
+
+  return result;
+};

From ce703da83613cecb420ff74761553873e6f8c156 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 18:11:08 -0500
Subject: [PATCH 222/571] Add solution #3362

---
 README.md                                     |  3 +-
 .../3362-zero-array-transformation-iii.js     | 53 +++++++++++++++++++
 2 files changed, 55 insertions(+), 1 deletion(-)
 create mode 100644 solutions/3362-zero-array-transformation-iii.js

diff --git a/README.md b/README.md
index 019f142b..208d6c15 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,930 LeetCode solutions in JavaScript
+# 1,931 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1925,6 +1925,7 @@
 3343|[Count Number of Balanced Permutations](./solutions/3343-count-number-of-balanced-permutations.js)|Hard|
 3355|[Zero Array Transformation I](./solutions/3355-zero-array-transformation-i.js)|Medium|
 3356|[Zero Array Transformation II](./solutions/3356-zero-array-transformation-ii.js)|Medium|
+3362|[Zero Array Transformation III](./solutions/3362-zero-array-transformation-iii.js)|Medium|
 3375|[Minimum Operations to Make Array Values Equal to K](./solutions/3375-minimum-operations-to-make-array-values-equal-to-k.js)|Easy|
 3392|[Count Subarrays of Length Three With a Condition](./solutions/3392-count-subarrays-of-length-three-with-a-condition.js)|Easy|
 3394|[Check if Grid can be Cut into Sections](./solutions/3394-check-if-grid-can-be-cut-into-sections.js)|Medium|
diff --git a/solutions/3362-zero-array-transformation-iii.js b/solutions/3362-zero-array-transformation-iii.js
new file mode 100644
index 00000000..f6d979bb
--- /dev/null
+++ b/solutions/3362-zero-array-transformation-iii.js
@@ -0,0 +1,53 @@
+/**
+ * 3362. Zero Array Transformation III
+ * https://leetcode.com/problems/zero-array-transformation-iii/
+ * Difficulty: Medium
+ *
+ * You are given an integer array nums of length n and a 2D array queries where
+ * queries[i] = [li, ri].
+ *
+ * Each queries[i] represents the following action on nums:
+ * - Decrement the value at each index in the range [li, ri] in nums by at most 1.
+ * - The amount by which the value is decremented can be chosen independently for each index.
+ *
+ * A Zero Array is an array with all its elements equal to 0.
+ *
+ * Return the maximum number of elements that can be removed from queries, such that nums can
+ * still be converted to a zero array using the remaining queries. If it is not possible to
+ * convert nums to a zero array, return -1.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number[][]} queries
+ * @return {number}
+ */
+var maxRemoval = function(nums, queries) {
+  queries.sort((a, b) => a[0] - b[0]);
+  const endIndexHeap = new MaxPriorityQueue();
+  const expiredQueries = new Array(nums.length + 1).fill(0);
+  let operationCount = 0;
+  let queryIndex = 0;
+
+  for (let numIndex = 0; numIndex < nums.length; numIndex++) {
+    operationCount -= expiredQueries[numIndex];
+
+    while (queryIndex < queries.length && queries[queryIndex][0] === numIndex) {
+      endIndexHeap.push(queries[queryIndex][1]);
+      queryIndex++;
+    }
+
+    while (
+      operationCount < nums[numIndex] && !endIndexHeap.isEmpty() && endIndexHeap.front() >= numIndex
+    ) {
+      operationCount++;
+      expiredQueries[endIndexHeap.pop() + 1]++;
+    }
+
+    if (operationCount < nums[numIndex]) {
+      return -1;
+    }
+  }
+
+  return endIndexHeap.size();
+};

From 701cf0bf3f766ef9a7557e18daa000330a09ee22 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 18:13:13 -0500
Subject: [PATCH 223/571] Add solution #2411

---
 README.md                                     |  3 +-
 ...llest-subarrays-with-maximum-bitwise-or.js | 46 +++++++++++++++++++
 2 files changed, 48 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2411-smallest-subarrays-with-maximum-bitwise-or.js

diff --git a/README.md b/README.md
index 208d6c15..c455c8a5 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,931 LeetCode solutions in JavaScript
+# 1,932 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1820,6 +1820,7 @@
 2405|[Optimal Partition of String](./solutions/2405-optimal-partition-of-string.js)|Medium|
 2409|[Count Days Spent Together](./solutions/2409-count-days-spent-together.js)|Easy|
 2410|[Maximum Matching of Players With Trainers](./solutions/2410-maximum-matching-of-players-with-trainers.js)|Medium|
+2411|[Smallest Subarrays With Maximum Bitwise OR](./solutions/2411-smallest-subarrays-with-maximum-bitwise-or.js)|Medium|
 2413|[Smallest Even Multiple](./solutions/2413-smallest-even-multiple.js)|Easy|
 2425|[Bitwise XOR of All Pairings](./solutions/2425-bitwise-xor-of-all-pairings.js)|Medium|
 2427|[Number of Common Factors](./solutions/2427-number-of-common-factors.js)|Easy|
diff --git a/solutions/2411-smallest-subarrays-with-maximum-bitwise-or.js b/solutions/2411-smallest-subarrays-with-maximum-bitwise-or.js
new file mode 100644
index 00000000..784cf5d2
--- /dev/null
+++ b/solutions/2411-smallest-subarrays-with-maximum-bitwise-or.js
@@ -0,0 +1,46 @@
+/**
+ * 2411. Smallest Subarrays With Maximum Bitwise OR
+ * https://leetcode.com/problems/smallest-subarrays-with-maximum-bitwise-or/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed array nums of length n, consisting of non-negative integers. For
+ * each index i from 0 to n - 1, you must determine the size of the minimum sized non-empty
+ * subarray of nums starting at i (inclusive) that has the maximum possible bitwise OR.
+ * - In other words, let Bij be the bitwise OR of the subarray nums[i...j]. You need to find
+ *   the smallest subarray starting at i, such that bitwise OR of this subarray is equal to
+ *   max(Bik) where i <= k <= n - 1.
+ *
+ * The bitwise OR of an array is the bitwise OR of all the numbers in it.
+ *
+ * Return an integer array answer of size n where answer[i] is the length of the minimum sized
+ * subarray starting at i with maximum bitwise OR.
+ *
+ * A subarray is a contiguous non-empty sequence of elements within an array.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number[]}
+ */
+var smallestSubarrays = function(nums) {
+  const n = nums.length;
+  const result = new Array(n).fill(1);
+  const bitPositions = new Array(32).fill(0);
+
+  for (let i = n - 1; i >= 0; i--) {
+    for (let bit = 0; bit < 32; bit++) {
+      if (nums[i] & (1 << bit)) {
+        bitPositions[bit] = i;
+      }
+    }
+
+    let maxIndex = i;
+    for (let bit = 0; bit < 32; bit++) {
+      maxIndex = Math.max(maxIndex, bitPositions[bit]);
+    }
+
+    result[i] = maxIndex - i + 1;
+  }
+
+  return result;
+};

From 35338e8460dbc920bf12786bc02337a01adef03c Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 18:14:11 -0500
Subject: [PATCH 224/571] Add solution #2412

---
 README.md                                     |  3 +-
 ...imum-money-required-before-transactions.js | 36 +++++++++++++++++++
 2 files changed, 38 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2412-minimum-money-required-before-transactions.js

diff --git a/README.md b/README.md
index c455c8a5..8abc2edb 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,932 LeetCode solutions in JavaScript
+# 1,933 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1821,6 +1821,7 @@
 2409|[Count Days Spent Together](./solutions/2409-count-days-spent-together.js)|Easy|
 2410|[Maximum Matching of Players With Trainers](./solutions/2410-maximum-matching-of-players-with-trainers.js)|Medium|
 2411|[Smallest Subarrays With Maximum Bitwise OR](./solutions/2411-smallest-subarrays-with-maximum-bitwise-or.js)|Medium|
+2412|[Minimum Money Required Before Transactions](./solutions/2412-minimum-money-required-before-transactions.js)|Hard|
 2413|[Smallest Even Multiple](./solutions/2413-smallest-even-multiple.js)|Easy|
 2425|[Bitwise XOR of All Pairings](./solutions/2425-bitwise-xor-of-all-pairings.js)|Medium|
 2427|[Number of Common Factors](./solutions/2427-number-of-common-factors.js)|Easy|
diff --git a/solutions/2412-minimum-money-required-before-transactions.js b/solutions/2412-minimum-money-required-before-transactions.js
new file mode 100644
index 00000000..240ca6ca
--- /dev/null
+++ b/solutions/2412-minimum-money-required-before-transactions.js
@@ -0,0 +1,36 @@
+/**
+ * 2412. Minimum Money Required Before Transactions
+ * https://leetcode.com/problems/minimum-money-required-before-transactions/
+ * Difficulty: Hard
+ *
+ * You are given a 0-indexed 2D integer array transactions, where
+ * transactions[i] = [costi, cashbacki].
+ *
+ * The array describes transactions, where each transaction must be completed exactly once
+ * in some order. At any given moment, you have a certain amount of money. In order to
+ * complete transaction i, money >= costi must hold true. After performing a transaction,
+ * money becomes money - costi + cashbacki.
+ *
+ * Return the minimum amount of money required before any transaction so that all of the
+ * transactions can be completed regardless of the order of the transactions.
+ */
+
+/**
+ * @param {number[][]} transactions
+ * @return {number}
+ */
+var minimumMoney = function(transactions) {
+  let totalLoss = 0;
+  let maxCost = 0;
+
+  for (const [cost, cashback] of transactions) {
+    if (cost > cashback) {
+      totalLoss += cost - cashback;
+      maxCost = Math.max(maxCost, cashback);
+    } else {
+      maxCost = Math.max(maxCost, cost);
+    }
+  }
+
+  return totalLoss + maxCost;
+};

From f3063f84d6c6214bb38ea1ec5e518f335ec65867 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 18:15:21 -0500
Subject: [PATCH 225/571] Add solution #2414

---
 README.md                                     |  3 +-
 ...ngest-alphabetical-continuous-substring.js | 32 +++++++++++++++++++
 2 files changed, 34 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2414-length-of-the-longest-alphabetical-continuous-substring.js

diff --git a/README.md b/README.md
index 8abc2edb..929cedbd 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,933 LeetCode solutions in JavaScript
+# 1,934 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1823,6 +1823,7 @@
 2411|[Smallest Subarrays With Maximum Bitwise OR](./solutions/2411-smallest-subarrays-with-maximum-bitwise-or.js)|Medium|
 2412|[Minimum Money Required Before Transactions](./solutions/2412-minimum-money-required-before-transactions.js)|Hard|
 2413|[Smallest Even Multiple](./solutions/2413-smallest-even-multiple.js)|Easy|
+2414|[Length of the Longest Alphabetical Continuous Substring](./solutions/2414-length-of-the-longest-alphabetical-continuous-substring.js)|Medium|
 2425|[Bitwise XOR of All Pairings](./solutions/2425-bitwise-xor-of-all-pairings.js)|Medium|
 2427|[Number of Common Factors](./solutions/2427-number-of-common-factors.js)|Easy|
 2429|[Minimize XOR](./solutions/2429-minimize-xor.js)|Medium|
diff --git a/solutions/2414-length-of-the-longest-alphabetical-continuous-substring.js b/solutions/2414-length-of-the-longest-alphabetical-continuous-substring.js
new file mode 100644
index 00000000..afb44c82
--- /dev/null
+++ b/solutions/2414-length-of-the-longest-alphabetical-continuous-substring.js
@@ -0,0 +1,32 @@
+/**
+ * 2414. Length of the Longest Alphabetical Continuous Substring
+ * https://leetcode.com/problems/length-of-the-longest-alphabetical-continuous-substring/
+ * Difficulty: Medium
+ *
+ * An alphabetical continuous string is a string consisting of consecutive letters in the alphabet.
+ * In other words, it is any substring of the string "abcdefghijklmnopqrstuvwxyz".
+ * - For example, "abc" is an alphabetical continuous string, while "acb" and "za" are not.
+ *
+ * Given a string s consisting of lowercase letters only, return the length of the longest
+ * alphabetical continuous substring.
+ */
+
+/**
+ * @param {string} s
+ * @return {number}
+ */
+var longestContinuousSubstring = function(s) {
+  let result = 1;
+  let currentLength = 1;
+
+  for (let i = 1; i < s.length; i++) {
+    if (s.charCodeAt(i) - s.charCodeAt(i - 1) === 1) {
+      currentLength++;
+      result = Math.max(result, currentLength);
+    } else {
+      currentLength = 1;
+    }
+  }
+
+  return result;
+};

From 2637e6062f2e85957204b91dd08d7c51a7303be6 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 18:16:55 -0500
Subject: [PATCH 226/571] Add solution #2415

---
 README.md                                     |  3 +-
 .../2415-reverse-odd-levels-of-binary-tree.js | 51 +++++++++++++++++++
 2 files changed, 53 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2415-reverse-odd-levels-of-binary-tree.js

diff --git a/README.md b/README.md
index 929cedbd..13148eee 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,934 LeetCode solutions in JavaScript
+# 1,935 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1824,6 +1824,7 @@
 2412|[Minimum Money Required Before Transactions](./solutions/2412-minimum-money-required-before-transactions.js)|Hard|
 2413|[Smallest Even Multiple](./solutions/2413-smallest-even-multiple.js)|Easy|
 2414|[Length of the Longest Alphabetical Continuous Substring](./solutions/2414-length-of-the-longest-alphabetical-continuous-substring.js)|Medium|
+2415|[Reverse Odd Levels of Binary Tree](./solutions/2415-reverse-odd-levels-of-binary-tree.js)|Medium|
 2425|[Bitwise XOR of All Pairings](./solutions/2425-bitwise-xor-of-all-pairings.js)|Medium|
 2427|[Number of Common Factors](./solutions/2427-number-of-common-factors.js)|Easy|
 2429|[Minimize XOR](./solutions/2429-minimize-xor.js)|Medium|
diff --git a/solutions/2415-reverse-odd-levels-of-binary-tree.js b/solutions/2415-reverse-odd-levels-of-binary-tree.js
new file mode 100644
index 00000000..9c70383b
--- /dev/null
+++ b/solutions/2415-reverse-odd-levels-of-binary-tree.js
@@ -0,0 +1,51 @@
+/**
+ * 2415. Reverse Odd Levels of Binary Tree
+ * https://leetcode.com/problems/reverse-odd-levels-of-binary-tree/
+ * Difficulty: Medium
+ *
+ * Given the root of a perfect binary tree, reverse the node values at each odd level of the tree.
+ * - For example, suppose the node values at level 3 are [2,1,3,4,7,11,29,18], then it should
+ *   become [18,29,11,7,4,3,1,2].
+ *
+ * Return the root of the reversed tree.
+ *
+ * A binary tree is perfect if all parent nodes have two children and all leaves are on the same
+ * level.
+ *
+ * The level of a node is the number of edges along the path between it and the root node.
+ */
+
+/**
+ * Definition for a binary tree node.
+ * function TreeNode(val, left, right) {
+ *     this.val = (val===undefined ? 0 : val)
+ *     this.left = (left===undefined ? null : left)
+ *     this.right = (right===undefined ? null : right)
+ * }
+ */
+/**
+ * @param {TreeNode} root
+ * @return {TreeNode}
+ */
+var reverseOddLevels = function(root) {
+  reverseLevel([root], 0);
+  return root;
+
+  function reverseLevel(nodes, level) {
+    if (!nodes.length) return;
+
+    if (level % 2 === 1) {
+      for (let i = 0, j = nodes.length - 1; i < j; i++, j--) {
+        [nodes[i].val, nodes[j].val] = [nodes[j].val, nodes[i].val];
+      }
+    }
+
+    const nextLevel = [];
+    for (const node of nodes) {
+      if (node.left) nextLevel.push(node.left);
+      if (node.right) nextLevel.push(node.right);
+    }
+
+    reverseLevel(nextLevel, level + 1);
+  }
+};

From b8c8af56c336d9a8834819d6a99a169508f238ee Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 18:20:06 -0500
Subject: [PATCH 227/571] Add solution #2416

---
 README.md                                     |  3 +-
 .../2416-sum-of-prefix-scores-of-strings.js   | 56 +++++++++++++++++++
 2 files changed, 58 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2416-sum-of-prefix-scores-of-strings.js

diff --git a/README.md b/README.md
index 13148eee..88b52945 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,935 LeetCode solutions in JavaScript
+# 1,936 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1825,6 +1825,7 @@
 2413|[Smallest Even Multiple](./solutions/2413-smallest-even-multiple.js)|Easy|
 2414|[Length of the Longest Alphabetical Continuous Substring](./solutions/2414-length-of-the-longest-alphabetical-continuous-substring.js)|Medium|
 2415|[Reverse Odd Levels of Binary Tree](./solutions/2415-reverse-odd-levels-of-binary-tree.js)|Medium|
+2416|[Sum of Prefix Scores of Strings](./solutions/2416-sum-of-prefix-scores-of-strings.js)|Hard|
 2425|[Bitwise XOR of All Pairings](./solutions/2425-bitwise-xor-of-all-pairings.js)|Medium|
 2427|[Number of Common Factors](./solutions/2427-number-of-common-factors.js)|Easy|
 2429|[Minimize XOR](./solutions/2429-minimize-xor.js)|Medium|
diff --git a/solutions/2416-sum-of-prefix-scores-of-strings.js b/solutions/2416-sum-of-prefix-scores-of-strings.js
new file mode 100644
index 00000000..45d3a184
--- /dev/null
+++ b/solutions/2416-sum-of-prefix-scores-of-strings.js
@@ -0,0 +1,56 @@
+/**
+ * 2416. Sum of Prefix Scores of Strings
+ * https://leetcode.com/problems/sum-of-prefix-scores-of-strings/
+ * Difficulty: Hard
+ *
+ * You are given an array words of size n consisting of non-empty strings.
+ *
+ * We define the score of a string term as the number of strings words[i] such that term is
+ * a prefix of words[i].
+ * - For example, if words = ["a", "ab", "abc", "cab"], then the score of "ab" is 2, since
+ *   "ab" is a prefix of both "ab" and "abc".
+ *
+ * Return an array answer of size n where answer[i] is the sum of scores of every non-empty
+ * prefix of words[i].
+ *
+ * Note that a string is considered as a prefix of itself.
+ */
+
+/**
+ * @param {string[]} words
+ * @return {number[]}
+ */
+var sumPrefixScores = function(words) {
+  class TrieNode {
+    constructor() {
+      this.children = new Map();
+      this.count = 0;
+    }
+  }
+
+  const root = new TrieNode();
+
+  for (const word of words) {
+    let node = root;
+    for (const char of word) {
+      if (!node.children.has(char)) {
+        node.children.set(char, new TrieNode());
+      }
+      node = node.children.get(char);
+      node.count++;
+    }
+  }
+
+  const result = [];
+  for (const word of words) {
+    let node = root;
+    let score = 0;
+    for (const char of word) {
+      node = node.children.get(char);
+      score += node.count;
+    }
+    result.push(score);
+  }
+
+  return result;
+};

From 07dd5cf774c7656438898a2962fde93421e335e5 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 18:20:55 -0500
Subject: [PATCH 228/571] Add solution #2418

---
 README.md                         |  3 ++-
 solutions/2418-sort-the-people.js | 23 +++++++++++++++++++++++
 2 files changed, 25 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2418-sort-the-people.js

diff --git a/README.md b/README.md
index 88b52945..56381df0 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,936 LeetCode solutions in JavaScript
+# 1,937 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1826,6 +1826,7 @@
 2414|[Length of the Longest Alphabetical Continuous Substring](./solutions/2414-length-of-the-longest-alphabetical-continuous-substring.js)|Medium|
 2415|[Reverse Odd Levels of Binary Tree](./solutions/2415-reverse-odd-levels-of-binary-tree.js)|Medium|
 2416|[Sum of Prefix Scores of Strings](./solutions/2416-sum-of-prefix-scores-of-strings.js)|Hard|
+2418|[Sort the People](./solutions/2418-sort-the-people.js)|Easy|
 2425|[Bitwise XOR of All Pairings](./solutions/2425-bitwise-xor-of-all-pairings.js)|Medium|
 2427|[Number of Common Factors](./solutions/2427-number-of-common-factors.js)|Easy|
 2429|[Minimize XOR](./solutions/2429-minimize-xor.js)|Medium|
diff --git a/solutions/2418-sort-the-people.js b/solutions/2418-sort-the-people.js
new file mode 100644
index 00000000..c0477a6a
--- /dev/null
+++ b/solutions/2418-sort-the-people.js
@@ -0,0 +1,23 @@
+/**
+ * 2418. Sort the People
+ * https://leetcode.com/problems/sort-the-people/
+ * Difficulty: Easy
+ *
+ * You are given an array of strings names, and an array heights that consists of distinct
+ * positive integers. Both arrays are of length n.
+ *
+ * For each index i, names[i] and heights[i] denote the name and height of the ith person.
+ *
+ * Return names sorted in descending order by the people's heights.
+ */
+
+/**
+ * @param {string[]} names
+ * @param {number[]} heights
+ * @return {string[]}
+ */
+var sortPeople = function(names, heights) {
+  const people = names.map((name, index) => ({name, height: heights[index]}));
+  people.sort((a, b) => b.height - a.height);
+  return people.map(person => person.name);
+};

From de4370e8bb77b33e41a2216d44c8309b3cd8ad24 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 18:21:55 -0500
Subject: [PATCH 229/571] Add solution #2419

---
 README.md                                     |  3 +-
 ...ngest-subarray-with-maximum-bitwise-and.js | 38 +++++++++++++++++++
 2 files changed, 40 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2419-longest-subarray-with-maximum-bitwise-and.js

diff --git a/README.md b/README.md
index 56381df0..1e0d537a 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,937 LeetCode solutions in JavaScript
+# 1,938 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1827,6 +1827,7 @@
 2415|[Reverse Odd Levels of Binary Tree](./solutions/2415-reverse-odd-levels-of-binary-tree.js)|Medium|
 2416|[Sum of Prefix Scores of Strings](./solutions/2416-sum-of-prefix-scores-of-strings.js)|Hard|
 2418|[Sort the People](./solutions/2418-sort-the-people.js)|Easy|
+2419|[Longest Subarray With Maximum Bitwise AND](./solutions/2419-longest-subarray-with-maximum-bitwise-and.js)|Medium|
 2425|[Bitwise XOR of All Pairings](./solutions/2425-bitwise-xor-of-all-pairings.js)|Medium|
 2427|[Number of Common Factors](./solutions/2427-number-of-common-factors.js)|Easy|
 2429|[Minimize XOR](./solutions/2429-minimize-xor.js)|Medium|
diff --git a/solutions/2419-longest-subarray-with-maximum-bitwise-and.js b/solutions/2419-longest-subarray-with-maximum-bitwise-and.js
new file mode 100644
index 00000000..c6a26711
--- /dev/null
+++ b/solutions/2419-longest-subarray-with-maximum-bitwise-and.js
@@ -0,0 +1,38 @@
+/**
+ * 2419. Longest Subarray With Maximum Bitwise AND
+ * https://leetcode.com/problems/longest-subarray-with-maximum-bitwise-and/
+ * Difficulty: Medium
+ *
+ * You are given an integer array nums of size n.
+ *
+ * Consider a non-empty subarray from nums that has the maximum possible bitwise AND.
+ * - In other words, let k be the maximum value of the bitwise AND of any subarray of nums.
+ *   Then, only subarrays with a bitwise AND equal to k should be considered.
+ *
+ * Return the length of the longest such subarray.
+ *
+ * The bitwise AND of an array is the bitwise AND of all the numbers in it.
+ *
+ * A subarray is a contiguous sequence of elements within an array.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var longestSubarray = function(nums) {
+  const maxValue = Math.max(...nums);
+  let result = 0;
+  let currentLength = 0;
+
+  for (const num of nums) {
+    if (num === maxValue) {
+      currentLength++;
+      result = Math.max(result, currentLength);
+    } else {
+      currentLength = 0;
+    }
+  }
+
+  return result;
+};

From accb59aa6bdfdc3de96b168abcb33ec705ef6b21 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 18:26:11 -0500
Subject: [PATCH 230/571] Add solution #2421

---
 README.md                              |  3 +-
 solutions/2421-number-of-good-paths.js | 86 ++++++++++++++++++++++++++
 2 files changed, 88 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2421-number-of-good-paths.js

diff --git a/README.md b/README.md
index 1e0d537a..54e5c2d1 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,938 LeetCode solutions in JavaScript
+# 1,939 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1828,6 +1828,7 @@
 2416|[Sum of Prefix Scores of Strings](./solutions/2416-sum-of-prefix-scores-of-strings.js)|Hard|
 2418|[Sort the People](./solutions/2418-sort-the-people.js)|Easy|
 2419|[Longest Subarray With Maximum Bitwise AND](./solutions/2419-longest-subarray-with-maximum-bitwise-and.js)|Medium|
+2421|[Number of Good Paths](./solutions/2421-number-of-good-paths.js)|Hard|
 2425|[Bitwise XOR of All Pairings](./solutions/2425-bitwise-xor-of-all-pairings.js)|Medium|
 2427|[Number of Common Factors](./solutions/2427-number-of-common-factors.js)|Easy|
 2429|[Minimize XOR](./solutions/2429-minimize-xor.js)|Medium|
diff --git a/solutions/2421-number-of-good-paths.js b/solutions/2421-number-of-good-paths.js
new file mode 100644
index 00000000..c0f7d606
--- /dev/null
+++ b/solutions/2421-number-of-good-paths.js
@@ -0,0 +1,86 @@
+/**
+ * 2421. Number of Good Paths
+ * https://leetcode.com/problems/number-of-good-paths/
+ * Difficulty: Hard
+ *
+ * There is a tree (i.e. a connected, undirected graph with no cycles) consisting of n nodes
+ * numbered from 0 to n - 1 and exactly n - 1 edges.
+ *
+ * You are given a 0-indexed integer array vals of length n where vals[i] denotes the value
+ * of the ith node. You are also given a 2D integer array edges where edges[i] = [ai, bi]
+ * denotes that there exists an undirected edge connecting nodes ai and bi.
+ *
+ * A good path is a simple path that satisfies the following conditions:
+ * 1. The starting node and the ending node have the same value.
+ * 2. All nodes between the starting node and the ending node have values less than or equal
+ *    to the starting node (i.e. the starting node's value should be the maximum value along
+ *    the path).
+ *
+ * Return the number of distinct good paths.
+ *
+ * Note that a path and its reverse are counted as the same path. For example, 0 -> 1 is
+ * considered to be the same as 1 -> 0. A single node is also considered as a valid path.
+ */
+
+/**
+ * @param {number[]} vals
+ * @param {number[][]} edges
+ * @return {number}
+ */
+var numberOfGoodPaths = function(vals, edges) {
+  const n = vals.length;
+  const graph = Array.from({length: n}, () => []);
+  for (const [u, v] of edges) {
+    graph[u].push(v);
+    graph[v].push(u);
+  }
+
+  const parent = new Array(n).fill(-1);
+  const rank = new Array(n).fill(0);
+  function find(x) {
+    if (parent[x] === -1) return x;
+    return parent[x] = find(parent[x]);
+  }
+
+  function union(x, y) {
+    let px = find(x);
+    let py = find(y);
+    if (px === py) return;
+    if (rank[px] < rank[py]) [px, py] = [py, px];
+    parent[py] = px;
+    if (rank[px] === rank[py]) rank[px]++;
+  }
+
+  const valueGroups = new Map();
+  for (let i = 0; i < n; i++) {
+    if (!valueGroups.has(vals[i])) {
+      valueGroups.set(vals[i], []);
+    }
+    valueGroups.get(vals[i]).push(i);
+  }
+
+  let result = 0;
+  for (const value of [...valueGroups.keys()].sort((a, b) => a - b)) {
+    const nodes = valueGroups.get(value);
+
+    for (const node of nodes) {
+      for (const neighbor of graph[node]) {
+        if (vals[neighbor] <= value) {
+          union(node, neighbor);
+        }
+      }
+    }
+
+    const groupCount = new Map();
+    for (const node of nodes) {
+      const root = find(node);
+      groupCount.set(root, (groupCount.get(root) || 0) + 1);
+    }
+
+    for (const count of groupCount.values()) {
+      result += (count * (count + 1)) / 2;
+    }
+  }
+
+  return result;
+};

From 779731fbe40e62ee24c73c2e69e57fa5681dcf5b Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 18:27:30 -0500
Subject: [PATCH 231/571] Add solution #2426

---
 README.md                                     |  3 +-
 ...6-number-of-pairs-satisfying-inequality.js | 66 +++++++++++++++++++
 2 files changed, 68 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2426-number-of-pairs-satisfying-inequality.js

diff --git a/README.md b/README.md
index 54e5c2d1..91e8f4d7 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,939 LeetCode solutions in JavaScript
+# 1,940 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1830,6 +1830,7 @@
 2419|[Longest Subarray With Maximum Bitwise AND](./solutions/2419-longest-subarray-with-maximum-bitwise-and.js)|Medium|
 2421|[Number of Good Paths](./solutions/2421-number-of-good-paths.js)|Hard|
 2425|[Bitwise XOR of All Pairings](./solutions/2425-bitwise-xor-of-all-pairings.js)|Medium|
+2426|[Number of Pairs Satisfying Inequality](./solutions/2426-number-of-pairs-satisfying-inequality.js)|Hard|
 2427|[Number of Common Factors](./solutions/2427-number-of-common-factors.js)|Easy|
 2429|[Minimize XOR](./solutions/2429-minimize-xor.js)|Medium|
 2444|[Count Subarrays With Fixed Bounds](./solutions/2444-count-subarrays-with-fixed-bounds.js)|Hard|
diff --git a/solutions/2426-number-of-pairs-satisfying-inequality.js b/solutions/2426-number-of-pairs-satisfying-inequality.js
new file mode 100644
index 00000000..e24957fd
--- /dev/null
+++ b/solutions/2426-number-of-pairs-satisfying-inequality.js
@@ -0,0 +1,66 @@
+/**
+ * 2426. Number of Pairs Satisfying Inequality
+ * https://leetcode.com/problems/number-of-pairs-satisfying-inequality/
+ * Difficulty: Hard
+ *
+ * You are given two 0-indexed integer arrays nums1 and nums2, each of size n, and an
+ * integer diff. Find the number of pairs (i, j) such that:
+ * - 0 <= i < j <= n - 1 and
+ * - nums1[i] - nums1[j] <= nums2[i] - nums2[j] + diff.
+ *
+ * Return the number of pairs that satisfy the conditions.
+ */
+
+/**
+ * @param {number[]} nums1
+ * @param {number[]} nums2
+ * @param {number} diff
+ * @return {number}
+ */
+var numberOfPairs = function(nums1, nums2, diff) {
+  const n = nums1.length;
+  const differences = new Array(n);
+  for (let i = 0; i < n; i++) {
+    differences[i] = nums1[i] - nums2[i];
+  }
+  let result = 0;
+  mergeSort(0, n);
+  return result;
+
+  function mergeSort(left, right) {
+    if (right - left <= 1) return;
+
+    const mid = Math.floor((left + right) / 2);
+    mergeSort(left, mid);
+    mergeSort(mid, right);
+
+    let i = left;
+    let j = mid;
+    while (i < mid && j < right) {
+      if (differences[i] <= differences[j] + diff) {
+        result += right - j;
+        i++;
+      } else {
+        j++;
+      }
+    }
+
+    const sorted = new Array(right - left);
+    let k = 0;
+    i = left;
+    j = mid;
+    while (i < mid && j < right) {
+      if (differences[i] <= differences[j]) {
+        sorted[k++] = differences[i++];
+      } else {
+        sorted[k++] = differences[j++];
+      }
+    }
+    while (i < mid) sorted[k++] = differences[i++];
+    while (j < right) sorted[k++] = differences[j++];
+
+    for (let p = 0; p < sorted.length; p++) {
+      differences[left + p] = sorted[p];
+    }
+  }
+};

From aa072920c2d4451fa74a9a230bd82ff0c9b3260f Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 18:34:55 -0500
Subject: [PATCH 232/571] Add solution #2428

---
 README.md                                     |  3 +-
 solutions/2428-maximum-sum-of-an-hourglass.js | 33 +++++++++++++++++++
 2 files changed, 35 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2428-maximum-sum-of-an-hourglass.js

diff --git a/README.md b/README.md
index 91e8f4d7..d6989e52 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,940 LeetCode solutions in JavaScript
+# 1,941 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1832,6 +1832,7 @@
 2425|[Bitwise XOR of All Pairings](./solutions/2425-bitwise-xor-of-all-pairings.js)|Medium|
 2426|[Number of Pairs Satisfying Inequality](./solutions/2426-number-of-pairs-satisfying-inequality.js)|Hard|
 2427|[Number of Common Factors](./solutions/2427-number-of-common-factors.js)|Easy|
+2428|[Maximum Sum of an Hourglass](./solutions/2428-maximum-sum-of-an-hourglass.js)|Medium|
 2429|[Minimize XOR](./solutions/2429-minimize-xor.js)|Medium|
 2444|[Count Subarrays With Fixed Bounds](./solutions/2444-count-subarrays-with-fixed-bounds.js)|Hard|
 2460|[Apply Operations to an Array](./solutions/2460-apply-operations-to-an-array.js)|Easy|
diff --git a/solutions/2428-maximum-sum-of-an-hourglass.js b/solutions/2428-maximum-sum-of-an-hourglass.js
new file mode 100644
index 00000000..f6cb5a39
--- /dev/null
+++ b/solutions/2428-maximum-sum-of-an-hourglass.js
@@ -0,0 +1,33 @@
+/**
+ * 2428. Maximum Sum of an Hourglass
+ * https://leetcode.com/problems/maximum-sum-of-an-hourglass/
+ * Difficulty: Medium
+ *
+ * You are given an m x n integer matrix grid.
+ *
+ * We define an hourglass as a part of the matrix with the following form.
+ *
+ * Return the maximum sum of the elements of an hourglass.
+ *
+ * Note that an hourglass cannot be rotated and must be entirely contained within the matrix.
+ */
+
+/**
+ * @param {number[][]} grid
+ * @return {number}
+ */
+var maxSum = function(grid) {
+  let result = 0;
+  const rows = grid.length;
+  const cols = grid[0].length;
+
+  for (let i = 0; i <= rows - 3; i++) {
+    for (let j = 0; j <= cols - 3; j++) {
+      const hourglassSum = grid[i][j] + grid[i][j+1] + grid[i][j+2] + grid[i+1][j+1]
+        + grid[i+2][j] + grid[i+2][j+1] + grid[i+2][j+2];
+      result = Math.max(result, hourglassSum);
+    }
+  }
+
+  return result;
+};

From a5829fa5d912d36ec668a3221d1e8210d40da324 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 18:36:08 -0500
Subject: [PATCH 233/571] Add solution #2432

---
 README.md                                     |  3 +-
 ...mployee-that-worked-on-the-longest-task.js | 40 +++++++++++++++++++
 2 files changed, 42 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2432-the-employee-that-worked-on-the-longest-task.js

diff --git a/README.md b/README.md
index d6989e52..43b4a983 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,941 LeetCode solutions in JavaScript
+# 1,942 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1834,6 +1834,7 @@
 2427|[Number of Common Factors](./solutions/2427-number-of-common-factors.js)|Easy|
 2428|[Maximum Sum of an Hourglass](./solutions/2428-maximum-sum-of-an-hourglass.js)|Medium|
 2429|[Minimize XOR](./solutions/2429-minimize-xor.js)|Medium|
+2432|[The Employee That Worked on the Longest Task](./solutions/2432-the-employee-that-worked-on-the-longest-task.js)|Easy|
 2444|[Count Subarrays With Fixed Bounds](./solutions/2444-count-subarrays-with-fixed-bounds.js)|Hard|
 2460|[Apply Operations to an Array](./solutions/2460-apply-operations-to-an-array.js)|Easy|
 2462|[Total Cost to Hire K Workers](./solutions/2462-total-cost-to-hire-k-workers.js)|Medium|
diff --git a/solutions/2432-the-employee-that-worked-on-the-longest-task.js b/solutions/2432-the-employee-that-worked-on-the-longest-task.js
new file mode 100644
index 00000000..acab1a87
--- /dev/null
+++ b/solutions/2432-the-employee-that-worked-on-the-longest-task.js
@@ -0,0 +1,40 @@
+/**
+ * 2432. The Employee That Worked on the Longest Task
+ * https://leetcode.com/problems/the-employee-that-worked-on-the-longest-task/
+ * Difficulty: Easy
+ *
+ * There are n employees, each with a unique id from 0 to n - 1.
+ *
+ * You are given a 2D integer array logs where logs[i] = [idi, leaveTimei] where:
+ * - idi is the id of the employee that worked on the ith task, and
+ * - leaveTimei is the time at which the employee finished the ith task. All the values
+ *   leaveTimei are unique.
+ *
+ * Note that the ith task starts the moment right after the (i - 1)th task ends, and the 0th
+ * task starts at time 0.
+ *
+ * Return the id of the employee that worked the task with the longest time. If there is a tie
+ * between two or more employees, return the smallest id among them.
+ */
+
+/**
+ * @param {number} n
+ * @param {number[][]} logs
+ * @return {number}
+ */
+var hardestWorker = function(n, logs) {
+  let maxDuration = 0;
+  let result = n;
+  let startTime = 0;
+
+  for (const [employeeId, endTime] of logs) {
+    const duration = endTime - startTime;
+    if (duration > maxDuration || (duration === maxDuration && employeeId < result)) {
+      maxDuration = duration;
+      result = employeeId;
+    }
+    startTime = endTime;
+  }
+
+  return result;
+};

From dc7a1f8fc39b05945ae47d83655926e51d3e26e4 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 19:08:50 -0500
Subject: [PATCH 234/571] Add solution #3068

---
 README.md                                     |  3 +-
 ...068-find-the-maximum-sum-of-node-values.js | 52 +++++++++++++++++++
 2 files changed, 54 insertions(+), 1 deletion(-)
 create mode 100644 solutions/3068-find-the-maximum-sum-of-node-values.js

diff --git a/README.md b/README.md
index 43b4a983..80d6f204 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,942 LeetCode solutions in JavaScript
+# 1,943 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1917,6 +1917,7 @@
 3024|[Type of Triangle](./solutions/3024-type-of-triangle.js)|Easy|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
 3066|[Minimum Operations to Exceed Threshold Value II](./solutions/3066-minimum-operations-to-exceed-threshold-value-ii.js)|Medium|
+3068|[Find the Maximum Sum of Node Values](./solutions/3068-find-the-maximum-sum-of-node-values.js)|Hard|
 3105|[Longest Strictly Increasing or Strictly Decreasing Subarray](./solutions/3105-longest-strictly-increasing-or-strictly-decreasing-subarray.js)|Easy|
 3108|[Minimum Cost Walk in Weighted Graph](./solutions/3108-minimum-cost-walk-in-weighted-graph.js)|Hard|
 3110|[Score of a String](./solutions/3110-score-of-a-string.js)|Easy|
diff --git a/solutions/3068-find-the-maximum-sum-of-node-values.js b/solutions/3068-find-the-maximum-sum-of-node-values.js
new file mode 100644
index 00000000..27666217
--- /dev/null
+++ b/solutions/3068-find-the-maximum-sum-of-node-values.js
@@ -0,0 +1,52 @@
+/**
+ * 3068. Find the Maximum Sum of Node Values
+ * https://leetcode.com/problems/find-the-maximum-sum-of-node-values/
+ * Difficulty: Hard
+ *
+ * There exists an undirected tree with n nodes numbered 0 to n - 1. You are given a 0-indexed
+ * 2D integer array edges of length n - 1, where edges[i] = [ui, vi] indicates that there is an
+ * edge between nodes ui and vi in the tree. You are also given a positive integer k, and a
+ * 0-indexed array of non-negative integers nums of length n, where nums[i] represents the
+ * value of the node numbered i.
+ *
+ * Alice wants the sum of values of tree nodes to be maximum, for which Alice can perform the
+ * following operation any number of times (including zero) on the tree:
+ * - Choose any edge [u, v] connecting the nodes u and v, and update their values as follows:
+ *   - nums[u] = nums[u] XOR k
+ *   - nums[v] = nums[v] XOR k
+ *
+ * Return the maximum possible sum of the values Alice can achieve by performing the operation
+ * any number of times.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} k
+ * @param {number[][]} edges
+ * @return {number}
+ */
+var maximumValueSum = function(nums, k, edges) {
+  let totalSum = 0;
+  let minChange = Infinity;
+  let changeCount = 0;
+
+  for (const num of nums) {
+    const xored = num ^ k;
+    const change = xored - num;
+
+    if (change > 0) {
+      totalSum += xored;
+      changeCount++;
+    } else {
+      totalSum += num;
+    }
+
+    minChange = Math.min(minChange, Math.abs(change));
+  }
+
+  if (changeCount % 2 === 0) {
+    return totalSum;
+  }
+
+  return totalSum - minChange;
+};

From ad8e3a88fd964ecbbdb07e1b4be9323a2d409a3a Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 19:10:00 -0500
Subject: [PATCH 235/571] Add solution #2433

---
 README.md                                     |  3 +-
 ...3-find-the-original-array-of-prefix-xor.js | 28 +++++++++++++++++++
 2 files changed, 30 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2433-find-the-original-array-of-prefix-xor.js

diff --git a/README.md b/README.md
index 80d6f204..b1e8a5ae 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,943 LeetCode solutions in JavaScript
+# 1,944 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1835,6 +1835,7 @@
 2428|[Maximum Sum of an Hourglass](./solutions/2428-maximum-sum-of-an-hourglass.js)|Medium|
 2429|[Minimize XOR](./solutions/2429-minimize-xor.js)|Medium|
 2432|[The Employee That Worked on the Longest Task](./solutions/2432-the-employee-that-worked-on-the-longest-task.js)|Easy|
+2433|[Find The Original Array of Prefix Xor](./solutions/2433-find-the-original-array-of-prefix-xor.js)|Medium|
 2444|[Count Subarrays With Fixed Bounds](./solutions/2444-count-subarrays-with-fixed-bounds.js)|Hard|
 2460|[Apply Operations to an Array](./solutions/2460-apply-operations-to-an-array.js)|Easy|
 2462|[Total Cost to Hire K Workers](./solutions/2462-total-cost-to-hire-k-workers.js)|Medium|
diff --git a/solutions/2433-find-the-original-array-of-prefix-xor.js b/solutions/2433-find-the-original-array-of-prefix-xor.js
new file mode 100644
index 00000000..0f41ebeb
--- /dev/null
+++ b/solutions/2433-find-the-original-array-of-prefix-xor.js
@@ -0,0 +1,28 @@
+/**
+ * 2433. Find The Original Array of Prefix Xor
+ * https://leetcode.com/problems/find-the-original-array-of-prefix-xor/
+ * Difficulty: Medium
+ *
+ * You are given an integer array pref of size n. Find and return the array arr of size
+ * n that satisfies:
+ * - pref[i] = arr[0] ^ arr[1] ^ ... ^ arr[i].
+ *
+ * Note that ^ denotes the bitwise-xor operation.
+ *
+ * It can be proven that the answer is unique.
+ */
+
+/**
+ * @param {number[]} pref
+ * @return {number[]}
+ */
+var findArray = function(pref) {
+  const result = new Array(pref.length);
+  result[0] = pref[0];
+
+  for (let i = 1; i < pref.length; i++) {
+    result[i] = pref[i] ^ pref[i - 1];
+  }
+
+  return result;
+};

From d80c0b0d5926c7b59b83c2629f21e9e7cfd95b31 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 19:11:51 -0500
Subject: [PATCH 236/571] Add solution #2434

---
 README.md                                     |  3 +-
 ...t-the-lexicographically-smallest-string.js | 49 +++++++++++++++++++
 2 files changed, 51 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2434-using-a-robot-to-print-the-lexicographically-smallest-string.js

diff --git a/README.md b/README.md
index b1e8a5ae..183c5fe8 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,944 LeetCode solutions in JavaScript
+# 1,945 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1836,6 +1836,7 @@
 2429|[Minimize XOR](./solutions/2429-minimize-xor.js)|Medium|
 2432|[The Employee That Worked on the Longest Task](./solutions/2432-the-employee-that-worked-on-the-longest-task.js)|Easy|
 2433|[Find The Original Array of Prefix Xor](./solutions/2433-find-the-original-array-of-prefix-xor.js)|Medium|
+2434|[Using a Robot to Print the Lexicographically Smallest String](./solutions/2434-using-a-robot-to-print-the-lexicographically-smallest-string.js)|Medium|
 2444|[Count Subarrays With Fixed Bounds](./solutions/2444-count-subarrays-with-fixed-bounds.js)|Hard|
 2460|[Apply Operations to an Array](./solutions/2460-apply-operations-to-an-array.js)|Easy|
 2462|[Total Cost to Hire K Workers](./solutions/2462-total-cost-to-hire-k-workers.js)|Medium|
diff --git a/solutions/2434-using-a-robot-to-print-the-lexicographically-smallest-string.js b/solutions/2434-using-a-robot-to-print-the-lexicographically-smallest-string.js
new file mode 100644
index 00000000..430e0fa6
--- /dev/null
+++ b/solutions/2434-using-a-robot-to-print-the-lexicographically-smallest-string.js
@@ -0,0 +1,49 @@
+/**
+ * 2434. Using a Robot to Print the Lexicographically Smallest String
+ * https://leetcode.com/problems/using-a-robot-to-print-the-lexicographically-smallest-string/
+ * Difficulty: Medium
+ *
+ * You are given a string s and a robot that currently holds an empty string t. Apply one of the
+ * following operations until s and t are both empty:
+ * - Remove the first character of a string s and give it to the robot. The robot will append
+ *   this character to the string t.
+ * - Remove the last character of a string t and give it to the robot. The robot will write
+ *   this character on paper.
+ *
+ * Return the lexicographically smallest string that can be written on the paper.
+ */
+
+/**
+ * @param {string} s
+ * @return {string}
+ */
+var robotWithString = function(s) {
+  const charCount = Array(26).fill(0);
+  for (const char of s) {
+    charCount[char.charCodeAt(0) - 97]++;
+  }
+
+  const stack = [];
+  let minCharIndex = 0;
+  let result = '';
+
+  for (const char of s) {
+    stack.push(char);
+    charCount[char.charCodeAt(0) - 97]--;
+
+    while (minCharIndex < 26 && charCount[minCharIndex] === 0) {
+      minCharIndex++;
+    }
+
+    while (stack.length
+      && (minCharIndex === 26 || stack[stack.length - 1].charCodeAt(0) - 97 <= minCharIndex)) {
+      result += stack.pop();
+    }
+  }
+
+  while (stack.length) {
+    result += stack.pop();
+  }
+
+  return result;
+};

From e433db16b8717733764dd9db0820763ce1a2ff41 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 22:03:24 -0500
Subject: [PATCH 237/571] Add solution #2435

---
 README.md                                     |  3 +-
 ...s-in-matrix-whose-sum-is-divisible-by-k.js | 45 +++++++++++++++++++
 2 files changed, 47 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2435-paths-in-matrix-whose-sum-is-divisible-by-k.js

diff --git a/README.md b/README.md
index 183c5fe8..fc3f3772 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,945 LeetCode solutions in JavaScript
+# 1,946 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1837,6 +1837,7 @@
 2432|[The Employee That Worked on the Longest Task](./solutions/2432-the-employee-that-worked-on-the-longest-task.js)|Easy|
 2433|[Find The Original Array of Prefix Xor](./solutions/2433-find-the-original-array-of-prefix-xor.js)|Medium|
 2434|[Using a Robot to Print the Lexicographically Smallest String](./solutions/2434-using-a-robot-to-print-the-lexicographically-smallest-string.js)|Medium|
+2435|[Paths in Matrix Whose Sum Is Divisible by K](./solutions/2435-paths-in-matrix-whose-sum-is-divisible-by-k.js)|Hard|
 2444|[Count Subarrays With Fixed Bounds](./solutions/2444-count-subarrays-with-fixed-bounds.js)|Hard|
 2460|[Apply Operations to an Array](./solutions/2460-apply-operations-to-an-array.js)|Easy|
 2462|[Total Cost to Hire K Workers](./solutions/2462-total-cost-to-hire-k-workers.js)|Medium|
diff --git a/solutions/2435-paths-in-matrix-whose-sum-is-divisible-by-k.js b/solutions/2435-paths-in-matrix-whose-sum-is-divisible-by-k.js
new file mode 100644
index 00000000..741526c7
--- /dev/null
+++ b/solutions/2435-paths-in-matrix-whose-sum-is-divisible-by-k.js
@@ -0,0 +1,45 @@
+/**
+ * 2435. Paths in Matrix Whose Sum Is Divisible by K
+ * https://leetcode.com/problems/paths-in-matrix-whose-sum-is-divisible-by-k/
+ * Difficulty: Hard
+ *
+ * You are given a 0-indexed m x n integer matrix grid and an integer k. You are currently at
+ * position (0, 0) and you want to reach position (m - 1, n - 1) moving only down or right.
+ *
+ * Return the number of paths where the sum of the elements on the path is divisible by k.
+ * Since the answer may be very large, return it modulo 109 + 7.
+ */
+
+/**
+ * @param {number[][]} grid
+ * @param {number} k
+ * @return {number}
+ */
+var numberOfPaths = function(grid, k) {
+  const rows = grid.length;
+  const cols = grid[0].length;
+  const modulo = 1e9 + 7;
+  const dp = Array.from({ length: rows }, () => {
+    return Array.from({ length: cols }, () => Array(k).fill(0));
+  });
+
+  dp[0][0][grid[0][0] % k] = 1;
+
+  for (let row = 0; row < rows; row++) {
+    for (let col = 0; col < cols; col++) {
+      const currentValue = grid[row][col] % k;
+      for (let sum = 0; sum < k; sum++) {
+        if (row > 0) {
+          const prevSum = (sum - currentValue + k) % k;
+          dp[row][col][sum] = (dp[row][col][sum] + dp[row - 1][col][prevSum]) % modulo;
+        }
+        if (col > 0) {
+          const prevSum = (sum - currentValue + k) % k;
+          dp[row][col][sum] = (dp[row][col][sum] + dp[row][col - 1][prevSum]) % modulo;
+        }
+      }
+    }
+  }
+
+  return dp[rows - 1][cols - 1][0];
+};

From b9c1752d29a80e6033158a2bf785fcf3d8360c55 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 22:05:55 -0500
Subject: [PATCH 238/571] Add solution #2437

---
 README.md                                     |  3 +-
 solutions/2437-number-of-valid-clock-times.js | 42 +++++++++++++++++++
 2 files changed, 44 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2437-number-of-valid-clock-times.js

diff --git a/README.md b/README.md
index fc3f3772..cf618fe1 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,946 LeetCode solutions in JavaScript
+# 1,947 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1838,6 +1838,7 @@
 2433|[Find The Original Array of Prefix Xor](./solutions/2433-find-the-original-array-of-prefix-xor.js)|Medium|
 2434|[Using a Robot to Print the Lexicographically Smallest String](./solutions/2434-using-a-robot-to-print-the-lexicographically-smallest-string.js)|Medium|
 2435|[Paths in Matrix Whose Sum Is Divisible by K](./solutions/2435-paths-in-matrix-whose-sum-is-divisible-by-k.js)|Hard|
+2437|[Number of Valid Clock Times](./solutions/2437-number-of-valid-clock-times.js)|Easy|
 2444|[Count Subarrays With Fixed Bounds](./solutions/2444-count-subarrays-with-fixed-bounds.js)|Hard|
 2460|[Apply Operations to an Array](./solutions/2460-apply-operations-to-an-array.js)|Easy|
 2462|[Total Cost to Hire K Workers](./solutions/2462-total-cost-to-hire-k-workers.js)|Medium|
diff --git a/solutions/2437-number-of-valid-clock-times.js b/solutions/2437-number-of-valid-clock-times.js
new file mode 100644
index 00000000..8b4d26bb
--- /dev/null
+++ b/solutions/2437-number-of-valid-clock-times.js
@@ -0,0 +1,42 @@
+/**
+ * 2437. Number of Valid Clock Times
+ * https://leetcode.com/problems/number-of-valid-clock-times/
+ * Difficulty: Easy
+ *
+ * You are given a string of length 5 called time, representing the current time on a digital
+ * clock in the format "hh:mm". The earliest possible time is "00:00" and the latest possible
+ * time is "23:59".
+ *
+ * In the string time, the digits represented by the ? symbol are unknown, and must be replaced
+ * with a digit from 0 to 9.
+ *
+ * Return an integer answer, the number of valid clock times that can be created by replacing
+ * every ? with a digit from 0 to 9.
+ */
+
+/**
+ * @param {string} time
+ * @return {number}
+ */
+var countTime = function(time) {
+  let hourChoices = 1;
+  let minuteChoices = 1;
+
+  if (time[0] === '?' && time[1] === '?') {
+    hourChoices = 24;
+  } else if (time[0] === '?') {
+    hourChoices = time[1] <= '3' ? 3 : 2;
+  } else if (time[1] === '?') {
+    hourChoices = time[0] === '2' ? 4 : 10;
+  }
+
+  if (time[3] === '?' && time[4] === '?') {
+    minuteChoices = 60;
+  } else if (time[3] === '?') {
+    minuteChoices = 6;
+  } else if (time[4] === '?') {
+    minuteChoices = 10;
+  }
+
+  return hourChoices * minuteChoices;
+};

From 11b057e2ff1b1cea398436abede73dd1cd361c16 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 22:07:04 -0500
Subject: [PATCH 239/571] Add solution #2438

---
 README.md                                     |  3 +-
 .../2438-range-product-queries-of-powers.js   | 45 +++++++++++++++++++
 2 files changed, 47 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2438-range-product-queries-of-powers.js

diff --git a/README.md b/README.md
index cf618fe1..d11dad8b 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,947 LeetCode solutions in JavaScript
+# 1,948 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1839,6 +1839,7 @@
 2434|[Using a Robot to Print the Lexicographically Smallest String](./solutions/2434-using-a-robot-to-print-the-lexicographically-smallest-string.js)|Medium|
 2435|[Paths in Matrix Whose Sum Is Divisible by K](./solutions/2435-paths-in-matrix-whose-sum-is-divisible-by-k.js)|Hard|
 2437|[Number of Valid Clock Times](./solutions/2437-number-of-valid-clock-times.js)|Easy|
+2438|[Range Product Queries of Powers](./solutions/2438-range-product-queries-of-powers.js)|Medium|
 2444|[Count Subarrays With Fixed Bounds](./solutions/2444-count-subarrays-with-fixed-bounds.js)|Hard|
 2460|[Apply Operations to an Array](./solutions/2460-apply-operations-to-an-array.js)|Easy|
 2462|[Total Cost to Hire K Workers](./solutions/2462-total-cost-to-hire-k-workers.js)|Medium|
diff --git a/solutions/2438-range-product-queries-of-powers.js b/solutions/2438-range-product-queries-of-powers.js
new file mode 100644
index 00000000..ebebead8
--- /dev/null
+++ b/solutions/2438-range-product-queries-of-powers.js
@@ -0,0 +1,45 @@
+/**
+ * 2438. Range Product Queries of Powers
+ * https://leetcode.com/problems/range-product-queries-of-powers/
+ * Difficulty: Medium
+ *
+ * Given a positive integer n, there exists a 0-indexed array called powers, composed of the
+ * minimum number of powers of 2 that sum to n. The array is sorted in non-decreasing order,
+ * and there is only one way to form the array.
+ *
+ * You are also given a 0-indexed 2D integer array queries, where queries[i] = [lefti, righti].
+ * Each queries[i] represents a query where you have to find the product of all powers[j] with
+ * lefti <= j <= righti.
+ *
+ * Return an array answers, equal in length to queries, where answers[i] is the answer to the
+ * ith query. Since the answer to the ith query may be too large, each answers[i] should be
+ * returned modulo 109 + 7.
+ */
+
+/**
+ * @param {number} n
+ * @param {number[][]} queries
+ * @return {number[]}
+ */
+var productQueries = function(n, queries) {
+  const modulo = 1e9 + 7;
+  const powers = [];
+  while (n > 0) {
+    const power = Math.floor(Math.log2(n));
+    powers.push(1 << power);
+    n -= 1 << power;
+  }
+  powers.reverse();
+
+  const result = new Array(queries.length);
+  for (let i = 0; i < queries.length; i++) {
+    const [start, end] = queries[i];
+    let product = 1;
+    for (let j = start; j <= end; j++) {
+      product = (product * powers[j]) % modulo;
+    }
+    result[i] = product;
+  }
+
+  return result;
+};

From 770ed7cdebc786ef7a51b25b882673339aa108bd Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 22:08:04 -0500
Subject: [PATCH 240/571] Add solution #2439

---
 README.md                                   |  3 +-
 solutions/2439-minimize-maximum-of-array.js | 53 +++++++++++++++++++++
 2 files changed, 55 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2439-minimize-maximum-of-array.js

diff --git a/README.md b/README.md
index d11dad8b..40a8c7fc 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,948 LeetCode solutions in JavaScript
+# 1,949 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1840,6 +1840,7 @@
 2435|[Paths in Matrix Whose Sum Is Divisible by K](./solutions/2435-paths-in-matrix-whose-sum-is-divisible-by-k.js)|Hard|
 2437|[Number of Valid Clock Times](./solutions/2437-number-of-valid-clock-times.js)|Easy|
 2438|[Range Product Queries of Powers](./solutions/2438-range-product-queries-of-powers.js)|Medium|
+2439|[Minimize Maximum of Array](./solutions/2439-minimize-maximum-of-array.js)|Medium|
 2444|[Count Subarrays With Fixed Bounds](./solutions/2444-count-subarrays-with-fixed-bounds.js)|Hard|
 2460|[Apply Operations to an Array](./solutions/2460-apply-operations-to-an-array.js)|Easy|
 2462|[Total Cost to Hire K Workers](./solutions/2462-total-cost-to-hire-k-workers.js)|Medium|
diff --git a/solutions/2439-minimize-maximum-of-array.js b/solutions/2439-minimize-maximum-of-array.js
new file mode 100644
index 00000000..5d147f37
--- /dev/null
+++ b/solutions/2439-minimize-maximum-of-array.js
@@ -0,0 +1,53 @@
+/**
+ * 2439. Minimize Maximum of Array
+ * https://leetcode.com/problems/minimize-maximum-of-array/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed array nums comprising of n non-negative integers.
+ *
+ * In one operation, you must:
+ * - Choose an integer i such that 1 <= i < n and nums[i] > 0.
+ * - Decrease nums[i] by 1.
+ * - Increase nums[i - 1] by 1.
+ *
+ * Return the minimum possible value of the maximum integer of nums after performing
+ * any number of operations.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var minimizeArrayValue = function(nums) {
+  let left = 0;
+  let right = Math.max(...nums);
+  let result = right;
+
+  while (left <= right) {
+    const mid = Math.floor((left + right) / 2);
+    let carry = 0;
+    let valid = true;
+
+    for (let i = nums.length - 1; i >= 0; i--) {
+      const total = nums[i] + carry;
+      if (total > mid) {
+        if (i === 0) {
+          valid = false;
+          break;
+        }
+        carry = total - mid;
+      } else {
+        carry = 0;
+      }
+    }
+
+    if (valid) {
+      result = mid;
+      right = mid - 1;
+    } else {
+      left = mid + 1;
+    }
+  }
+
+  return result;
+};

From cd8ab2b7487267d2b29136ecb66ca84867c2c9ac Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 22 May 2025 22:09:17 -0500
Subject: [PATCH 241/571] Add solution #2440

---
 README.md                                     |  3 +-
 .../2440-create-components-with-same-value.js | 64 +++++++++++++++++++
 2 files changed, 66 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2440-create-components-with-same-value.js

diff --git a/README.md b/README.md
index 40a8c7fc..e63f8d99 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,949 LeetCode solutions in JavaScript
+# 1,950 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1841,6 +1841,7 @@
 2437|[Number of Valid Clock Times](./solutions/2437-number-of-valid-clock-times.js)|Easy|
 2438|[Range Product Queries of Powers](./solutions/2438-range-product-queries-of-powers.js)|Medium|
 2439|[Minimize Maximum of Array](./solutions/2439-minimize-maximum-of-array.js)|Medium|
+2440|[Create Components With Same Value](./solutions/2440-create-components-with-same-value.js)|Hard|
 2444|[Count Subarrays With Fixed Bounds](./solutions/2444-count-subarrays-with-fixed-bounds.js)|Hard|
 2460|[Apply Operations to an Array](./solutions/2460-apply-operations-to-an-array.js)|Easy|
 2462|[Total Cost to Hire K Workers](./solutions/2462-total-cost-to-hire-k-workers.js)|Medium|
diff --git a/solutions/2440-create-components-with-same-value.js b/solutions/2440-create-components-with-same-value.js
new file mode 100644
index 00000000..d0a6391f
--- /dev/null
+++ b/solutions/2440-create-components-with-same-value.js
@@ -0,0 +1,64 @@
+/**
+ * 2440. Create Components With Same Value
+ * https://leetcode.com/problems/create-components-with-same-value/
+ * Difficulty: Hard
+ *
+ * There is an undirected tree with n nodes labeled from 0 to n - 1.
+ *
+ * You are given a 0-indexed integer array nums of length n where nums[i] represents the value
+ * of the ith node. You are also given a 2D integer array edges of length n - 1 where
+ * edges[i] = [ai, bi] indicates that there is an edge between nodes ai and bi in the tree.
+ *
+ * You are allowed to delete some edges, splitting the tree into multiple connected components.
+ * Let the value of a component be the sum of all nums[i] for which node i is in the component.
+ *
+ * Return the maximum number of edges you can delete, such that every connected component in
+ * the tree has the same value.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number[][]} edges
+ * @return {number}
+ */
+var componentValue = function(nums, edges) {
+  const n = nums.length;
+  const graph = Array.from({ length: n }, () => []);
+  const totalSum = nums.reduce((sum, val) => sum + val, 0);
+
+  for (const [u, v] of edges) {
+    graph[u].push(v);
+    graph[v].push(u);
+  }
+
+  for (let i = n; i >= 1; i--) {
+    if (totalSum % i === 0) {
+      const target = totalSum / i;
+      const [, components] = countNodes(0, -1, target);
+      if (components === i) {
+        return i - 1;
+      }
+    }
+  }
+
+  return 0;
+
+  function countNodes(node, parent, target) {
+    let sum = nums[node];
+    let components = 0;
+
+    for (const neighbor of graph[node]) {
+      if (neighbor !== parent) {
+        const [childSum, childComponents] = countNodes(neighbor, node, target);
+        sum += childSum;
+        components += childComponents;
+      }
+    }
+
+    if (sum === target) {
+      return [0, components + 1];
+    }
+
+    return [sum, components];
+  }
+};

From ab77bf6f0472c42f8f0446dbddf60d8f3371fef6 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 00:18:43 -0500
Subject: [PATCH 242/571] Add solution #2441

---
 README.md                                     |  3 +-
 ...e-integer-that-exists-with-its-negative.js | 28 +++++++++++++++++++
 2 files changed, 30 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2441-largest-positive-integer-that-exists-with-its-negative.js

diff --git a/README.md b/README.md
index e63f8d99..c2030a16 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,950 LeetCode solutions in JavaScript
+# 1,951 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1842,6 +1842,7 @@
 2438|[Range Product Queries of Powers](./solutions/2438-range-product-queries-of-powers.js)|Medium|
 2439|[Minimize Maximum of Array](./solutions/2439-minimize-maximum-of-array.js)|Medium|
 2440|[Create Components With Same Value](./solutions/2440-create-components-with-same-value.js)|Hard|
+2441|[Largest Positive Integer That Exists With Its Negative](./solutions/2441-largest-positive-integer-that-exists-with-its-negative.js)|Easy|
 2444|[Count Subarrays With Fixed Bounds](./solutions/2444-count-subarrays-with-fixed-bounds.js)|Hard|
 2460|[Apply Operations to an Array](./solutions/2460-apply-operations-to-an-array.js)|Easy|
 2462|[Total Cost to Hire K Workers](./solutions/2462-total-cost-to-hire-k-workers.js)|Medium|
diff --git a/solutions/2441-largest-positive-integer-that-exists-with-its-negative.js b/solutions/2441-largest-positive-integer-that-exists-with-its-negative.js
new file mode 100644
index 00000000..e80f0ac9
--- /dev/null
+++ b/solutions/2441-largest-positive-integer-that-exists-with-its-negative.js
@@ -0,0 +1,28 @@
+/**
+ * 2441. Largest Positive Integer That Exists With Its Negative
+ * https://leetcode.com/problems/largest-positive-integer-that-exists-with-its-negative/
+ * Difficulty: Easy
+ *
+ * Given an integer array nums that does not contain any zeros, find the largest positive
+ * integer k such that -k also exists in the array.
+ *
+ * Return the positive integer k. If there is no such integer, return -1.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var findMaxK = function(nums) {
+  const set = new Set();
+  let result = -1;
+
+  for (const num of nums) {
+    if (set.has(-num)) {
+      result = Math.max(result, Math.abs(num));
+    }
+    set.add(num);
+  }
+
+  return result;
+};

From 27c675b4f6df1f17ef893c069e5a5e903287cddc Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 00:19:42 -0500
Subject: [PATCH 243/571] Add solution #2442

---
 README.md                                     |  3 +-
 ...tinct-integers-after-reverse-operations.js | 32 +++++++++++++++++++
 2 files changed, 34 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2442-count-number-of-distinct-integers-after-reverse-operations.js

diff --git a/README.md b/README.md
index c2030a16..ec4a6e14 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,951 LeetCode solutions in JavaScript
+# 1,952 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1843,6 +1843,7 @@
 2439|[Minimize Maximum of Array](./solutions/2439-minimize-maximum-of-array.js)|Medium|
 2440|[Create Components With Same Value](./solutions/2440-create-components-with-same-value.js)|Hard|
 2441|[Largest Positive Integer That Exists With Its Negative](./solutions/2441-largest-positive-integer-that-exists-with-its-negative.js)|Easy|
+2442|[Count Number of Distinct Integers After Reverse Operations](./solutions/2442-count-number-of-distinct-integers-after-reverse-operations.js)|Medium|
 2444|[Count Subarrays With Fixed Bounds](./solutions/2444-count-subarrays-with-fixed-bounds.js)|Hard|
 2460|[Apply Operations to an Array](./solutions/2460-apply-operations-to-an-array.js)|Easy|
 2462|[Total Cost to Hire K Workers](./solutions/2462-total-cost-to-hire-k-workers.js)|Medium|
diff --git a/solutions/2442-count-number-of-distinct-integers-after-reverse-operations.js b/solutions/2442-count-number-of-distinct-integers-after-reverse-operations.js
new file mode 100644
index 00000000..d1cc0abd
--- /dev/null
+++ b/solutions/2442-count-number-of-distinct-integers-after-reverse-operations.js
@@ -0,0 +1,32 @@
+/**
+ * 2442. Count Number of Distinct Integers After Reverse Operations
+ * https://leetcode.com/problems/count-number-of-distinct-integers-after-reverse-operations/
+ * Difficulty: Medium
+ *
+ * You are given an array nums consisting of positive integers.
+ *
+ * You have to take each integer in the array, reverse its digits, and add it to the end of the
+ * array. You should apply this operation to the original integers in nums.
+ *
+ * Return the number of distinct integers in the final array.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var countDistinctIntegers = function(nums) {
+  const set = new Set(nums);
+
+  for (const num of nums) {
+    let reversed = 0;
+    let temp = num;
+    while (temp > 0) {
+      reversed = reversed * 10 + temp % 10;
+      temp = Math.floor(temp / 10);
+    }
+    set.add(reversed);
+  }
+
+  return set.size;
+};

From 9b1871da67230c419e06254637200dc7b65b09b5 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 00:20:57 -0500
Subject: [PATCH 244/571] Add solution #2443

---
 README.md                                     |  3 +-
 .../2443-sum-of-number-and-its-reverse.js     | 28 +++++++++++++++++++
 2 files changed, 30 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2443-sum-of-number-and-its-reverse.js

diff --git a/README.md b/README.md
index ec4a6e14..31544f21 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,952 LeetCode solutions in JavaScript
+# 1,953 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1844,6 +1844,7 @@
 2440|[Create Components With Same Value](./solutions/2440-create-components-with-same-value.js)|Hard|
 2441|[Largest Positive Integer That Exists With Its Negative](./solutions/2441-largest-positive-integer-that-exists-with-its-negative.js)|Easy|
 2442|[Count Number of Distinct Integers After Reverse Operations](./solutions/2442-count-number-of-distinct-integers-after-reverse-operations.js)|Medium|
+2443|[Sum of Number and Its Reverse](./solutions/2443-sum-of-number-and-its-reverse.js)|Medium|
 2444|[Count Subarrays With Fixed Bounds](./solutions/2444-count-subarrays-with-fixed-bounds.js)|Hard|
 2460|[Apply Operations to an Array](./solutions/2460-apply-operations-to-an-array.js)|Easy|
 2462|[Total Cost to Hire K Workers](./solutions/2462-total-cost-to-hire-k-workers.js)|Medium|
diff --git a/solutions/2443-sum-of-number-and-its-reverse.js b/solutions/2443-sum-of-number-and-its-reverse.js
new file mode 100644
index 00000000..7e17944a
--- /dev/null
+++ b/solutions/2443-sum-of-number-and-its-reverse.js
@@ -0,0 +1,28 @@
+/**
+ * 2443. Sum of Number and Its Reverse
+ * https://leetcode.com/problems/sum-of-number-and-its-reverse/
+ * Difficulty: Medium
+ *
+ * Given a non-negative integer num, return true if num can be expressed as the sum of any
+ * non-negative integer and its reverse, or false otherwise.
+ */
+
+/**
+ * @param {number} num
+ * @return {boolean}
+ */
+var sumOfNumberAndReverse = function(num) {
+  for (let i = 0; i <= num; i++) {
+    let reversed = 0;
+    let temp = i;
+    while (temp > 0) {
+      reversed = reversed * 10 + temp % 10;
+      temp = Math.floor(temp / 10);
+    }
+    if (i + reversed === num) {
+      return true;
+    }
+  }
+
+  return false;
+};

From 25cf456fbee5377395e8137372192b4215c17492 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 00:21:59 -0500
Subject: [PATCH 245/571] Add solution #2446

---
 README.md                                     |  3 +-
 ...6-determine-if-two-events-have-conflict.js | 28 +++++++++++++++++++
 2 files changed, 30 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2446-determine-if-two-events-have-conflict.js

diff --git a/README.md b/README.md
index 31544f21..9f7aa368 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,953 LeetCode solutions in JavaScript
+# 1,954 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1846,6 +1846,7 @@
 2442|[Count Number of Distinct Integers After Reverse Operations](./solutions/2442-count-number-of-distinct-integers-after-reverse-operations.js)|Medium|
 2443|[Sum of Number and Its Reverse](./solutions/2443-sum-of-number-and-its-reverse.js)|Medium|
 2444|[Count Subarrays With Fixed Bounds](./solutions/2444-count-subarrays-with-fixed-bounds.js)|Hard|
+2446|[Determine if Two Events Have Conflict](./solutions/2446-determine-if-two-events-have-conflict.js)|Easy|
 2460|[Apply Operations to an Array](./solutions/2460-apply-operations-to-an-array.js)|Easy|
 2462|[Total Cost to Hire K Workers](./solutions/2462-total-cost-to-hire-k-workers.js)|Medium|
 2467|[Most Profitable Path in a Tree](./solutions/2467-most-profitable-path-in-a-tree.js)|Medium|
diff --git a/solutions/2446-determine-if-two-events-have-conflict.js b/solutions/2446-determine-if-two-events-have-conflict.js
new file mode 100644
index 00000000..3a70a834
--- /dev/null
+++ b/solutions/2446-determine-if-two-events-have-conflict.js
@@ -0,0 +1,28 @@
+/**
+ * 2446. Determine if Two Events Have Conflict
+ * https://leetcode.com/problems/determine-if-two-events-have-conflict/
+ * Difficulty: Easy
+ *
+ * You are given two arrays of strings that represent two inclusive events that happened on the
+ * same day, event1 and event2, where:
+ * - event1 = [startTime1, endTime1] and
+ * - event2 = [startTime2, endTime2].
+ *
+ * Event times are valid 24 hours format in the form of HH:MM.
+ *
+ * A conflict happens when two events have some non-empty intersection (i.e., some moment is common
+ * to both events).
+ *
+ * Return true if there is a conflict between two events. Otherwise, return false.
+ */
+
+/**
+ * @param {string[]} event1
+ * @param {string[]} event2
+ * @return {boolean}
+ */
+var haveConflict = function(event1, event2) {
+  const [start1, end1] = event1;
+  const [start2, end2] = event2;
+  return start1 <= end2 && start2 <= end1;
+};

From 0d50f5939d46ba5dde51878f5937ea07dcd7639a Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 00:23:08 -0500
Subject: [PATCH 246/571] Add solution #2447

---
 README.md                                     |  3 +-
 ...number-of-subarrays-with-gcd-equal-to-k.js | 41 +++++++++++++++++++
 2 files changed, 43 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2447-number-of-subarrays-with-gcd-equal-to-k.js

diff --git a/README.md b/README.md
index 9f7aa368..13a53b4e 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,954 LeetCode solutions in JavaScript
+# 1,955 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1847,6 +1847,7 @@
 2443|[Sum of Number and Its Reverse](./solutions/2443-sum-of-number-and-its-reverse.js)|Medium|
 2444|[Count Subarrays With Fixed Bounds](./solutions/2444-count-subarrays-with-fixed-bounds.js)|Hard|
 2446|[Determine if Two Events Have Conflict](./solutions/2446-determine-if-two-events-have-conflict.js)|Easy|
+2447|[Number of Subarrays With GCD Equal to K](./solutions/2447-number-of-subarrays-with-gcd-equal-to-k.js)|Medium|
 2460|[Apply Operations to an Array](./solutions/2460-apply-operations-to-an-array.js)|Easy|
 2462|[Total Cost to Hire K Workers](./solutions/2462-total-cost-to-hire-k-workers.js)|Medium|
 2467|[Most Profitable Path in a Tree](./solutions/2467-most-profitable-path-in-a-tree.js)|Medium|
diff --git a/solutions/2447-number-of-subarrays-with-gcd-equal-to-k.js b/solutions/2447-number-of-subarrays-with-gcd-equal-to-k.js
new file mode 100644
index 00000000..efc4339c
--- /dev/null
+++ b/solutions/2447-number-of-subarrays-with-gcd-equal-to-k.js
@@ -0,0 +1,41 @@
+/**
+ * 2447. Number of Subarrays With GCD Equal to K
+ * https://leetcode.com/problems/number-of-subarrays-with-gcd-equal-to-k/
+ * Difficulty: Medium
+ *
+ * Given an integer array nums and an integer k, return the number of subarrays of nums where
+ * the greatest common divisor of the subarray's elements is k.
+ *
+ * A subarray is a contiguous non-empty sequence of elements within an array.
+ *
+ * The greatest common divisor of an array is the largest integer that evenly divides all the
+ * array elements.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} k
+ * @return {number}
+ */
+var subarrayGCD = function(nums, k) {
+  let result = 0;
+  for (let start = 0; start < nums.length; start++) {
+    let currentGCD = nums[start];
+    for (let end = start; end < nums.length; end++) {
+      currentGCD = gcd(currentGCD, nums[end]);
+      if (currentGCD === k) {
+        result++;
+      }
+    }
+  }
+
+  return result;
+
+  function gcd(a, b) {
+    while (b) {
+      a %= b;
+      [a, b] = [b, a];
+    }
+    return a;
+  }
+};

From 90acab560a1f75f46fe5f2df072757a153d9f7df Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 00:24:32 -0500
Subject: [PATCH 247/571] Add solution #2448

---
 README.md                                     |  3 +-
 .../2448-minimum-cost-to-make-array-equal.js  | 45 +++++++++++++++++++
 2 files changed, 47 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2448-minimum-cost-to-make-array-equal.js

diff --git a/README.md b/README.md
index 13a53b4e..defa0dd6 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,955 LeetCode solutions in JavaScript
+# 1,956 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1848,6 +1848,7 @@
 2444|[Count Subarrays With Fixed Bounds](./solutions/2444-count-subarrays-with-fixed-bounds.js)|Hard|
 2446|[Determine if Two Events Have Conflict](./solutions/2446-determine-if-two-events-have-conflict.js)|Easy|
 2447|[Number of Subarrays With GCD Equal to K](./solutions/2447-number-of-subarrays-with-gcd-equal-to-k.js)|Medium|
+2448|[Minimum Cost to Make Array Equal](./solutions/2448-minimum-cost-to-make-array-equal.js)|Hard|
 2460|[Apply Operations to an Array](./solutions/2460-apply-operations-to-an-array.js)|Easy|
 2462|[Total Cost to Hire K Workers](./solutions/2462-total-cost-to-hire-k-workers.js)|Medium|
 2467|[Most Profitable Path in a Tree](./solutions/2467-most-profitable-path-in-a-tree.js)|Medium|
diff --git a/solutions/2448-minimum-cost-to-make-array-equal.js b/solutions/2448-minimum-cost-to-make-array-equal.js
new file mode 100644
index 00000000..1bf9d6fd
--- /dev/null
+++ b/solutions/2448-minimum-cost-to-make-array-equal.js
@@ -0,0 +1,45 @@
+/**
+ * 2448. Minimum Cost to Make Array Equal
+ * https://leetcode.com/problems/minimum-cost-to-make-array-equal/
+ * Difficulty: Hard
+ *
+ * You are given two 0-indexed arrays nums and cost consisting each of n positive integers.
+ *
+ * You can do the following operation any number of times:
+ * - Increase or decrease any element of the array nums by 1.
+ *
+ * The cost of doing one operation on the ith element is cost[i].
+ *
+ * Return the minimum total cost such that all the elements of the array nums become equal.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number[]} cost
+ * @return {number}
+ */
+var minCost = function(nums, cost) {
+  const pairs = nums.map((num, i) => [num, cost[i]]).sort((a, b) => a[0] - b[0]);
+  const n = nums.length;
+  const prefixSum = Array(n).fill(0);
+  const prefixCost = Array(n).fill(0);
+
+  prefixSum[0] = pairs[0][0] * pairs[0][1];
+  prefixCost[0] = pairs[0][1];
+
+  for (let i = 1; i < n; i++) {
+    prefixSum[i] = prefixSum[i - 1] + pairs[i][0] * pairs[i][1];
+    prefixCost[i] = prefixCost[i - 1] + pairs[i][1];
+  }
+
+  let result = Infinity;
+  for (let i = 0; i < n; i++) {
+    const target = pairs[i][0];
+    const leftCost = i > 0 ? target * prefixCost[i - 1] - prefixSum[i - 1] : 0;
+    const rightCost = i < n - 1 ? prefixSum[n - 1] - prefixSum[i]
+      - target * (prefixCost[n - 1] - prefixCost[i]) : 0;
+    result = Math.min(result, leftCost + rightCost);
+  }
+
+  return result;
+};

From 868a948d1cee184a72c211aab0e5f3de51802b71 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 00:28:46 -0500
Subject: [PATCH 248/571] Add solution #2449

---
 README.md                                     |  3 +-
 ...er-of-operations-to-make-arrays-similar.js | 44 +++++++++++++++++++
 2 files changed, 46 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2449-minimum-number-of-operations-to-make-arrays-similar.js

diff --git a/README.md b/README.md
index defa0dd6..3b2952a9 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,956 LeetCode solutions in JavaScript
+# 1,957 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1849,6 +1849,7 @@
 2446|[Determine if Two Events Have Conflict](./solutions/2446-determine-if-two-events-have-conflict.js)|Easy|
 2447|[Number of Subarrays With GCD Equal to K](./solutions/2447-number-of-subarrays-with-gcd-equal-to-k.js)|Medium|
 2448|[Minimum Cost to Make Array Equal](./solutions/2448-minimum-cost-to-make-array-equal.js)|Hard|
+2449|[Minimum Number of Operations to Make Arrays Similar](./solutions/2449-minimum-number-of-operations-to-make-arrays-similar.js)|Hard|
 2460|[Apply Operations to an Array](./solutions/2460-apply-operations-to-an-array.js)|Easy|
 2462|[Total Cost to Hire K Workers](./solutions/2462-total-cost-to-hire-k-workers.js)|Medium|
 2467|[Most Profitable Path in a Tree](./solutions/2467-most-profitable-path-in-a-tree.js)|Medium|
diff --git a/solutions/2449-minimum-number-of-operations-to-make-arrays-similar.js b/solutions/2449-minimum-number-of-operations-to-make-arrays-similar.js
new file mode 100644
index 00000000..29c2cacf
--- /dev/null
+++ b/solutions/2449-minimum-number-of-operations-to-make-arrays-similar.js
@@ -0,0 +1,44 @@
+/**
+ * 2449. Minimum Number of Operations to Make Arrays Similar
+ * https://leetcode.com/problems/minimum-number-of-operations-to-make-arrays-similar/
+ * Difficulty: Hard
+ *
+ * You are given two positive integer arrays nums and target, of the same length.
+ *
+ * In one operation, you can choose any two distinct indices i and j where 0 <= i,
+ * j < nums.length and:
+ * - set nums[i] = nums[i] + 2 and
+ * - set nums[j] = nums[j] - 2.
+ *
+ * Two arrays are considered to be similar if the frequency of each element is the same.
+ *
+ * Return the minimum number of operations required to make nums similar to target. The
+ * test cases are generated such that nums can always be similar to target.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number[]} target
+ * @return {number}
+ */
+var makeSimilar = function(nums, target) {
+  const evenNums = nums.filter(num => num % 2 === 0).sort((a, b) => a - b);
+  const oddNums = nums.filter(num => num % 2 === 1).sort((a, b) => a - b);
+  const evenTarget = target.filter(num => num % 2 === 0).sort((a, b) => a - b);
+  const oddTarget = target.filter(num => num % 2 === 1).sort((a, b) => a - b);
+
+  let result = 0;
+  for (let i = 0; i < evenNums.length; i++) {
+    if (evenNums[i] > evenTarget[i]) {
+      result += (evenNums[i] - evenTarget[i]) / 2;
+    }
+  }
+
+  for (let i = 0; i < oddNums.length; i++) {
+    if (oddNums[i] > oddTarget[i]) {
+      result += (oddNums[i] - oddTarget[i]) / 2;
+    }
+  }
+
+  return result;
+};

From 500c5fd929257612ba720ebcbd7a5c3905d05ff2 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 00:30:29 -0500
Subject: [PATCH 249/571] Add solution #2451

---
 README.md                               |  3 +-
 solutions/2451-odd-string-difference.js | 53 +++++++++++++++++++++++++
 2 files changed, 55 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2451-odd-string-difference.js

diff --git a/README.md b/README.md
index 3b2952a9..c5f530b2 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,957 LeetCode solutions in JavaScript
+# 1,958 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1850,6 +1850,7 @@
 2447|[Number of Subarrays With GCD Equal to K](./solutions/2447-number-of-subarrays-with-gcd-equal-to-k.js)|Medium|
 2448|[Minimum Cost to Make Array Equal](./solutions/2448-minimum-cost-to-make-array-equal.js)|Hard|
 2449|[Minimum Number of Operations to Make Arrays Similar](./solutions/2449-minimum-number-of-operations-to-make-arrays-similar.js)|Hard|
+2451|[Odd String Difference](./solutions/2451-odd-string-difference.js)|Easy|
 2460|[Apply Operations to an Array](./solutions/2460-apply-operations-to-an-array.js)|Easy|
 2462|[Total Cost to Hire K Workers](./solutions/2462-total-cost-to-hire-k-workers.js)|Medium|
 2467|[Most Profitable Path in a Tree](./solutions/2467-most-profitable-path-in-a-tree.js)|Medium|
diff --git a/solutions/2451-odd-string-difference.js b/solutions/2451-odd-string-difference.js
new file mode 100644
index 00000000..8556415c
--- /dev/null
+++ b/solutions/2451-odd-string-difference.js
@@ -0,0 +1,53 @@
+/**
+ * 2451. Odd String Difference
+ * https://leetcode.com/problems/odd-string-difference/
+ * Difficulty: Easy
+ *
+ * You are given an array of equal-length strings words. Assume that the length of each
+ * string is n.
+ *
+ * Each string words[i] can be converted into a difference integer array difference[i] of
+ * length n - 1 where difference[i][j] = words[i][j+1] - words[i][j] where 0 <= j <= n - 2.
+ * Note that the difference between two letters is the difference between their positions in
+ * the alphabet i.e. the position of 'a' is 0, 'b' is 1, and 'z' is 25.
+ * - For example, for the string "acb", the difference integer array is [2 - 0, 1 - 2] = [2, -1].
+ *
+ * All the strings in words have the same difference integer array, except one. You should find
+ * that string.
+ *
+ * Return the string in words that has different difference integer array.
+ */
+
+/**
+ * @param {string[]} words
+ * @return {string}
+ */
+var oddString = function(words) {
+  const map = new Map();
+  for (const word of words) {
+    const diff = getDiff(word);
+    map.set(diff, (map.get(diff) || 0) + 1);
+  }
+
+  let oddDiff;
+  for (const [diff, count] of map) {
+    if (count === 1) {
+      oddDiff = diff;
+      break;
+    }
+  }
+
+  for (const word of words) {
+    if (getDiff(word) === oddDiff) {
+      return word;
+    }
+  }
+
+  function getDiff(word) {
+    const diff = [];
+    for (let i = 1; i < word.length; i++) {
+      diff.push(word.charCodeAt(i) - word.charCodeAt(i - 1));
+    }
+    return diff.join(',');
+  }
+};

From 72983738e6d848745bf5a9107e6a3627d40f26af Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 00:31:26 -0500
Subject: [PATCH 250/571] Add solution #2452

---
 README.md                                     |  3 +-
 ...52-words-within-two-edits-of-dictionary.js | 41 +++++++++++++++++++
 2 files changed, 43 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2452-words-within-two-edits-of-dictionary.js

diff --git a/README.md b/README.md
index c5f530b2..ff56b66b 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,958 LeetCode solutions in JavaScript
+# 1,959 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1851,6 +1851,7 @@
 2448|[Minimum Cost to Make Array Equal](./solutions/2448-minimum-cost-to-make-array-equal.js)|Hard|
 2449|[Minimum Number of Operations to Make Arrays Similar](./solutions/2449-minimum-number-of-operations-to-make-arrays-similar.js)|Hard|
 2451|[Odd String Difference](./solutions/2451-odd-string-difference.js)|Easy|
+2452|[Words Within Two Edits of Dictionary](./solutions/2452-words-within-two-edits-of-dictionary.js)|Medium|
 2460|[Apply Operations to an Array](./solutions/2460-apply-operations-to-an-array.js)|Easy|
 2462|[Total Cost to Hire K Workers](./solutions/2462-total-cost-to-hire-k-workers.js)|Medium|
 2467|[Most Profitable Path in a Tree](./solutions/2467-most-profitable-path-in-a-tree.js)|Medium|
diff --git a/solutions/2452-words-within-two-edits-of-dictionary.js b/solutions/2452-words-within-two-edits-of-dictionary.js
new file mode 100644
index 00000000..237dac21
--- /dev/null
+++ b/solutions/2452-words-within-two-edits-of-dictionary.js
@@ -0,0 +1,41 @@
+/**
+ * 2452. Words Within Two Edits of Dictionary
+ * https://leetcode.com/problems/words-within-two-edits-of-dictionary/
+ * Difficulty: Medium
+ *
+ * You are given two string arrays, queries and dictionary. All words in each array comprise of
+ * lowercase English letters and have the same length.
+ *
+ * In one edit you can take a word from queries, and change any letter in it to any other letter.
+ * Find all words from queries that, after a maximum of two edits, equal some word from dictionary.
+ *
+ * Return a list of all words from queries, that match with some word from dictionary after a
+ * maximum of two edits. Return the words in the same order they appear in queries.
+ */
+
+/**
+ * @param {string[]} queries
+ * @param {string[]} dictionary
+ * @return {string[]}
+ */
+var twoEditWords = function(queries, dictionary) {
+  const result = [];
+
+  for (const query of queries) {
+    for (const word of dictionary) {
+      let edits = 0;
+      for (let i = 0; i < query.length; i++) {
+        if (query[i] !== word[i]) {
+          edits++;
+          if (edits > 2) break;
+        }
+      }
+      if (edits <= 2) {
+        result.push(query);
+        break;
+      }
+    }
+  }
+
+  return result;
+};

From 510a5650673479b89d4d80c90d00799a9f7fa21f Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 00:32:38 -0500
Subject: [PATCH 251/571] Add solution #2453

---
 README.md                                    |  3 +-
 solutions/2453-destroy-sequential-targets.js | 40 ++++++++++++++++++++
 2 files changed, 42 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2453-destroy-sequential-targets.js

diff --git a/README.md b/README.md
index ff56b66b..d647a56a 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,959 LeetCode solutions in JavaScript
+# 1,960 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1852,6 +1852,7 @@
 2449|[Minimum Number of Operations to Make Arrays Similar](./solutions/2449-minimum-number-of-operations-to-make-arrays-similar.js)|Hard|
 2451|[Odd String Difference](./solutions/2451-odd-string-difference.js)|Easy|
 2452|[Words Within Two Edits of Dictionary](./solutions/2452-words-within-two-edits-of-dictionary.js)|Medium|
+2453|[Destroy Sequential Targets](./solutions/2453-destroy-sequential-targets.js)|Medium|
 2460|[Apply Operations to an Array](./solutions/2460-apply-operations-to-an-array.js)|Easy|
 2462|[Total Cost to Hire K Workers](./solutions/2462-total-cost-to-hire-k-workers.js)|Medium|
 2467|[Most Profitable Path in a Tree](./solutions/2467-most-profitable-path-in-a-tree.js)|Medium|
diff --git a/solutions/2453-destroy-sequential-targets.js b/solutions/2453-destroy-sequential-targets.js
new file mode 100644
index 00000000..d1c9f856
--- /dev/null
+++ b/solutions/2453-destroy-sequential-targets.js
@@ -0,0 +1,40 @@
+/**
+ * 2453. Destroy Sequential Targets
+ * https://leetcode.com/problems/destroy-sequential-targets/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed array nums consisting of positive integers, representing targets
+ * on a number line. You are also given an integer space.
+ *
+ * You have a machine which can destroy targets. Seeding the machine with some nums[i] allows
+ * it to destroy all targets with values that can be represented as nums[i] + c * space, where
+ * c is any non-negative integer. You want to destroy the maximum number of targets in nums.
+ *
+ * Return the minimum value of nums[i] you can seed the machine with to destroy the maximum
+ * number of targets.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} space
+ * @return {number}
+ */
+var destroyTargets = function(nums, space) {
+  const map = new Map();
+  let maxCount = 0;
+
+  for (const num of nums) {
+    const remainder = num % space;
+    map.set(remainder, (map.get(remainder) || 0) + 1);
+    maxCount = Math.max(maxCount, map.get(remainder));
+  }
+
+  let result = Infinity;
+  for (const num of nums) {
+    if (map.get(num % space) === maxCount) {
+      result = Math.min(result, num);
+    }
+  }
+
+  return result;
+};

From 04330081667c5066f6c8fc09160e8c742e851d57 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 09:53:47 -0500
Subject: [PATCH 252/571] Add solution #2455

---
 README.md                                     |  3 +-
 ...ven-numbers-that-are-divisible-by-three.js | 29 +++++++++++++++++++
 2 files changed, 31 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2455-average-value-of-even-numbers-that-are-divisible-by-three.js

diff --git a/README.md b/README.md
index d647a56a..1ff3b80d 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,960 LeetCode solutions in JavaScript
+# 1,961 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1853,6 +1853,7 @@
 2451|[Odd String Difference](./solutions/2451-odd-string-difference.js)|Easy|
 2452|[Words Within Two Edits of Dictionary](./solutions/2452-words-within-two-edits-of-dictionary.js)|Medium|
 2453|[Destroy Sequential Targets](./solutions/2453-destroy-sequential-targets.js)|Medium|
+2455|[Average Value of Even Numbers That Are Divisible by Three](./solutions/2455-average-value-of-even-numbers-that-are-divisible-by-three.js)|Easy|
 2460|[Apply Operations to an Array](./solutions/2460-apply-operations-to-an-array.js)|Easy|
 2462|[Total Cost to Hire K Workers](./solutions/2462-total-cost-to-hire-k-workers.js)|Medium|
 2467|[Most Profitable Path in a Tree](./solutions/2467-most-profitable-path-in-a-tree.js)|Medium|
diff --git a/solutions/2455-average-value-of-even-numbers-that-are-divisible-by-three.js b/solutions/2455-average-value-of-even-numbers-that-are-divisible-by-three.js
new file mode 100644
index 00000000..e793e8fe
--- /dev/null
+++ b/solutions/2455-average-value-of-even-numbers-that-are-divisible-by-three.js
@@ -0,0 +1,29 @@
+/**
+ * 2455. Average Value of Even Numbers That Are Divisible by Three
+ * https://leetcode.com/problems/average-value-of-even-numbers-that-are-divisible-by-three/
+ * Difficulty: Easy
+ *
+ * Given an integer array nums of positive integers, return the average value of all even integers
+ * that are divisible by 3.
+ *
+ * Note that the average of n elements is the sum of the n elements divided by n and rounded down
+ * to the nearest integer.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var averageValue = function(nums) {
+  let sum = 0;
+  let count = 0;
+
+  for (const num of nums) {
+    if (num % 2 === 0 && num % 3 === 0) {
+      sum += num;
+      count++;
+    }
+  }
+
+  return count > 0 ? Math.floor(sum / count) : 0;
+};

From 6c997d4778eeb7fb58adf989e318cf82aaa04a47 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 09:56:18 -0500
Subject: [PATCH 253/571] Add solution #2458

---
 README.md                                     |  3 +-
 ...nary-tree-after-subtree-removal-queries.js | 68 +++++++++++++++++++
 2 files changed, 70 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2458-height-of-binary-tree-after-subtree-removal-queries.js

diff --git a/README.md b/README.md
index 1ff3b80d..64a2f07a 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,961 LeetCode solutions in JavaScript
+# 1,962 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1854,6 +1854,7 @@
 2452|[Words Within Two Edits of Dictionary](./solutions/2452-words-within-two-edits-of-dictionary.js)|Medium|
 2453|[Destroy Sequential Targets](./solutions/2453-destroy-sequential-targets.js)|Medium|
 2455|[Average Value of Even Numbers That Are Divisible by Three](./solutions/2455-average-value-of-even-numbers-that-are-divisible-by-three.js)|Easy|
+2458|[Height of Binary Tree After Subtree Removal Queries](./solutions/2458-height-of-binary-tree-after-subtree-removal-queries.js)|Hard|
 2460|[Apply Operations to an Array](./solutions/2460-apply-operations-to-an-array.js)|Easy|
 2462|[Total Cost to Hire K Workers](./solutions/2462-total-cost-to-hire-k-workers.js)|Medium|
 2467|[Most Profitable Path in a Tree](./solutions/2467-most-profitable-path-in-a-tree.js)|Medium|
diff --git a/solutions/2458-height-of-binary-tree-after-subtree-removal-queries.js b/solutions/2458-height-of-binary-tree-after-subtree-removal-queries.js
new file mode 100644
index 00000000..418ee0ff
--- /dev/null
+++ b/solutions/2458-height-of-binary-tree-after-subtree-removal-queries.js
@@ -0,0 +1,68 @@
+/**
+ * 2458. Height of Binary Tree After Subtree Removal Queries
+ * https://leetcode.com/problems/height-of-binary-tree-after-subtree-removal-queries/
+ * Difficulty: Hard
+ *
+ * You are given the root of a binary tree with n nodes. Each node is assigned a unique value
+ * from 1 to n. You are also given an array queries of size m.
+ *
+ * You have to perform m independent queries on the tree where in the ith query you do the
+ * following:
+ * - Remove the subtree rooted at the node with the value queries[i] from the tree. It is
+ *   guaranteed that queries[i] will not be equal to the value of the root.
+ *
+ * Return an array answer of size m where answer[i] is the height of the tree after performing
+ * the ith query.
+ *
+ * Note:
+ * - The queries are independent, so the tree returns to its initial state after each query.
+ * - The height of a tree is the number of edges in the longest simple path from the root to
+ *   some node in the tree.
+ */
+
+/**
+ * Definition for a binary tree node.
+ * function TreeNode(val, left, right) {
+ *     this.val = (val===undefined ? 0 : val)
+ *     this.left = (left===undefined ? null : left)
+ *     this.right = (right===undefined ? null : right)
+ * }
+ */
+/**
+ * @param {TreeNode} root
+ * @param {number[]} queries
+ * @return {number[]}
+ */
+var treeQueries = function(root, queries) {
+  const heights = new Map();
+  const maxHeightWithout = new Map();
+
+  computeHeight(root);
+  computeMaxHeight(root, 0, -1);
+
+  const result = new Array(queries.length);
+  for (let i = 0; i < queries.length; i++) {
+    result[i] = maxHeightWithout.get(queries[i]);
+  }
+
+  return result;
+
+  function computeHeight(node) {
+    if (!node) return -1;
+    const leftHeight = computeHeight(node.left);
+    const rightHeight = computeHeight(node.right);
+    heights.set(node.val, Math.max(leftHeight, rightHeight) + 1);
+    return heights.get(node.val);
+  }
+
+  function computeMaxHeight(node, depth, cousinHeight) {
+    if (!node) return;
+    const leftHeight = node.left ? heights.get(node.left.val) : -1;
+    const rightHeight = node.right ? heights.get(node.right.val) : -1;
+    const maxAlternative = Math.max(cousinHeight, depth - 1);
+    maxHeightWithout.set(node.val, maxAlternative);
+
+    computeMaxHeight(node.left, depth + 1, Math.max(cousinHeight, rightHeight + depth + 1));
+    computeMaxHeight(node.right, depth + 1, Math.max(cousinHeight, leftHeight + depth + 1));
+  }
+};

From fbed85a0fa57961fce2292e72f6a72974a76d6df Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 09:57:24 -0500
Subject: [PATCH 254/571] Add solution #2461

---
 README.md                                     |  3 +-
 ...sum-of-distinct-subarrays-with-length-k.js | 45 +++++++++++++++++++
 2 files changed, 47 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2461-maximum-sum-of-distinct-subarrays-with-length-k.js

diff --git a/README.md b/README.md
index 64a2f07a..5614d09c 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,962 LeetCode solutions in JavaScript
+# 1,963 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1856,6 +1856,7 @@
 2455|[Average Value of Even Numbers That Are Divisible by Three](./solutions/2455-average-value-of-even-numbers-that-are-divisible-by-three.js)|Easy|
 2458|[Height of Binary Tree After Subtree Removal Queries](./solutions/2458-height-of-binary-tree-after-subtree-removal-queries.js)|Hard|
 2460|[Apply Operations to an Array](./solutions/2460-apply-operations-to-an-array.js)|Easy|
+2461|[Maximum Sum of Distinct Subarrays With Length K](./solutions/2461-maximum-sum-of-distinct-subarrays-with-length-k.js)|Medium|
 2462|[Total Cost to Hire K Workers](./solutions/2462-total-cost-to-hire-k-workers.js)|Medium|
 2467|[Most Profitable Path in a Tree](./solutions/2467-most-profitable-path-in-a-tree.js)|Medium|
 2469|[Convert the Temperature](./solutions/2469-convert-the-temperature.js)|Easy|
diff --git a/solutions/2461-maximum-sum-of-distinct-subarrays-with-length-k.js b/solutions/2461-maximum-sum-of-distinct-subarrays-with-length-k.js
new file mode 100644
index 00000000..a1212952
--- /dev/null
+++ b/solutions/2461-maximum-sum-of-distinct-subarrays-with-length-k.js
@@ -0,0 +1,45 @@
+/**
+ * 2461. Maximum Sum of Distinct Subarrays With Length K
+ * https://leetcode.com/problems/maximum-sum-of-distinct-subarrays-with-length-k/
+ * Difficulty: Medium
+ *
+ * You are given an integer array nums and an integer k. Find the maximum subarray sum of all the
+ * subarrays of nums that meet the following conditions:
+ * - The length of the subarray is k, and
+ * - All the elements of the subarray are distinct.
+ *
+ * Return the maximum subarray sum of all the subarrays that meet the conditions. If no subarray
+ * meets the conditions, return 0.
+ *
+ * A subarray is a contiguous non-empty sequence of elements within an array.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} k
+ * @return {number}
+ */
+var maximumSubarraySum = function(nums, k) {
+  let result = 0;
+  const seen = new Map();
+  let windowSum = 0;
+
+  for (let i = 0; i < nums.length; i++) {
+    seen.set(nums[i], (seen.get(nums[i]) || 0) + 1);
+    windowSum += nums[i];
+
+    if (i >= k - 1) {
+      if (seen.size === k) {
+        result = Math.max(result, windowSum);
+      }
+      const leftNum = nums[i - k + 1];
+      windowSum -= leftNum;
+      seen.set(leftNum, seen.get(leftNum) - 1);
+      if (seen.get(leftNum) === 0) {
+        seen.delete(leftNum);
+      }
+    }
+  }
+
+  return result;
+};

From 2f21fdd8abfb3020a0676a3adfe55eac799f24c2 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 10:52:28 -0500
Subject: [PATCH 255/571] Add solution #2463

---
 README.md                                     |  3 +-
 .../2463-minimum-total-distance-traveled.js   | 71 +++++++++++++++++++
 2 files changed, 73 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2463-minimum-total-distance-traveled.js

diff --git a/README.md b/README.md
index 5614d09c..f7d97698 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,963 LeetCode solutions in JavaScript
+# 1,964 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1858,6 +1858,7 @@
 2460|[Apply Operations to an Array](./solutions/2460-apply-operations-to-an-array.js)|Easy|
 2461|[Maximum Sum of Distinct Subarrays With Length K](./solutions/2461-maximum-sum-of-distinct-subarrays-with-length-k.js)|Medium|
 2462|[Total Cost to Hire K Workers](./solutions/2462-total-cost-to-hire-k-workers.js)|Medium|
+2463|[Minimum Total Distance Traveled](./solutions/2463-minimum-total-distance-traveled.js)|Hard|
 2467|[Most Profitable Path in a Tree](./solutions/2467-most-profitable-path-in-a-tree.js)|Medium|
 2469|[Convert the Temperature](./solutions/2469-convert-the-temperature.js)|Easy|
 2482|[Difference Between Ones and Zeros in Row and Column](./solutions/2482-difference-between-ones-and-zeros-in-row-and-column.js)|Medium|
diff --git a/solutions/2463-minimum-total-distance-traveled.js b/solutions/2463-minimum-total-distance-traveled.js
new file mode 100644
index 00000000..cb71bbc0
--- /dev/null
+++ b/solutions/2463-minimum-total-distance-traveled.js
@@ -0,0 +1,71 @@
+/**
+ * 2463. Minimum Total Distance Traveled
+ * https://leetcode.com/problems/minimum-total-distance-traveled/
+ * Difficulty: Hard
+ *
+ * There are some robots and factories on the X-axis. You are given an integer array robot where
+ * robot[i] is the position of the ith robot. You are also given a 2D integer array factory where
+ * factory[j] = [positionj, limitj] indicates that positionj is the position of the jth factory
+ * and that the jth factory can repair at most limitj robots.
+ *
+ * The positions of each robot are unique. The positions of each factory are also unique. Note
+ * that a robot can be in the same position as a factory initially.
+ *
+ * All the robots are initially broken; they keep moving in one direction. The direction could be
+ * the negative or the positive direction of the X-axis. When a robot reaches a factory that did
+ * not reach its limit, the factory repairs the robot, and it stops moving.
+ *
+ * At any moment, you can set the initial direction of moving for some robot. Your target is to
+ * minimize the total distance traveled by all the robots.
+ *
+ * Return the minimum total distance traveled by all the robots. The test cases are generated
+ * such that all the robots can be repaired.
+ *
+ * Note that:
+ * - All robots move at the same speed.
+ * - If two robots move in the same direction, they will never collide.
+ * - If two robots move in opposite directions and they meet at some point, they do not collide.
+ *   They cross each other.
+ * - If a robot passes by a factory that reached its limits, it crosses it as if it does not exist.
+ * - If the robot moved from a position x to a position y, the distance it moved is |y - x|.
+ */
+
+/**
+ * @param {number[]} robot
+ * @param {number[][]} factory
+ * @return {number}
+ */
+var minimumTotalDistance = function(robot, factory) {
+  robot.sort((a, b) => a - b);
+  factory.sort((a, b) => a[0] - b[0]);
+
+  const robotCount = robot.length;
+  const factoryCount = factory.length;
+  const memo = new Array(robotCount + 1).fill(null).map(() => new Array(factoryCount + 1).fill(-1));
+
+  return calculateMinDistance(0, 0);
+
+  function calculateMinDistance(robotIndex, factoryIndex) {
+    if (robotIndex === robotCount) return 0;
+    if (factoryIndex === factoryCount) return 1e18;
+
+    if (memo[robotIndex][factoryIndex] !== -1) {
+      return memo[robotIndex][factoryIndex];
+    }
+
+    let result = calculateMinDistance(robotIndex, factoryIndex + 1);
+
+    let totalDistance = 0;
+    for (let robotsTaken = 0; robotsTaken < factory[factoryIndex][1]
+         && robotIndex + robotsTaken < robotCount; robotsTaken++) {
+      totalDistance += Math.abs(robot[robotIndex + robotsTaken] - factory[factoryIndex][0]);
+      result = Math.min(
+        result,
+        totalDistance + calculateMinDistance(robotIndex + robotsTaken + 1, factoryIndex + 1)
+      );
+    }
+
+    memo[robotIndex][factoryIndex] = result;
+    return result;
+  }
+};

From 8e036a2ef91402c6a85d1b0ba903d9eb078748cd Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 10:53:39 -0500
Subject: [PATCH 256/571] Add solution #2465

---
 README.md                                     |  3 +-
 solutions/2465-number-of-distinct-averages.js | 34 +++++++++++++++++++
 2 files changed, 36 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2465-number-of-distinct-averages.js

diff --git a/README.md b/README.md
index f7d97698..1631b276 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,964 LeetCode solutions in JavaScript
+# 1,965 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1859,6 +1859,7 @@
 2461|[Maximum Sum of Distinct Subarrays With Length K](./solutions/2461-maximum-sum-of-distinct-subarrays-with-length-k.js)|Medium|
 2462|[Total Cost to Hire K Workers](./solutions/2462-total-cost-to-hire-k-workers.js)|Medium|
 2463|[Minimum Total Distance Traveled](./solutions/2463-minimum-total-distance-traveled.js)|Hard|
+2465|[Number of Distinct Averages](./solutions/2465-number-of-distinct-averages.js)|Easy|
 2467|[Most Profitable Path in a Tree](./solutions/2467-most-profitable-path-in-a-tree.js)|Medium|
 2469|[Convert the Temperature](./solutions/2469-convert-the-temperature.js)|Easy|
 2482|[Difference Between Ones and Zeros in Row and Column](./solutions/2482-difference-between-ones-and-zeros-in-row-and-column.js)|Medium|
diff --git a/solutions/2465-number-of-distinct-averages.js b/solutions/2465-number-of-distinct-averages.js
new file mode 100644
index 00000000..768feffd
--- /dev/null
+++ b/solutions/2465-number-of-distinct-averages.js
@@ -0,0 +1,34 @@
+/**
+ * 2465. Number of Distinct Averages
+ * https://leetcode.com/problems/number-of-distinct-averages/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed integer array nums of even length.
+ *
+ * As long as nums is not empty, you must repetitively:
+ * - Find the minimum number in nums and remove it.
+ * - Find the maximum number in nums and remove it.
+ * - Calculate the average of the two removed numbers.
+ *
+ * The average of two numbers a and b is (a + b) / 2.
+ * - For example, the average of 2 and 3 is (2 + 3) / 2 = 2.5.
+ *
+ * Return the number of distinct averages calculated using the above process.
+ *
+ * Note that when there is a tie for a minimum or maximum number, any can be removed.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var distinctAverages = function(nums) {
+  nums.sort((a, b) => a - b);
+  const averages = new Set();
+
+  for (let i = 0, j = nums.length - 1; i < j; i++, j--) {
+    averages.add((nums[i] + nums[j]) / 2);
+  }
+
+  return averages.size;
+};

From a486fcc0212910f344d1f61b23b20c98bcdbdb09 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 19:23:14 -0500
Subject: [PATCH 257/571] Add solution #2942

---
 README.md                                     |  3 +-
 .../2942-find-words-containing-character.js   | 28 +++++++++++++++++++
 2 files changed, 30 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2942-find-words-containing-character.js

diff --git a/README.md b/README.md
index 1631b276..d2d0fbc1 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,965 LeetCode solutions in JavaScript
+# 1,966 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1932,6 +1932,7 @@
 2900|[Longest Unequal Adjacent Groups Subsequence I](./solutions/2900-longest-unequal-adjacent-groups-subsequence-i.js)|Easy|
 2901|[Longest Unequal Adjacent Groups Subsequence II](./solutions/2901-longest-unequal-adjacent-groups-subsequence-ii.js)|Medium|
 2918|[Minimum Equal Sum of Two Arrays After Replacing Zeros](./solutions/2918-minimum-equal-sum-of-two-arrays-after-replacing-zeros.js)|Medium|
+2942|[Find Words Containing Character](./solutions/2942-find-words-containing-character.js)|Easy|
 2948|[Make Lexicographically Smallest Array by Swapping Elements](./solutions/2948-make-lexicographically-smallest-array-by-swapping-elements.js)|Medium|
 2962|[Count Subarrays Where Max Element Appears at Least K Times](./solutions/2962-count-subarrays-where-max-element-appears-at-least-k-times.js)|Medium|
 2965|[Find Missing and Repeated Values](./solutions/2965-find-missing-and-repeated-values.js)|Easy|
diff --git a/solutions/2942-find-words-containing-character.js b/solutions/2942-find-words-containing-character.js
new file mode 100644
index 00000000..9fadea6b
--- /dev/null
+++ b/solutions/2942-find-words-containing-character.js
@@ -0,0 +1,28 @@
+/**
+ * 2942. Find Words Containing Character
+ * https://leetcode.com/problems/find-words-containing-character/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed array of strings words and a character x.
+ *
+ * Return an array of indices representing the words that contain the character x.
+ *
+ * Note that the returned array may be in any order.
+ */
+
+/**
+ * @param {string[]} words
+ * @param {character} x
+ * @return {number[]}
+ */
+var findWordsContaining = function(words, x) {
+  const result = [];
+
+  for (let i = 0; i < words.length; i++) {
+    if (words[i].includes(x)) {
+      result.push(i);
+    }
+  }
+
+  return result;
+};

From cde99b20edad28516305c3d1ceb3159f04466afb Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 19:24:46 -0500
Subject: [PATCH 258/571] Add solution #2466

---
 README.md                                     |  3 +-
 .../2466-count-ways-to-build-good-strings.js  | 47 +++++++++++++++++++
 2 files changed, 49 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2466-count-ways-to-build-good-strings.js

diff --git a/README.md b/README.md
index d2d0fbc1..e72e4c92 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,966 LeetCode solutions in JavaScript
+# 1,967 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1860,6 +1860,7 @@
 2462|[Total Cost to Hire K Workers](./solutions/2462-total-cost-to-hire-k-workers.js)|Medium|
 2463|[Minimum Total Distance Traveled](./solutions/2463-minimum-total-distance-traveled.js)|Hard|
 2465|[Number of Distinct Averages](./solutions/2465-number-of-distinct-averages.js)|Easy|
+2466|[Count Ways To Build Good Strings](./solutions/2466-count-ways-to-build-good-strings.js)|Medium|
 2467|[Most Profitable Path in a Tree](./solutions/2467-most-profitable-path-in-a-tree.js)|Medium|
 2469|[Convert the Temperature](./solutions/2469-convert-the-temperature.js)|Easy|
 2482|[Difference Between Ones and Zeros in Row and Column](./solutions/2482-difference-between-ones-and-zeros-in-row-and-column.js)|Medium|
diff --git a/solutions/2466-count-ways-to-build-good-strings.js b/solutions/2466-count-ways-to-build-good-strings.js
new file mode 100644
index 00000000..5bea8af2
--- /dev/null
+++ b/solutions/2466-count-ways-to-build-good-strings.js
@@ -0,0 +1,47 @@
+/**
+ * 2466. Count Ways To Build Good Strings
+ * https://leetcode.com/problems/count-ways-to-build-good-strings/
+ * Difficulty: Medium
+ *
+ * Given the integers zero, one, low, and high, we can construct a string by starting with an
+ * empty string, and then at each step perform either of the following:
+ * - Append the character '0' zero times.
+ * - Append the character '1' one times.
+ *
+ * This can be performed any number of times.
+ *
+ * A good string is a string constructed by the above process having a length between low and
+ * high (inclusive).
+ *
+ * Return the number of different good strings that can be constructed satisfying these properties.
+ * Since the answer can be large, return it modulo 109 + 7.
+ */
+
+/**
+ * @param {number} low
+ * @param {number} high
+ * @param {number} zero
+ * @param {number} one
+ * @return {number}
+ */
+var countGoodStrings = function(low, high, zero, one) {
+  const modulo = 1e9 + 7;
+  const dp = new Array(high + 1).fill(0);
+  dp[0] = 1;
+
+  for (let length = 1; length <= high; length++) {
+    if (length >= zero) {
+      dp[length] = (dp[length] + dp[length - zero]) % modulo;
+    }
+    if (length >= one) {
+      dp[length] = (dp[length] + dp[length - one]) % modulo;
+    }
+  }
+
+  let result = 0;
+  for (let length = low; length <= high; length++) {
+    result = (result + dp[length]) % modulo;
+  }
+
+  return result;
+};

From f965dc0b5bf2c60409b262aa90e5d3168fdef6e6 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 19:38:43 -0500
Subject: [PATCH 259/571] Add solution #2468

---
 README.md                                     |  3 +-
 .../2468-split-message-based-on-limit.js      | 52 +++++++++++++++++++
 2 files changed, 54 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2468-split-message-based-on-limit.js

diff --git a/README.md b/README.md
index e72e4c92..437de0d8 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,967 LeetCode solutions in JavaScript
+# 1,968 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1862,6 +1862,7 @@
 2465|[Number of Distinct Averages](./solutions/2465-number-of-distinct-averages.js)|Easy|
 2466|[Count Ways To Build Good Strings](./solutions/2466-count-ways-to-build-good-strings.js)|Medium|
 2467|[Most Profitable Path in a Tree](./solutions/2467-most-profitable-path-in-a-tree.js)|Medium|
+2468|[Split Message Based on Limit](./solutions/2468-split-message-based-on-limit.js)|Hard|
 2469|[Convert the Temperature](./solutions/2469-convert-the-temperature.js)|Easy|
 2482|[Difference Between Ones and Zeros in Row and Column](./solutions/2482-difference-between-ones-and-zeros-in-row-and-column.js)|Medium|
 2490|[Circular Sentence](./solutions/2490-circular-sentence.js)|Easy|
diff --git a/solutions/2468-split-message-based-on-limit.js b/solutions/2468-split-message-based-on-limit.js
new file mode 100644
index 00000000..71fc5d00
--- /dev/null
+++ b/solutions/2468-split-message-based-on-limit.js
@@ -0,0 +1,52 @@
+/**
+ * 2468. Split Message Based on Limit
+ * https://leetcode.com/problems/split-message-based-on-limit/
+ * Difficulty: Hard
+ *
+ * You are given a string, message, and a positive integer, limit.
+ *
+ * You must split message into one or more parts based on limit. Each resulting part should have
+ * the suffix "", where "b" is to be replaced with the total number of parts and "a" is to
+ * be replaced with the index of the part, starting from 1 and going up to b. Additionally, the
+ * length of each resulting part (including its suffix) should be equal to limit, except for the
+ * last part whose length can be at most limit.
+ *
+ * The resulting parts should be formed such that when their suffixes are removed and they are
+ * all concatenated in order, they should be equal to message. Also, the result should contain
+ * as few parts as possible.
+ *
+ * Return the parts message would be split into as an array of strings. If it is impossible to
+ * split message as required, return an empty array.
+ */
+
+/**
+ * @param {string} message
+ * @param {number} limit
+ * @return {string[]}
+ */
+var splitMessage = function(message, limit) {
+  const n = message.length;
+  let digitSum = 0;
+
+  for (let parts = 1; parts <= n; parts++) {
+    digitSum += String(parts).length;
+    const indexLength = String(parts).length * parts;
+    const formatLength = 3 * parts;
+
+    if (limit * parts - (digitSum + indexLength + formatLength) >= n) {
+      const result = [];
+      let index = 0;
+
+      for (let i = 1; i <= parts; i++) {
+        const suffix = `<${i}/${parts}>`;
+        const chars = limit - suffix.length;
+        result.push(message.slice(index, index + chars) + suffix);
+        index += chars;
+      }
+
+      return result;
+    }
+  }
+
+  return [];
+};

From 0f27dc353ccd1a65926d57a393bcfecfb15d1154 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 19:39:46 -0500
Subject: [PATCH 260/571] Add solution #2471

---
 README.md                                     |  3 +-
 ...erations-to-sort-a-binary-tree-by-level.js | 66 +++++++++++++++++++
 2 files changed, 68 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2471-minimum-number-of-operations-to-sort-a-binary-tree-by-level.js

diff --git a/README.md b/README.md
index 437de0d8..97598acd 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,968 LeetCode solutions in JavaScript
+# 1,969 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1864,6 +1864,7 @@
 2467|[Most Profitable Path in a Tree](./solutions/2467-most-profitable-path-in-a-tree.js)|Medium|
 2468|[Split Message Based on Limit](./solutions/2468-split-message-based-on-limit.js)|Hard|
 2469|[Convert the Temperature](./solutions/2469-convert-the-temperature.js)|Easy|
+2471|[Minimum Number of Operations to Sort a Binary Tree by Level](./solutions/2471-minimum-number-of-operations-to-sort-a-binary-tree-by-level.js)|Medium|
 2482|[Difference Between Ones and Zeros in Row and Column](./solutions/2482-difference-between-ones-and-zeros-in-row-and-column.js)|Medium|
 2490|[Circular Sentence](./solutions/2490-circular-sentence.js)|Easy|
 2493|[Divide Nodes Into the Maximum Number of Groups](./solutions/2493-divide-nodes-into-the-maximum-number-of-groups.js)|Hard|
diff --git a/solutions/2471-minimum-number-of-operations-to-sort-a-binary-tree-by-level.js b/solutions/2471-minimum-number-of-operations-to-sort-a-binary-tree-by-level.js
new file mode 100644
index 00000000..7d26a4c1
--- /dev/null
+++ b/solutions/2471-minimum-number-of-operations-to-sort-a-binary-tree-by-level.js
@@ -0,0 +1,66 @@
+/**
+ * 2471. Minimum Number of Operations to Sort a Binary Tree by Level
+ * https://leetcode.com/problems/minimum-number-of-operations-to-sort-a-binary-tree-by-level/
+ * Difficulty: Medium
+ *
+ * You are given the root of a binary tree with unique values.
+ *
+ * In one operation, you can choose any two nodes at the same level and swap their values.
+ *
+ * Return the minimum number of operations needed to make the values at each level sorted in a
+ * strictly increasing order.
+ *
+ * The level of a node is the number of edges along the path between it and the root node.
+ */
+
+/**
+ * Definition for a binary tree node.
+ * function TreeNode(val, left, right) {
+ *     this.val = (val===undefined ? 0 : val)
+ *     this.left = (left===undefined ? null : left)
+ *     this.right = (right===undefined ? null : right)
+ * }
+ */
+/**
+ * @param {TreeNode} root
+ * @return {number}
+ */
+var minimumOperations = function(root) {
+  let result = 0;
+  const queue = [root];
+  const levelValues = [];
+
+  while (queue.length) {
+    const levelSize = queue.length;
+    const values = [];
+
+    for (let i = 0; i < levelSize; i++) {
+      const node = queue.shift();
+      values.push(node.val);
+      if (node.left) queue.push(node.left);
+      if (node.right) queue.push(node.right);
+    }
+
+    levelValues.push(values);
+  }
+
+  for (const values of levelValues) {
+    const sorted = [...values].sort((a, b) => a - b);
+    const indexMap = new Map(values.map((val, i) => [val, i]));
+    let swaps = 0;
+
+    for (let i = 0; i < values.length; i++) {
+      if (values[i] !== sorted[i]) {
+        const targetIndex = indexMap.get(sorted[i]);
+        [values[i], values[targetIndex]] = [values[targetIndex], values[i]];
+        indexMap.set(values[targetIndex], targetIndex);
+        indexMap.set(values[i], i);
+        swaps++;
+      }
+    }
+
+    result += swaps;
+  }
+
+  return result;
+};

From c2cb1f07d328f2fb7a18ed82a34183268f37235c Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 19:44:06 -0500
Subject: [PATCH 261/571] Add solution #2472

---
 README.md                                     |  3 +-
 ...f-non-overlapping-palindrome-substrings.js | 51 +++++++++++++++++++
 2 files changed, 53 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2472-maximum-number-of-non-overlapping-palindrome-substrings.js

diff --git a/README.md b/README.md
index 97598acd..31adc273 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,969 LeetCode solutions in JavaScript
+# 1,970 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1865,6 +1865,7 @@
 2468|[Split Message Based on Limit](./solutions/2468-split-message-based-on-limit.js)|Hard|
 2469|[Convert the Temperature](./solutions/2469-convert-the-temperature.js)|Easy|
 2471|[Minimum Number of Operations to Sort a Binary Tree by Level](./solutions/2471-minimum-number-of-operations-to-sort-a-binary-tree-by-level.js)|Medium|
+2472|[Maximum Number of Non-overlapping Palindrome Substrings](./solutions/2472-maximum-number-of-non-overlapping-palindrome-substrings.js)|Hard|
 2482|[Difference Between Ones and Zeros in Row and Column](./solutions/2482-difference-between-ones-and-zeros-in-row-and-column.js)|Medium|
 2490|[Circular Sentence](./solutions/2490-circular-sentence.js)|Easy|
 2493|[Divide Nodes Into the Maximum Number of Groups](./solutions/2493-divide-nodes-into-the-maximum-number-of-groups.js)|Hard|
diff --git a/solutions/2472-maximum-number-of-non-overlapping-palindrome-substrings.js b/solutions/2472-maximum-number-of-non-overlapping-palindrome-substrings.js
new file mode 100644
index 00000000..6244a364
--- /dev/null
+++ b/solutions/2472-maximum-number-of-non-overlapping-palindrome-substrings.js
@@ -0,0 +1,51 @@
+/**
+ * 2472. Maximum Number of Non-overlapping Palindrome Substrings
+ * https://leetcode.com/problems/maximum-number-of-non-overlapping-palindrome-substrings/
+ * Difficulty: Hard
+ *
+ * You are given a string s and a positive integer k.
+ *
+ * Select a set of non-overlapping substrings from the string s that satisfy the following
+ * conditions:
+ * - The length of each substring is at least k.
+ * - Each substring is a palindrome.
+ *
+ * Return the maximum number of substrings in an optimal selection.
+ *
+ * A substring is a contiguous sequence of characters within a string.
+ */
+
+/**
+ * @param {string} s
+ * @param {number} k
+ * @return {number}
+ */
+var maxPalindromes = function(s, k) {
+  const n = s.length;
+  const isPal = new Array(n).fill().map(() => new Array(n).fill(false));
+  const dp = new Array(n + 1).fill(0);
+
+  for (let len = 1; len <= n; len++) {
+    for (let start = 0; start + len <= n; start++) {
+      const end = start + len - 1;
+      if (len === 1) {
+        isPal[start][end] = true;
+      } else if (len === 2) {
+        isPal[start][end] = s[start] === s[end];
+      } else {
+        isPal[start][end] = s[start] === s[end] && isPal[start + 1][end - 1];
+      }
+    }
+  }
+
+  for (let end = k; end <= n; end++) {
+    dp[end] = dp[end - 1];
+    for (let start = end - k; start >= 0; start--) {
+      if (isPal[start][end - 1]) {
+        dp[end] = Math.max(dp[end], dp[start] + 1);
+      }
+    }
+  }
+
+  return dp[n];
+};

From ca02c837210d876f3f2b820e1470df46b7a2888b Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 19:49:26 -0500
Subject: [PATCH 262/571] Add solution #2475

---
 README.md                                     |  3 +-
 ...475-number-of-unequal-triplets-in-array.js | 36 +++++++++++++++++++
 2 files changed, 38 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2475-number-of-unequal-triplets-in-array.js

diff --git a/README.md b/README.md
index 31adc273..bfca4a5b 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,970 LeetCode solutions in JavaScript
+# 1,971 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1866,6 +1866,7 @@
 2469|[Convert the Temperature](./solutions/2469-convert-the-temperature.js)|Easy|
 2471|[Minimum Number of Operations to Sort a Binary Tree by Level](./solutions/2471-minimum-number-of-operations-to-sort-a-binary-tree-by-level.js)|Medium|
 2472|[Maximum Number of Non-overlapping Palindrome Substrings](./solutions/2472-maximum-number-of-non-overlapping-palindrome-substrings.js)|Hard|
+2475|[Number of Unequal Triplets in Array](./solutions/2475-number-of-unequal-triplets-in-array.js)|Easy|
 2482|[Difference Between Ones and Zeros in Row and Column](./solutions/2482-difference-between-ones-and-zeros-in-row-and-column.js)|Medium|
 2490|[Circular Sentence](./solutions/2490-circular-sentence.js)|Easy|
 2493|[Divide Nodes Into the Maximum Number of Groups](./solutions/2493-divide-nodes-into-the-maximum-number-of-groups.js)|Hard|
diff --git a/solutions/2475-number-of-unequal-triplets-in-array.js b/solutions/2475-number-of-unequal-triplets-in-array.js
new file mode 100644
index 00000000..8717363b
--- /dev/null
+++ b/solutions/2475-number-of-unequal-triplets-in-array.js
@@ -0,0 +1,36 @@
+/**
+ * 2475. Number of Unequal Triplets in Array
+ * https://leetcode.com/problems/number-of-unequal-triplets-in-array/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed array of positive integers nums. Find the number of
+ * triplets (i, j, k) that meet the following conditions:
+ * - 0 <= i < j < k < nums.length
+ * - nums[i], nums[j], and nums[k] are pairwise distinct.
+ *   - In other words, nums[i] != nums[j], nums[i] != nums[k], and nums[j] != nums[k].
+ *
+ * Return the number of triplets that meet the conditions.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var unequalTriplets = function(nums) {
+  const map = new Map();
+  for (const num of nums) {
+    map.set(num, (map.get(num) || 0) + 1);
+  }
+
+  let result = 0;
+  let left = 0;
+  const total = nums.length;
+
+  for (const count of map.values()) {
+    const right = total - count - left;
+    result += left * count * right;
+    left += count;
+  }
+
+  return result;
+};

From 62689a51e932a23e28290597181d2d2f86318306 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 19:50:39 -0500
Subject: [PATCH 263/571] Add solution #2476

---
 README.md                                     |  3 +-
 ...t-nodes-queries-in-a-binary-search-tree.js | 67 +++++++++++++++++++
 2 files changed, 69 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2476-closest-nodes-queries-in-a-binary-search-tree.js

diff --git a/README.md b/README.md
index bfca4a5b..ccdb7740 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,971 LeetCode solutions in JavaScript
+# 1,972 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1867,6 +1867,7 @@
 2471|[Minimum Number of Operations to Sort a Binary Tree by Level](./solutions/2471-minimum-number-of-operations-to-sort-a-binary-tree-by-level.js)|Medium|
 2472|[Maximum Number of Non-overlapping Palindrome Substrings](./solutions/2472-maximum-number-of-non-overlapping-palindrome-substrings.js)|Hard|
 2475|[Number of Unequal Triplets in Array](./solutions/2475-number-of-unequal-triplets-in-array.js)|Easy|
+2476|[Closest Nodes Queries in a Binary Search Tree](./solutions/2476-closest-nodes-queries-in-a-binary-search-tree.js)|Medium|
 2482|[Difference Between Ones and Zeros in Row and Column](./solutions/2482-difference-between-ones-and-zeros-in-row-and-column.js)|Medium|
 2490|[Circular Sentence](./solutions/2490-circular-sentence.js)|Easy|
 2493|[Divide Nodes Into the Maximum Number of Groups](./solutions/2493-divide-nodes-into-the-maximum-number-of-groups.js)|Hard|
diff --git a/solutions/2476-closest-nodes-queries-in-a-binary-search-tree.js b/solutions/2476-closest-nodes-queries-in-a-binary-search-tree.js
new file mode 100644
index 00000000..8f9a487a
--- /dev/null
+++ b/solutions/2476-closest-nodes-queries-in-a-binary-search-tree.js
@@ -0,0 +1,67 @@
+/**
+ * 2476. Closest Nodes Queries in a Binary Search Tree
+ * https://leetcode.com/problems/closest-nodes-queries-in-a-binary-search-tree/
+ * Difficulty: Medium
+ *
+ * You are given the root of a binary search tree and an array queries of size n consisting of
+ * positive integers.
+ *
+ * Find a 2D array answer of size n where answer[i] = [mini, maxi]:
+ * - mini is the largest value in the tree that is smaller than or equal to queries[i]. If a such
+ *   value does not exist, add -1 instead.
+ * - maxi is the smallest value in the tree that is greater than or equal to queries[i]. If a such
+ *   value does not exist, add -1 instead.
+ *
+ * Return the array answer.
+ */
+
+/**
+ * Definition for a binary tree node.
+ * function TreeNode(val, left, right) {
+ *     this.val = (val===undefined ? 0 : val)
+ *     this.left = (left===undefined ? null : left)
+ *     this.right = (right===undefined ? null : right)
+ * }
+ */
+/**
+ * @param {TreeNode} root
+ * @param {number[]} queries
+ * @return {number[][]}
+ */
+var closestNodes = function(root, queries) {
+  const values = [];
+
+  inorder(root);
+
+  const result = queries.map(query => {
+    let minVal = -1;
+    let maxVal = -1;
+
+    let left = 0;
+    let right = values.length - 1;
+
+    while (left <= right) {
+      const mid = Math.floor((left + right) / 2);
+      if (values[mid] === query) {
+        return [query, query];
+      } else if (values[mid] < query) {
+        minVal = values[mid];
+        left = mid + 1;
+      } else {
+        maxVal = values[mid];
+        right = mid - 1;
+      }
+    }
+
+    return [minVal, maxVal];
+  });
+
+  return result;
+
+  function inorder(node) {
+    if (!node) return;
+    inorder(node.left);
+    values.push(node.val);
+    inorder(node.right);
+  }
+};

From bfae659e56a1fc68170ee58ad98c1d36a1ef4382 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 19:52:04 -0500
Subject: [PATCH 264/571] Add solution #2477

---
 README.md                                     |  3 +-
 ...imum-fuel-cost-to-report-to-the-capital.js | 51 +++++++++++++++++++
 2 files changed, 53 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2477-minimum-fuel-cost-to-report-to-the-capital.js

diff --git a/README.md b/README.md
index ccdb7740..29dbb008 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,972 LeetCode solutions in JavaScript
+# 1,973 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1868,6 +1868,7 @@
 2472|[Maximum Number of Non-overlapping Palindrome Substrings](./solutions/2472-maximum-number-of-non-overlapping-palindrome-substrings.js)|Hard|
 2475|[Number of Unequal Triplets in Array](./solutions/2475-number-of-unequal-triplets-in-array.js)|Easy|
 2476|[Closest Nodes Queries in a Binary Search Tree](./solutions/2476-closest-nodes-queries-in-a-binary-search-tree.js)|Medium|
+2477|[Minimum Fuel Cost to Report to the Capital](./solutions/2477-minimum-fuel-cost-to-report-to-the-capital.js)|Medium|
 2482|[Difference Between Ones and Zeros in Row and Column](./solutions/2482-difference-between-ones-and-zeros-in-row-and-column.js)|Medium|
 2490|[Circular Sentence](./solutions/2490-circular-sentence.js)|Easy|
 2493|[Divide Nodes Into the Maximum Number of Groups](./solutions/2493-divide-nodes-into-the-maximum-number-of-groups.js)|Hard|
diff --git a/solutions/2477-minimum-fuel-cost-to-report-to-the-capital.js b/solutions/2477-minimum-fuel-cost-to-report-to-the-capital.js
new file mode 100644
index 00000000..fe195062
--- /dev/null
+++ b/solutions/2477-minimum-fuel-cost-to-report-to-the-capital.js
@@ -0,0 +1,51 @@
+/**
+ * 2477. Minimum Fuel Cost to Report to the Capital
+ * https://leetcode.com/problems/minimum-fuel-cost-to-report-to-the-capital/
+ * Difficulty: Medium
+ *
+ * There is a tree (i.e., a connected, undirected graph with no cycles) structure country network
+ * consisting of n cities numbered from 0 to n - 1 and exactly n - 1 roads. The capital city is
+ * city 0. You are given a 2D integer array roads where roads[i] = [ai, bi] denotes that there
+ * exists a bidirectional road connecting cities ai and bi.
+ *
+ * There is a meeting for the representatives of each city. The meeting is in the capital city.
+ *
+ * There is a car in each city. You are given an integer seats that indicates the number of seats
+ * in each car.
+ *
+ * A representative can use the car in their city to travel or change the car and ride with another
+ * representative. The cost of traveling between two cities is one liter of fuel.
+ *
+ * Return the minimum number of liters of fuel to reach the capital city.
+ */
+
+/**
+ * @param {number[][]} roads
+ * @param {number} seats
+ * @return {number}
+ */
+var minimumFuelCost = function(roads, seats) {
+  const n = roads.length + 1;
+  const graph = Array.from({ length: n }, () => []);
+  for (const [a, b] of roads) {
+    graph[a].push(b);
+    graph[b].push(a);
+  }
+
+  let fuel = 0;
+  dfs(0, -1);
+  return fuel;
+
+  function dfs(node, parent) {
+    let representatives = 1;
+    for (const neighbor of graph[node]) {
+      if (neighbor !== parent) {
+        representatives += dfs(neighbor, node);
+      }
+    }
+    if (node !== 0) {
+      fuel += Math.ceil(representatives / seats);
+    }
+    return representatives;
+  }
+};

From 0ec81f86992d57819415463a22e0ab443d5513c7 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 19:53:35 -0500
Subject: [PATCH 265/571] Add solution #2481

---
 README.md                                     |  3 ++-
 .../2481-minimum-cuts-to-divide-a-circle.js   | 24 +++++++++++++++++++
 2 files changed, 26 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2481-minimum-cuts-to-divide-a-circle.js

diff --git a/README.md b/README.md
index 29dbb008..b70650e0 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,973 LeetCode solutions in JavaScript
+# 1,974 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1869,6 +1869,7 @@
 2475|[Number of Unequal Triplets in Array](./solutions/2475-number-of-unequal-triplets-in-array.js)|Easy|
 2476|[Closest Nodes Queries in a Binary Search Tree](./solutions/2476-closest-nodes-queries-in-a-binary-search-tree.js)|Medium|
 2477|[Minimum Fuel Cost to Report to the Capital](./solutions/2477-minimum-fuel-cost-to-report-to-the-capital.js)|Medium|
+2481|[Minimum Cuts to Divide a Circle](./solutions/2481-minimum-cuts-to-divide-a-circle.js)|Easy|
 2482|[Difference Between Ones and Zeros in Row and Column](./solutions/2482-difference-between-ones-and-zeros-in-row-and-column.js)|Medium|
 2490|[Circular Sentence](./solutions/2490-circular-sentence.js)|Easy|
 2493|[Divide Nodes Into the Maximum Number of Groups](./solutions/2493-divide-nodes-into-the-maximum-number-of-groups.js)|Hard|
diff --git a/solutions/2481-minimum-cuts-to-divide-a-circle.js b/solutions/2481-minimum-cuts-to-divide-a-circle.js
new file mode 100644
index 00000000..805ed6ac
--- /dev/null
+++ b/solutions/2481-minimum-cuts-to-divide-a-circle.js
@@ -0,0 +1,24 @@
+/**
+ * 2481. Minimum Cuts to Divide a Circle
+ * https://leetcode.com/problems/minimum-cuts-to-divide-a-circle/
+ * Difficulty: Easy
+ *
+ * A valid cut in a circle can be:
+ * - A cut that is represented by a straight line that touches two points on the edge of the
+ *   circle and passes through its center, or
+ * - A cut that is represented by a straight line that touches one point on the edge of the
+ *   circle and its center.
+ *
+ * Some valid and invalid cuts are shown in the figures below.
+ *
+ * Given the integer n, return the minimum number of cuts needed to divide a circle into n
+ * equal slices.
+ */
+
+/**
+ * @param {number} n
+ * @return {number}
+ */
+var numberOfCuts = function(n) {
+  return n === 1 ? 0 : n % 2 === 0 ? n / 2 : n;
+};

From ba88478a901c93ce3827161bb6909d45ae516312 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 19:54:44 -0500
Subject: [PATCH 266/571] Add solution #2483

---
 README.md                                    |  3 +-
 solutions/2483-minimum-penalty-for-a-shop.js | 38 ++++++++++++++++++++
 2 files changed, 40 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2483-minimum-penalty-for-a-shop.js

diff --git a/README.md b/README.md
index b70650e0..f200dbb9 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,974 LeetCode solutions in JavaScript
+# 1,975 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1871,6 +1871,7 @@
 2477|[Minimum Fuel Cost to Report to the Capital](./solutions/2477-minimum-fuel-cost-to-report-to-the-capital.js)|Medium|
 2481|[Minimum Cuts to Divide a Circle](./solutions/2481-minimum-cuts-to-divide-a-circle.js)|Easy|
 2482|[Difference Between Ones and Zeros in Row and Column](./solutions/2482-difference-between-ones-and-zeros-in-row-and-column.js)|Medium|
+2483|[Minimum Penalty for a Shop](./solutions/2483-minimum-penalty-for-a-shop.js)|Medium|
 2490|[Circular Sentence](./solutions/2490-circular-sentence.js)|Easy|
 2493|[Divide Nodes Into the Maximum Number of Groups](./solutions/2493-divide-nodes-into-the-maximum-number-of-groups.js)|Hard|
 2503|[Maximum Number of Points From Grid Queries](./solutions/2503-maximum-number-of-points-from-grid-queries.js)|Hard|
diff --git a/solutions/2483-minimum-penalty-for-a-shop.js b/solutions/2483-minimum-penalty-for-a-shop.js
new file mode 100644
index 00000000..0819d961
--- /dev/null
+++ b/solutions/2483-minimum-penalty-for-a-shop.js
@@ -0,0 +1,38 @@
+/**
+ * 2483. Minimum Penalty for a Shop
+ * https://leetcode.com/problems/minimum-penalty-for-a-shop/
+ * Difficulty: Medium
+ *
+ * You are given the customer visit log of a shop represented by a 0-indexed string customers
+ * consisting only of characters 'N' and 'Y':
+ * - if the ith character is 'Y', it means that customers come at the ith hour
+ * - whereas 'N' indicates that no customers come at the ith hour.
+ *
+ * If the shop closes at the jth hour (0 <= j <= n), the penalty is calculated as follows:
+ * - For every hour when the shop is open and no customers come, the penalty increases by 1.
+ * - For every hour when the shop is closed and customers come, the penalty increases by 1.
+ *
+ * Return the earliest hour at which the shop must be closed to incur a minimum penalty.
+ *
+ * Note that if a shop closes at the jth hour, it means the shop is closed at the hour j.
+ */
+
+/**
+ * @param {string} customers
+ * @return {number}
+ */
+var bestClosingTime = function(customers) {
+  let minPenalty = 0;
+  let currentPenalty = 0;
+  let result = 0;
+
+  for (let i = 0; i < customers.length; i++) {
+    currentPenalty += customers[i] === 'Y' ? -1 : 1;
+    if (currentPenalty < minPenalty) {
+      minPenalty = currentPenalty;
+      result = i + 1;
+    }
+  }
+
+  return result;
+};

From d06c5d2cf9c23d8063c97a95e090e32f8b9f1a50 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 22:04:33 -0500
Subject: [PATCH 267/571] Add solution #2485

---
 README.md                                |  3 ++-
 solutions/2485-find-the-pivot-integer.js | 22 ++++++++++++++++++++++
 2 files changed, 24 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2485-find-the-pivot-integer.js

diff --git a/README.md b/README.md
index f200dbb9..812317e6 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,975 LeetCode solutions in JavaScript
+# 1,976 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1872,6 +1872,7 @@
 2481|[Minimum Cuts to Divide a Circle](./solutions/2481-minimum-cuts-to-divide-a-circle.js)|Easy|
 2482|[Difference Between Ones and Zeros in Row and Column](./solutions/2482-difference-between-ones-and-zeros-in-row-and-column.js)|Medium|
 2483|[Minimum Penalty for a Shop](./solutions/2483-minimum-penalty-for-a-shop.js)|Medium|
+2485|[Find the Pivot Integer](./solutions/2485-find-the-pivot-integer.js)|Easy|
 2490|[Circular Sentence](./solutions/2490-circular-sentence.js)|Easy|
 2493|[Divide Nodes Into the Maximum Number of Groups](./solutions/2493-divide-nodes-into-the-maximum-number-of-groups.js)|Hard|
 2503|[Maximum Number of Points From Grid Queries](./solutions/2503-maximum-number-of-points-from-grid-queries.js)|Hard|
diff --git a/solutions/2485-find-the-pivot-integer.js b/solutions/2485-find-the-pivot-integer.js
new file mode 100644
index 00000000..73a95a4a
--- /dev/null
+++ b/solutions/2485-find-the-pivot-integer.js
@@ -0,0 +1,22 @@
+/**
+ * 2485. Find the Pivot Integer
+ * https://leetcode.com/problems/find-the-pivot-integer/
+ * Difficulty: Easy
+ *
+ * Given a positive integer n, find the pivot integer x such that:
+ * - The sum of all elements between 1 and x inclusively equals the sum of all elements between
+ *   x and n inclusively.
+ *
+ * Return the pivot integer x. If no such integer exists, return -1. It is guaranteed that there
+ * will be at most one pivot index for the given input.
+ */
+
+/**
+ * @param {number} n
+ * @return {number}
+ */
+var pivotInteger = function(n) {
+  const totalSum = n * (n + 1) / 2;
+  const pivot = Math.sqrt(totalSum);
+  return Number.isInteger(pivot) && pivot <= n ? pivot : -1;
+};

From 079a4a08a964455d463c11f8833706ddff82507a Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 22:05:19 -0500
Subject: [PATCH 268/571] Add solution #2486

---
 README.md                                     |  3 +-
 ...haracters-to-string-to-make-subsequence.js | 32 +++++++++++++++++++
 2 files changed, 34 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2486-append-characters-to-string-to-make-subsequence.js

diff --git a/README.md b/README.md
index 812317e6..7d7ba7a5 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,976 LeetCode solutions in JavaScript
+# 1,977 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1873,6 +1873,7 @@
 2482|[Difference Between Ones and Zeros in Row and Column](./solutions/2482-difference-between-ones-and-zeros-in-row-and-column.js)|Medium|
 2483|[Minimum Penalty for a Shop](./solutions/2483-minimum-penalty-for-a-shop.js)|Medium|
 2485|[Find the Pivot Integer](./solutions/2485-find-the-pivot-integer.js)|Easy|
+2486|[Append Characters to String to Make Subsequence](./solutions/2486-append-characters-to-string-to-make-subsequence.js)|Medium|
 2490|[Circular Sentence](./solutions/2490-circular-sentence.js)|Easy|
 2493|[Divide Nodes Into the Maximum Number of Groups](./solutions/2493-divide-nodes-into-the-maximum-number-of-groups.js)|Hard|
 2503|[Maximum Number of Points From Grid Queries](./solutions/2503-maximum-number-of-points-from-grid-queries.js)|Hard|
diff --git a/solutions/2486-append-characters-to-string-to-make-subsequence.js b/solutions/2486-append-characters-to-string-to-make-subsequence.js
new file mode 100644
index 00000000..09bfb362
--- /dev/null
+++ b/solutions/2486-append-characters-to-string-to-make-subsequence.js
@@ -0,0 +1,32 @@
+/**
+ * 2486. Append Characters to String to Make Subsequence
+ * https://leetcode.com/problems/append-characters-to-string-to-make-subsequence/
+ * Difficulty: Medium
+ *
+ * You are given two strings s and t consisting of only lowercase English letters.
+ *
+ * Return the minimum number of characters that need to be appended to the end of s so that
+ * t becomes a subsequence of s.
+ *
+ * A subsequence is a string that can be derived from another string by deleting some or no
+ * characters without changing the order of the remaining characters.
+ */
+
+/**
+ * @param {string} s
+ * @param {string} t
+ * @return {number}
+ */
+var appendCharacters = function(s, t) {
+  let sIndex = 0;
+  let tIndex = 0;
+
+  while (sIndex < s.length && tIndex < t.length) {
+    if (s[sIndex] === t[tIndex]) {
+      tIndex++;
+    }
+    sIndex++;
+  }
+
+  return t.length - tIndex;
+};

From e4ffe17d35b37a1b1b746ccf2b5526b85180239a Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 22:06:23 -0500
Subject: [PATCH 269/571] Add solution #2487

---
 README.md                                     |  3 +-
 .../2487-remove-nodes-from-linked-list.js     | 44 +++++++++++++++++++
 2 files changed, 46 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2487-remove-nodes-from-linked-list.js

diff --git a/README.md b/README.md
index 7d7ba7a5..938a3afe 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,977 LeetCode solutions in JavaScript
+# 1,978 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1874,6 +1874,7 @@
 2483|[Minimum Penalty for a Shop](./solutions/2483-minimum-penalty-for-a-shop.js)|Medium|
 2485|[Find the Pivot Integer](./solutions/2485-find-the-pivot-integer.js)|Easy|
 2486|[Append Characters to String to Make Subsequence](./solutions/2486-append-characters-to-string-to-make-subsequence.js)|Medium|
+2487|[Remove Nodes From Linked List](./solutions/2487-remove-nodes-from-linked-list.js)|Medium|
 2490|[Circular Sentence](./solutions/2490-circular-sentence.js)|Easy|
 2493|[Divide Nodes Into the Maximum Number of Groups](./solutions/2493-divide-nodes-into-the-maximum-number-of-groups.js)|Hard|
 2503|[Maximum Number of Points From Grid Queries](./solutions/2503-maximum-number-of-points-from-grid-queries.js)|Hard|
diff --git a/solutions/2487-remove-nodes-from-linked-list.js b/solutions/2487-remove-nodes-from-linked-list.js
new file mode 100644
index 00000000..b6d6cb2c
--- /dev/null
+++ b/solutions/2487-remove-nodes-from-linked-list.js
@@ -0,0 +1,44 @@
+/**
+ * 2487. Remove Nodes From Linked List
+ * https://leetcode.com/problems/remove-nodes-from-linked-list/
+ * Difficulty: Medium
+ *
+ * You are given the head of a linked list.
+ *
+ * Remove every node which has a node with a greater value anywhere to the right side of it.
+ *
+ * Return the head of the modified linked list.
+ */
+
+/**
+ * Definition for singly-linked list.
+ * function ListNode(val, next) {
+ *     this.val = (val===undefined ? 0 : val)
+ *     this.next = (next===undefined ? null : next)
+ * }
+ */
+/**
+ * @param {ListNode} head
+ * @return {ListNode}
+ */
+var removeNodes = function(head) {
+  const stack = [];
+  let current = head;
+
+  while (current) {
+    while (stack.length && stack[stack.length - 1].val < current.val) {
+      stack.pop();
+    }
+    stack.push(current);
+    current = current.next;
+  }
+
+  let result = null;
+  while (stack.length) {
+    current = stack.pop();
+    current.next = result;
+    result = current;
+  }
+
+  return result;
+};

From 36765a30b2d6033aa2891a83d1e271aeef842bd4 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 22:13:57 -0500
Subject: [PATCH 270/571] Add solution #2488

---
 README.md                                     |  3 +-
 .../2488-count-subarrays-with-median-k.js     | 43 +++++++++++++++++++
 2 files changed, 45 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2488-count-subarrays-with-median-k.js

diff --git a/README.md b/README.md
index 938a3afe..c286179f 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,978 LeetCode solutions in JavaScript
+# 1,979 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1875,6 +1875,7 @@
 2485|[Find the Pivot Integer](./solutions/2485-find-the-pivot-integer.js)|Easy|
 2486|[Append Characters to String to Make Subsequence](./solutions/2486-append-characters-to-string-to-make-subsequence.js)|Medium|
 2487|[Remove Nodes From Linked List](./solutions/2487-remove-nodes-from-linked-list.js)|Medium|
+2488|[Count Subarrays With Median K](./solutions/2488-count-subarrays-with-median-k.js)|Hard|
 2490|[Circular Sentence](./solutions/2490-circular-sentence.js)|Easy|
 2493|[Divide Nodes Into the Maximum Number of Groups](./solutions/2493-divide-nodes-into-the-maximum-number-of-groups.js)|Hard|
 2503|[Maximum Number of Points From Grid Queries](./solutions/2503-maximum-number-of-points-from-grid-queries.js)|Hard|
diff --git a/solutions/2488-count-subarrays-with-median-k.js b/solutions/2488-count-subarrays-with-median-k.js
new file mode 100644
index 00000000..694d9ea9
--- /dev/null
+++ b/solutions/2488-count-subarrays-with-median-k.js
@@ -0,0 +1,43 @@
+/**
+ * 2488. Count Subarrays With Median K
+ * https://leetcode.com/problems/count-subarrays-with-median-k/
+ * Difficulty: Hard
+ *
+ * You are given an array nums of size n consisting of distinct integers from 1 to n and
+ * a positive integer k.
+ *
+ * Return the number of non-empty subarrays in nums that have a median equal to k.
+ *
+ * Note:
+ * - The median of an array is the middle element after sorting the array in ascending order.
+ *   If the array is of even length, the median is the left middle element.
+ *   - For example, the median of [2,3,1,4] is 2, and the median of [8,4,3,5,1] is 4.
+ * - A subarray is a contiguous part of an array.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} k
+ * @return {number}
+ */
+var countSubarrays = function(nums, k) {
+  const n = nums.length;
+  const kIndex = nums.indexOf(k);
+  const balanceMap = new Map([[0, 1]]);
+  let balance = 0;
+  let result = 0;
+
+  for (let i = kIndex + 1; i < n; i++) {
+    balance += nums[i] > k ? 1 : -1;
+    balanceMap.set(balance, (balanceMap.get(balance) || 0) + 1);
+  }
+
+  balance = 0;
+  for (let i = kIndex; i >= 0; i--) {
+    balance += nums[i] > k ? -1 : nums[i] < k ? 1 : 0;
+    result += balanceMap.get(balance) || 0;
+    result += balanceMap.get(balance + 1) || 0;
+  }
+
+  return result;
+};

From 0aee1c76e5f1f43c7fb33efa24cf2d6df9c8c578 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 23 May 2025 22:15:04 -0500
Subject: [PATCH 271/571] Add solution #2491

---
 README.md                                     |  3 +-
 ...ivide-players-into-teams-of-equal-skill.js | 32 +++++++++++++++++++
 2 files changed, 34 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2491-divide-players-into-teams-of-equal-skill.js

diff --git a/README.md b/README.md
index c286179f..9978339f 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,979 LeetCode solutions in JavaScript
+# 1,980 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1877,6 +1877,7 @@
 2487|[Remove Nodes From Linked List](./solutions/2487-remove-nodes-from-linked-list.js)|Medium|
 2488|[Count Subarrays With Median K](./solutions/2488-count-subarrays-with-median-k.js)|Hard|
 2490|[Circular Sentence](./solutions/2490-circular-sentence.js)|Easy|
+2491|[Divide Players Into Teams of Equal Skill](./solutions/2491-divide-players-into-teams-of-equal-skill.js)|Medium|
 2493|[Divide Nodes Into the Maximum Number of Groups](./solutions/2493-divide-nodes-into-the-maximum-number-of-groups.js)|Hard|
 2503|[Maximum Number of Points From Grid Queries](./solutions/2503-maximum-number-of-points-from-grid-queries.js)|Hard|
 2523|[Closest Prime Numbers in Range](./solutions/2523-closest-prime-numbers-in-range.js)|Medium|
diff --git a/solutions/2491-divide-players-into-teams-of-equal-skill.js b/solutions/2491-divide-players-into-teams-of-equal-skill.js
new file mode 100644
index 00000000..5f481cf0
--- /dev/null
+++ b/solutions/2491-divide-players-into-teams-of-equal-skill.js
@@ -0,0 +1,32 @@
+/**
+ * 2491. Divide Players Into Teams of Equal Skill
+ * https://leetcode.com/problems/divide-players-into-teams-of-equal-skill/
+ * Difficulty: Medium
+ *
+ * You are given a positive integer array skill of even length n where skill[i] denotes the
+ * skill of the ith player. Divide the players into n / 2 teams of size 2 such that the total
+ * skill of each team is equal.
+ *
+ * The chemistry of a team is equal to the product of the skills of the players on that team.
+ *
+ * Return the sum of the chemistry of all the teams, or return -1 if there is no way to divide
+ * the players into teams such that the total skill of each team is equal.
+ */
+
+/**
+ * @param {number[]} skill
+ * @return {number}
+ */
+var dividePlayers = function(skill) {
+  skill.sort((a, b) => a - b);
+  const n = skill.length;
+  const targetSum = skill[0] + skill[n - 1];
+  let result = 0;
+
+  for (let i = 0, j = n - 1; i < j; i++, j--) {
+    if (skill[i] + skill[j] !== targetSum) return -1;
+    result += skill[i] * skill[j];
+  }
+
+  return result;
+};

From 52bf15de236cd0315cd26c51de1dc5f956ab9c83 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 24 May 2025 12:29:06 -0500
Subject: [PATCH 272/571] Add solution #2492

---
 README.md                                     |  3 +-
 ...imum-score-of-a-path-between-two-cities.js | 53 +++++++++++++++++++
 2 files changed, 55 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2492-minimum-score-of-a-path-between-two-cities.js

diff --git a/README.md b/README.md
index 9978339f..1ce852b5 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,980 LeetCode solutions in JavaScript
+# 1,981 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1878,6 +1878,7 @@
 2488|[Count Subarrays With Median K](./solutions/2488-count-subarrays-with-median-k.js)|Hard|
 2490|[Circular Sentence](./solutions/2490-circular-sentence.js)|Easy|
 2491|[Divide Players Into Teams of Equal Skill](./solutions/2491-divide-players-into-teams-of-equal-skill.js)|Medium|
+2492|[Minimum Score of a Path Between Two Cities](./solutions/2492-minimum-score-of-a-path-between-two-cities.js)|Medium|
 2493|[Divide Nodes Into the Maximum Number of Groups](./solutions/2493-divide-nodes-into-the-maximum-number-of-groups.js)|Hard|
 2503|[Maximum Number of Points From Grid Queries](./solutions/2503-maximum-number-of-points-from-grid-queries.js)|Hard|
 2523|[Closest Prime Numbers in Range](./solutions/2523-closest-prime-numbers-in-range.js)|Medium|
diff --git a/solutions/2492-minimum-score-of-a-path-between-two-cities.js b/solutions/2492-minimum-score-of-a-path-between-two-cities.js
new file mode 100644
index 00000000..f5cbc0f5
--- /dev/null
+++ b/solutions/2492-minimum-score-of-a-path-between-two-cities.js
@@ -0,0 +1,53 @@
+/**
+ * 2492. Minimum Score of a Path Between Two Cities
+ * https://leetcode.com/problems/minimum-score-of-a-path-between-two-cities/
+ * Difficulty: Medium
+ *
+ * You are given a positive integer n representing n cities numbered from 1 to n. You are also
+ * given a 2D array roads where roads[i] = [ai, bi, distancei] indicates that there is a
+ * bidirectional road between cities ai and bi with a distance equal to distancei. The cities
+ * graph is not necessarily connected.
+ *
+ * The score of a path between two cities is defined as the minimum distance of a road in this
+ * path.
+ *
+ * Return the minimum possible score of a path between cities 1 and n.
+ *
+ * Note:
+ * - A path is a sequence of roads between two cities.
+ * - It is allowed for a path to contain the same road multiple times, and you can visit cities 1
+ *   and n multiple times along the path.
+ * - The test cases are generated such that there is at least one path between 1 and n.
+ */
+
+/**
+ * @param {number} n
+ * @param {number[][]} roads
+ * @return {number}
+ */
+var minScore = function(n, roads) {
+  const graph = Array.from({ length: n + 1 }, () => []);
+  for (const [a, b, dist] of roads) {
+    graph[a].push([b, dist]);
+    graph[b].push([a, dist]);
+  }
+
+  const visited = new Set();
+  const queue = [1];
+  let result = Infinity;
+
+  while (queue.length) {
+    const city = queue.shift();
+    if (visited.has(city)) continue;
+    visited.add(city);
+
+    for (const [nextCity, dist] of graph[city]) {
+      result = Math.min(result, dist);
+      if (!visited.has(nextCity)) {
+        queue.push(nextCity);
+      }
+    }
+  }
+
+  return result;
+};

From 9d29bad51ec73133c608e7609e753ed4b0129c1e Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 24 May 2025 12:29:59 -0500
Subject: [PATCH 273/571] Add solution #2496

---
 README.md                                     |  3 ++-
 ...6-maximum-value-of-a-string-in-an-array.js | 27 +++++++++++++++++++
 2 files changed, 29 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2496-maximum-value-of-a-string-in-an-array.js

diff --git a/README.md b/README.md
index 1ce852b5..99b8889e 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,981 LeetCode solutions in JavaScript
+# 1,982 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1880,6 +1880,7 @@
 2491|[Divide Players Into Teams of Equal Skill](./solutions/2491-divide-players-into-teams-of-equal-skill.js)|Medium|
 2492|[Minimum Score of a Path Between Two Cities](./solutions/2492-minimum-score-of-a-path-between-two-cities.js)|Medium|
 2493|[Divide Nodes Into the Maximum Number of Groups](./solutions/2493-divide-nodes-into-the-maximum-number-of-groups.js)|Hard|
+2496|[Maximum Value of a String in an Array](./solutions/2496-maximum-value-of-a-string-in-an-array.js)|Easy|
 2503|[Maximum Number of Points From Grid Queries](./solutions/2503-maximum-number-of-points-from-grid-queries.js)|Hard|
 2523|[Closest Prime Numbers in Range](./solutions/2523-closest-prime-numbers-in-range.js)|Medium|
 2529|[Maximum Count of Positive Integer and Negative Integer](./solutions/2529-maximum-count-of-positive-integer-and-negative-integer.js)|Easy|
diff --git a/solutions/2496-maximum-value-of-a-string-in-an-array.js b/solutions/2496-maximum-value-of-a-string-in-an-array.js
new file mode 100644
index 00000000..3d78d50f
--- /dev/null
+++ b/solutions/2496-maximum-value-of-a-string-in-an-array.js
@@ -0,0 +1,27 @@
+/**
+ * 2496. Maximum Value of a String in an Array
+ * https://leetcode.com/problems/maximum-value-of-a-string-in-an-array/
+ * Difficulty: Easy
+ *
+ * The value of an alphanumeric string can be defined as:
+ * - The numeric representation of the string in base 10, if it comprises of digits only.
+ * - The length of the string, otherwise.
+ *
+ * Given an array strs of alphanumeric strings, return the maximum value of any string in strs.
+ */
+
+/**
+ * @param {string[]} strs
+ * @return {number}
+ */
+var maximumValue = function(strs) {
+  let result = 0;
+
+  for (const str of strs) {
+    const isNumeric = /^[0-9]+$/.test(str);
+    const value = isNumeric ? parseInt(str) : str.length;
+    result = Math.max(result, value);
+  }
+
+  return result;
+};

From 256d44b9551207e2c9c57806b3ea7bbd11665c0e Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 24 May 2025 12:31:10 -0500
Subject: [PATCH 274/571] Add solution #2498

---
 README.md                      |  3 ++-
 solutions/2498-frog-jump-ii.js | 33 +++++++++++++++++++++++++++++++++
 2 files changed, 35 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2498-frog-jump-ii.js

diff --git a/README.md b/README.md
index 99b8889e..28f620b3 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,982 LeetCode solutions in JavaScript
+# 1,983 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1881,6 +1881,7 @@
 2492|[Minimum Score of a Path Between Two Cities](./solutions/2492-minimum-score-of-a-path-between-two-cities.js)|Medium|
 2493|[Divide Nodes Into the Maximum Number of Groups](./solutions/2493-divide-nodes-into-the-maximum-number-of-groups.js)|Hard|
 2496|[Maximum Value of a String in an Array](./solutions/2496-maximum-value-of-a-string-in-an-array.js)|Easy|
+2498|[Frog Jump II](./solutions/2498-frog-jump-ii.js)|Medium|
 2503|[Maximum Number of Points From Grid Queries](./solutions/2503-maximum-number-of-points-from-grid-queries.js)|Hard|
 2523|[Closest Prime Numbers in Range](./solutions/2523-closest-prime-numbers-in-range.js)|Medium|
 2529|[Maximum Count of Positive Integer and Negative Integer](./solutions/2529-maximum-count-of-positive-integer-and-negative-integer.js)|Easy|
diff --git a/solutions/2498-frog-jump-ii.js b/solutions/2498-frog-jump-ii.js
new file mode 100644
index 00000000..573192a9
--- /dev/null
+++ b/solutions/2498-frog-jump-ii.js
@@ -0,0 +1,33 @@
+/**
+ * 2498. Frog Jump II
+ * https://leetcode.com/problems/frog-jump-ii/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed integer array stones sorted in strictly increasing order representing
+ * the positions of stones in a river.
+ *
+ * A frog, initially on the first stone, wants to travel to the last stone and then return to the
+ * first stone. However, it can jump to any stone at most once.
+ *
+ * The length of a jump is the absolute difference between the position of the stone the frog is
+ * currently on and the position of the stone to which the frog jumps.
+ *
+ * - More formally, if the frog is at stones[i] and is jumping to stones[j], the length of the jump
+ *   is |stones[i] - stones[j]|.
+ *
+ * The cost of a path is the maximum length of a jump among all jumps in the path.
+ *
+ * Return the minimum cost of a path for the frog.
+ */
+
+/**
+ * @param {number[]} stones
+ * @return {number}
+ */
+var maxJump = function(stones) {
+  let result = stones[1];
+  for (let i = 2; i < stones.length; i++) {
+    result = Math.max(result, stones[i] - stones[i - 2]);
+  }
+  return result;
+};

From daa2c5f2b367a061b7ccc1857f716ba6f32e9e14 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 24 May 2025 12:38:24 -0500
Subject: [PATCH 275/571] Add solution #2499

---
 README.md                                     |  3 +-
 ...nimum-total-cost-to-make-arrays-unequal.js | 69 +++++++++++++++++++
 2 files changed, 71 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2499-minimum-total-cost-to-make-arrays-unequal.js

diff --git a/README.md b/README.md
index 28f620b3..0fa6db4a 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,983 LeetCode solutions in JavaScript
+# 1,984 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1882,6 +1882,7 @@
 2493|[Divide Nodes Into the Maximum Number of Groups](./solutions/2493-divide-nodes-into-the-maximum-number-of-groups.js)|Hard|
 2496|[Maximum Value of a String in an Array](./solutions/2496-maximum-value-of-a-string-in-an-array.js)|Easy|
 2498|[Frog Jump II](./solutions/2498-frog-jump-ii.js)|Medium|
+2499|[Minimum Total Cost to Make Arrays Unequal](./solutions/2499-minimum-total-cost-to-make-arrays-unequal.js)|Hard|
 2503|[Maximum Number of Points From Grid Queries](./solutions/2503-maximum-number-of-points-from-grid-queries.js)|Hard|
 2523|[Closest Prime Numbers in Range](./solutions/2523-closest-prime-numbers-in-range.js)|Medium|
 2529|[Maximum Count of Positive Integer and Negative Integer](./solutions/2529-maximum-count-of-positive-integer-and-negative-integer.js)|Easy|
diff --git a/solutions/2499-minimum-total-cost-to-make-arrays-unequal.js b/solutions/2499-minimum-total-cost-to-make-arrays-unequal.js
new file mode 100644
index 00000000..8a8e8e9a
--- /dev/null
+++ b/solutions/2499-minimum-total-cost-to-make-arrays-unequal.js
@@ -0,0 +1,69 @@
+/**
+ * 2499. Minimum Total Cost to Make Arrays Unequal
+ * https://leetcode.com/problems/minimum-total-cost-to-make-arrays-unequal/
+ * Difficulty: Hard
+ *
+ * You are given two 0-indexed integer arrays nums1 and nums2, of equal length n.
+ *
+ * In one operation, you can swap the values of any two indices of nums1. The cost of this
+ * operation is the sum of the indices.
+ *
+ * Find the minimum total cost of performing the given operation any number of times such
+ * that nums1[i] != nums2[i] for all 0 <= i <= n - 1 after performing all the operations.
+ *
+ * Return the minimum total cost such that nums1 and nums2 satisfy the above condition.
+ * In case it is not possible, return -1.
+ */
+
+/**
+ * @param {number[]} nums1
+ * @param {number[]} nums2
+ * @return {number}
+ */
+var minimumTotalCost = function(nums1, nums2) {
+  const n = nums1.length;
+  const conflictIndices = [];
+  const valueCount = new Map();
+
+  for (let i = 0; i < n; i++) {
+    if (nums1[i] === nums2[i]) {
+      conflictIndices.push(i);
+      valueCount.set(nums1[i], (valueCount.get(nums1[i]) || 0) + 1);
+    }
+  }
+
+  if (conflictIndices.length === 0) return 0;
+
+  let dominantValue = -1;
+  let maxCount = 0;
+
+  for (const [value, count] of valueCount) {
+    if (count > maxCount) {
+      maxCount = count;
+      dominantValue = value;
+    }
+  }
+
+  const swapsNeeded = conflictIndices.length;
+  let helpersNeeded = Math.max(0, 2 * maxCount - swapsNeeded);
+
+  const helperIndices = [];
+  for (let i = 0; i < n && helpersNeeded > 0; i++) {
+    if (nums1[i] !== nums2[i] && nums1[i] !== dominantValue && nums2[i] !== dominantValue) {
+      helperIndices.push(i);
+      helpersNeeded--;
+    }
+  }
+
+  if (helpersNeeded > 0) return -1;
+
+  const allIndices = [...conflictIndices, ...helperIndices];
+  allIndices.sort((a, b) => a - b);
+
+  let result = 0;
+  for (let i = 0; i < allIndices.length; i++) {
+    result += allIndices[i];
+  }
+
+  return result;
+};

From 1846d3b62cc33a80eb462c5ba79b1166d594e8d7 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 24 May 2025 12:39:55 -0500
Subject: [PATCH 276/571] Add solution #2501

---
 README.md                                     |  3 +-
 .../2501-longest-square-streak-in-an-array.js | 41 +++++++++++++++++++
 2 files changed, 43 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2501-longest-square-streak-in-an-array.js

diff --git a/README.md b/README.md
index 0fa6db4a..b8a1b591 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,984 LeetCode solutions in JavaScript
+# 1,985 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1883,6 +1883,7 @@
 2496|[Maximum Value of a String in an Array](./solutions/2496-maximum-value-of-a-string-in-an-array.js)|Easy|
 2498|[Frog Jump II](./solutions/2498-frog-jump-ii.js)|Medium|
 2499|[Minimum Total Cost to Make Arrays Unequal](./solutions/2499-minimum-total-cost-to-make-arrays-unequal.js)|Hard|
+2501|[Longest Square Streak in an Array](./solutions/2501-longest-square-streak-in-an-array.js)|Medium|
 2503|[Maximum Number of Points From Grid Queries](./solutions/2503-maximum-number-of-points-from-grid-queries.js)|Hard|
 2523|[Closest Prime Numbers in Range](./solutions/2523-closest-prime-numbers-in-range.js)|Medium|
 2529|[Maximum Count of Positive Integer and Negative Integer](./solutions/2529-maximum-count-of-positive-integer-and-negative-integer.js)|Easy|
diff --git a/solutions/2501-longest-square-streak-in-an-array.js b/solutions/2501-longest-square-streak-in-an-array.js
new file mode 100644
index 00000000..ee667541
--- /dev/null
+++ b/solutions/2501-longest-square-streak-in-an-array.js
@@ -0,0 +1,41 @@
+/**
+ * 2501. Longest Square Streak in an Array
+ * https://leetcode.com/problems/longest-square-streak-in-an-array/
+ * Difficulty: Medium
+ *
+ * You are given an integer array nums. A subsequence of nums is called a square streak if:
+ * - The length of the subsequence is at least 2, and
+ * - after sorting the subsequence, each element (except the first element) is the square of
+ *   the previous number.
+ *
+ * Return the length of the longest square streak in nums, or return -1 if there is no square
+ * streak.
+ *
+ * A subsequence is an array that can be derived from another array by deleting some or no
+ * elements without changing the order of the remaining elements.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var longestSquareStreak = function(nums) {
+  const set = new Set(nums);
+  let result = -1;
+
+  for (const num of nums) {
+    let current = num;
+    let length = 1;
+
+    while (current <= 100000 && set.has(current * current)) {
+      current *= current;
+      length++;
+    }
+
+    if (length >= 2) {
+      result = Math.max(result, length);
+    }
+  }
+
+  return result;
+};

From d4a7afe2c69600da2c3152d1ed08244dfaf7eb9a Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 24 May 2025 12:43:15 -0500
Subject: [PATCH 277/571] Add solution #2502

---
 README.md                                 |  3 +-
 solutions/2502-design-memory-allocator.js | 76 +++++++++++++++++++++++
 2 files changed, 78 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2502-design-memory-allocator.js

diff --git a/README.md b/README.md
index b8a1b591..c0d71c2e 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,985 LeetCode solutions in JavaScript
+# 1,986 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1884,6 +1884,7 @@
 2498|[Frog Jump II](./solutions/2498-frog-jump-ii.js)|Medium|
 2499|[Minimum Total Cost to Make Arrays Unequal](./solutions/2499-minimum-total-cost-to-make-arrays-unequal.js)|Hard|
 2501|[Longest Square Streak in an Array](./solutions/2501-longest-square-streak-in-an-array.js)|Medium|
+2502|[Design Memory Allocator](./solutions/2502-design-memory-allocator.js)|Medium|
 2503|[Maximum Number of Points From Grid Queries](./solutions/2503-maximum-number-of-points-from-grid-queries.js)|Hard|
 2523|[Closest Prime Numbers in Range](./solutions/2523-closest-prime-numbers-in-range.js)|Medium|
 2529|[Maximum Count of Positive Integer and Negative Integer](./solutions/2529-maximum-count-of-positive-integer-and-negative-integer.js)|Easy|
diff --git a/solutions/2502-design-memory-allocator.js b/solutions/2502-design-memory-allocator.js
new file mode 100644
index 00000000..b09fcbb0
--- /dev/null
+++ b/solutions/2502-design-memory-allocator.js
@@ -0,0 +1,76 @@
+/**
+ * 2502. Design Memory Allocator
+ * https://leetcode.com/problems/design-memory-allocator/
+ * Difficulty: Medium
+ *
+ * You are given an integer n representing the size of a 0-indexed memory array. All memory
+ * units are initially free.
+ *
+ * You have a memory allocator with the following functionalities:
+ * 1. Allocate a block of size consecutive free memory units and assign it the id mID.
+ * 2. Free all memory units with the given id mID.
+ *
+ * Note that:
+ * - Multiple blocks can be allocated to the same mID.
+ * - You should free all the memory units with mID, even if they were allocated in different blocks.
+ *
+ * Implement the Allocator class:
+ * - Allocator(int n) Initializes an Allocator object with a memory array of size n.
+ * - int allocate(int size, int mID) Find the leftmost block of size consecutive free memory units
+ *   and allocate it with the id mID. Return the block's first index. If such a block does not
+ *   exist, return -1.
+ * - int freeMemory(int mID) Free all memory units with the id mID. Return the number of memory
+ *   units you have freed.
+ */
+
+/**
+ * @param {number} n
+ */
+var Allocator = function(n) {
+  this.memory = Array(n).fill(0);
+};
+
+/**
+ * @param {number} size
+ * @param {number} mID
+ * @return {number}
+ */
+Allocator.prototype.allocate = function(size, mID) {
+  let start = -1;
+  let count = 0;
+
+  for (let i = 0; i < this.memory.length; i++) {
+    if (this.memory[i] === 0) {
+      if (start === -1) start = i;
+      count++;
+      if (count === size) {
+        for (let j = start; j < start + size; j++) {
+          this.memory[j] = mID;
+        }
+        return start;
+      }
+    } else {
+      start = -1;
+      count = 0;
+    }
+  }
+
+  return -1;
+};
+
+/**
+ * @param {number} mID
+ * @return {number}
+ */
+Allocator.prototype.freeMemory = function(mID) {
+  let result = 0;
+
+  for (let i = 0; i < this.memory.length; i++) {
+    if (this.memory[i] === mID) {
+      this.memory[i] = 0;
+      result++;
+    }
+  }
+
+  return result;
+};

From 2ce6a0d2d95f4acb882ac352e3ed673df653ff8c Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 24 May 2025 12:44:55 -0500
Subject: [PATCH 278/571] Add solution #2506

---
 README.md                                     |  3 +-
 .../2506-count-pairs-of-similar-strings.js    | 36 +++++++++++++++++++
 2 files changed, 38 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2506-count-pairs-of-similar-strings.js

diff --git a/README.md b/README.md
index c0d71c2e..b160eef9 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,986 LeetCode solutions in JavaScript
+# 1,987 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1886,6 +1886,7 @@
 2501|[Longest Square Streak in an Array](./solutions/2501-longest-square-streak-in-an-array.js)|Medium|
 2502|[Design Memory Allocator](./solutions/2502-design-memory-allocator.js)|Medium|
 2503|[Maximum Number of Points From Grid Queries](./solutions/2503-maximum-number-of-points-from-grid-queries.js)|Hard|
+2506|[Count Pairs Of Similar Strings](./solutions/2506-count-pairs-of-similar-strings.js)|Easy|
 2523|[Closest Prime Numbers in Range](./solutions/2523-closest-prime-numbers-in-range.js)|Medium|
 2529|[Maximum Count of Positive Integer and Negative Integer](./solutions/2529-maximum-count-of-positive-integer-and-negative-integer.js)|Easy|
 2535|[Difference Between Element Sum and Digit Sum of an Array](./solutions/2535-difference-between-element-sum-and-digit-sum-of-an-array.js)|Easy|
diff --git a/solutions/2506-count-pairs-of-similar-strings.js b/solutions/2506-count-pairs-of-similar-strings.js
new file mode 100644
index 00000000..3a4d78ef
--- /dev/null
+++ b/solutions/2506-count-pairs-of-similar-strings.js
@@ -0,0 +1,36 @@
+/**
+ * 2506. Count Pairs Of Similar Strings
+ * https://leetcode.com/problems/count-pairs-of-similar-strings/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed string array words.
+ *
+ * Two strings are similar if they consist of the same characters.
+ * - For example, "abca" and "cba" are similar since both consist of characters 'a', 'b', and 'c'.
+ * - However, "abacba" and "bcfd" are not similar since they do not consist of the same characters.
+ *
+ * Return the number of pairs (i, j) such that 0 <= i < j <= word.length - 1 and the two strings
+ * words[i] and words[j] are similar.
+ */
+
+/**
+ * @param {string[]} words
+ * @return {number}
+ */
+var similarPairs = function(words) {
+  const map = new Map();
+  let result = 0;
+
+  for (const word of words) {
+    const charSet = [...new Set(word.split(''))].sort().join('');
+    map.set(charSet, (map.get(charSet) || 0) + 1);
+  }
+
+  for (const count of map.values()) {
+    if (count > 1) {
+      result += (count * (count - 1)) / 2;
+    }
+  }
+
+  return result;
+};

From 7da572c3dc848bb258fbb5b5dfbf440c3e03b7f1 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 24 May 2025 12:46:01 -0500
Subject: [PATCH 279/571] Add solution #2507

---
 README.md                                     |  3 +-
 ...ter-replacing-with-sum-of-prime-factors.js | 37 +++++++++++++++++++
 2 files changed, 39 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2507-smallest-value-after-replacing-with-sum-of-prime-factors.js

diff --git a/README.md b/README.md
index b160eef9..0d136b9e 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,987 LeetCode solutions in JavaScript
+# 1,988 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1887,6 +1887,7 @@
 2502|[Design Memory Allocator](./solutions/2502-design-memory-allocator.js)|Medium|
 2503|[Maximum Number of Points From Grid Queries](./solutions/2503-maximum-number-of-points-from-grid-queries.js)|Hard|
 2506|[Count Pairs Of Similar Strings](./solutions/2506-count-pairs-of-similar-strings.js)|Easy|
+2507|[Smallest Value After Replacing With Sum of Prime Factors](./solutions/2507-smallest-value-after-replacing-with-sum-of-prime-factors.js)|Medium|
 2523|[Closest Prime Numbers in Range](./solutions/2523-closest-prime-numbers-in-range.js)|Medium|
 2529|[Maximum Count of Positive Integer and Negative Integer](./solutions/2529-maximum-count-of-positive-integer-and-negative-integer.js)|Easy|
 2535|[Difference Between Element Sum and Digit Sum of an Array](./solutions/2535-difference-between-element-sum-and-digit-sum-of-an-array.js)|Easy|
diff --git a/solutions/2507-smallest-value-after-replacing-with-sum-of-prime-factors.js b/solutions/2507-smallest-value-after-replacing-with-sum-of-prime-factors.js
new file mode 100644
index 00000000..d77f5c3a
--- /dev/null
+++ b/solutions/2507-smallest-value-after-replacing-with-sum-of-prime-factors.js
@@ -0,0 +1,37 @@
+/**
+ * 2507. Smallest Value After Replacing With Sum of Prime Factors
+ * https://leetcode.com/problems/smallest-value-after-replacing-with-sum-of-prime-factors/
+ * Difficulty: Medium
+ *
+ * You are given a positive integer n.
+ *
+ * Continuously replace n with the sum of its prime factors.
+ * - Note that if a prime factor divides n multiple times, it should be included in the sum as many
+ *   times as it divides n.
+ *
+ * Return the smallest value n will take on.
+ */
+
+/**
+ * @param {number} n
+ * @return {number}
+ */
+var smallestValue = function(n) {
+  while (true) {
+    const next = sumPrimeFactors(n);
+    if (next === n) return n;
+    n = next;
+  }
+
+  function sumPrimeFactors(num) {
+    let sum = 0;
+    for (let i = 2; i * i <= num; i++) {
+      while (num % i === 0) {
+        sum += i;
+        num /= i;
+      }
+    }
+    if (num > 1) sum += num;
+    return sum;
+  }
+};

From 94cdbd5684966a93649f76e3f92a7e1f67d6801b Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 24 May 2025 12:48:06 -0500
Subject: [PATCH 280/571] Add solution #2509

---
 README.md                                     |  3 +-
 .../2509-cycle-length-queries-in-a-tree.js    | 54 +++++++++++++++++++
 2 files changed, 56 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2509-cycle-length-queries-in-a-tree.js

diff --git a/README.md b/README.md
index 0d136b9e..62bac55a 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,988 LeetCode solutions in JavaScript
+# 1,989 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1888,6 +1888,7 @@
 2503|[Maximum Number of Points From Grid Queries](./solutions/2503-maximum-number-of-points-from-grid-queries.js)|Hard|
 2506|[Count Pairs Of Similar Strings](./solutions/2506-count-pairs-of-similar-strings.js)|Easy|
 2507|[Smallest Value After Replacing With Sum of Prime Factors](./solutions/2507-smallest-value-after-replacing-with-sum-of-prime-factors.js)|Medium|
+2509|[Cycle Length Queries in a Tree](./solutions/2509-cycle-length-queries-in-a-tree.js)|Hard|
 2523|[Closest Prime Numbers in Range](./solutions/2523-closest-prime-numbers-in-range.js)|Medium|
 2529|[Maximum Count of Positive Integer and Negative Integer](./solutions/2529-maximum-count-of-positive-integer-and-negative-integer.js)|Easy|
 2535|[Difference Between Element Sum and Digit Sum of an Array](./solutions/2535-difference-between-element-sum-and-digit-sum-of-an-array.js)|Easy|
diff --git a/solutions/2509-cycle-length-queries-in-a-tree.js b/solutions/2509-cycle-length-queries-in-a-tree.js
new file mode 100644
index 00000000..180c2a6c
--- /dev/null
+++ b/solutions/2509-cycle-length-queries-in-a-tree.js
@@ -0,0 +1,54 @@
+/**
+ * 2509. Cycle Length Queries in a Tree
+ * https://leetcode.com/problems/cycle-length-queries-in-a-tree/
+ * Difficulty: Hard
+ *
+ * You are given an integer n. There is a complete binary tree with 2n - 1 nodes. The root of
+ * that tree is the node with the value 1, and every node with a value val in the range
+ * [1, 2n - 1 - 1] has two children where:
+ * - The left node has the value 2 * val, and
+ * - The right node has the value 2 * val + 1.
+ *
+ * You are also given a 2D integer array queries of length m, where queries[i] = [ai, bi]. For
+ * each query, solve the following problem:
+ * 1. Add an edge between the nodes with values ai and bi.
+ * 2. Find the length of the cycle in the graph.
+ * 3. Remove the added edge between nodes with values ai and bi.
+ *
+ * Note that:
+ * - A cycle is a path that starts and ends at the same node, and each edge in the path is
+ *   visited only once.
+ * - The length of a cycle is the number of edges visited in the cycle.
+ * - There could be multiple edges between two nodes in the tree after adding the edge of
+ *   the query.
+ *
+ * Return an array answer of length m where answer[i] is the answer to the ith query.
+ */
+
+/**
+ * @param {number} n
+ * @param {number[][]} queries
+ * @return {number[]}
+ */
+var cycleLengthQueries = function(n, queries) {
+  const result = [];
+
+  for (const [a, b] of queries) {
+    let x = a;
+    let y = b;
+    let pathLength = 1;
+
+    while (x !== y) {
+      if (x > y) {
+        x = Math.floor(x / 2);
+      } else {
+        y = Math.floor(y / 2);
+      }
+      pathLength++;
+    }
+
+    result.push(pathLength);
+  }
+
+  return result;
+};

From 2508b1cd30f556ecf724c5cb2d3735e8eeaa55fb Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 24 May 2025 12:49:12 -0500
Subject: [PATCH 281/571] Add solution #2515

---
 README.md                                     |  3 +-
 ...ce-to-target-string-in-a-circular-array.js | 37 +++++++++++++++++++
 2 files changed, 39 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2515-shortest-distance-to-target-string-in-a-circular-array.js

diff --git a/README.md b/README.md
index 62bac55a..e29a5434 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,989 LeetCode solutions in JavaScript
+# 1,990 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1889,6 +1889,7 @@
 2506|[Count Pairs Of Similar Strings](./solutions/2506-count-pairs-of-similar-strings.js)|Easy|
 2507|[Smallest Value After Replacing With Sum of Prime Factors](./solutions/2507-smallest-value-after-replacing-with-sum-of-prime-factors.js)|Medium|
 2509|[Cycle Length Queries in a Tree](./solutions/2509-cycle-length-queries-in-a-tree.js)|Hard|
+2515|[Shortest Distance to Target String in a Circular Array](./solutions/2515-shortest-distance-to-target-string-in-a-circular-array.js)|Easy|
 2523|[Closest Prime Numbers in Range](./solutions/2523-closest-prime-numbers-in-range.js)|Medium|
 2529|[Maximum Count of Positive Integer and Negative Integer](./solutions/2529-maximum-count-of-positive-integer-and-negative-integer.js)|Easy|
 2535|[Difference Between Element Sum and Digit Sum of an Array](./solutions/2535-difference-between-element-sum-and-digit-sum-of-an-array.js)|Easy|
diff --git a/solutions/2515-shortest-distance-to-target-string-in-a-circular-array.js b/solutions/2515-shortest-distance-to-target-string-in-a-circular-array.js
new file mode 100644
index 00000000..5c315a34
--- /dev/null
+++ b/solutions/2515-shortest-distance-to-target-string-in-a-circular-array.js
@@ -0,0 +1,37 @@
+/**
+ * 2515. Shortest Distance to Target String in a Circular Array
+ * https://leetcode.com/problems/shortest-distance-to-target-string-in-a-circular-array/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed circular string array words and a string target. A circular array
+ * means that the array's end connects to the array's beginning.
+ * - Formally, the next element of words[i] is words[(i + 1) % n] and the previous element of
+ *   words[i] is words[(i - 1 + n) % n], where n is the length of words.
+ *
+ * Starting from startIndex, you can move to either the next word or the previous word with 1
+ * step at a time.
+ *
+ * Return the shortest distance needed to reach the string target. If the string target does not
+ * exist in words, return -1.
+ */
+
+/**
+ * @param {string[]} words
+ * @param {string} target
+ * @param {number} startIndex
+ * @return {number}
+ */
+var closestTarget = function(words, target, startIndex) {
+  const n = words.length;
+  let minDistance = Infinity;
+
+  for (let i = 0; i < n; i++) {
+    if (words[i] === target) {
+      const forward = Math.abs(i - startIndex);
+      const backward = n - forward;
+      minDistance = Math.min(minDistance, forward, backward);
+    }
+  }
+
+  return minDistance === Infinity ? -1 : minDistance;
+};

From 62a22439bcb80d34cea154f773010ea2789cc949 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 24 May 2025 12:53:25 -0500
Subject: [PATCH 282/571] Add solution #2516

---
 README.md                                     |  3 +-
 ...k-of-each-character-from-left-and-right.js | 46 +++++++++++++++++++
 2 files changed, 48 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2516-take-k-of-each-character-from-left-and-right.js

diff --git a/README.md b/README.md
index e29a5434..b5dd30ef 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,990 LeetCode solutions in JavaScript
+# 1,991 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1890,6 +1890,7 @@
 2507|[Smallest Value After Replacing With Sum of Prime Factors](./solutions/2507-smallest-value-after-replacing-with-sum-of-prime-factors.js)|Medium|
 2509|[Cycle Length Queries in a Tree](./solutions/2509-cycle-length-queries-in-a-tree.js)|Hard|
 2515|[Shortest Distance to Target String in a Circular Array](./solutions/2515-shortest-distance-to-target-string-in-a-circular-array.js)|Easy|
+2516|[Take K of Each Character From Left and Right](./solutions/2516-take-k-of-each-character-from-left-and-right.js)|Medium|
 2523|[Closest Prime Numbers in Range](./solutions/2523-closest-prime-numbers-in-range.js)|Medium|
 2529|[Maximum Count of Positive Integer and Negative Integer](./solutions/2529-maximum-count-of-positive-integer-and-negative-integer.js)|Easy|
 2535|[Difference Between Element Sum and Digit Sum of an Array](./solutions/2535-difference-between-element-sum-and-digit-sum-of-an-array.js)|Easy|
diff --git a/solutions/2516-take-k-of-each-character-from-left-and-right.js b/solutions/2516-take-k-of-each-character-from-left-and-right.js
new file mode 100644
index 00000000..a37d84a9
--- /dev/null
+++ b/solutions/2516-take-k-of-each-character-from-left-and-right.js
@@ -0,0 +1,46 @@
+/**
+ * 2516. Take K of Each Character From Left and Right
+ * https://leetcode.com/problems/take-k-of-each-character-from-left-and-right/
+ * Difficulty: Medium
+ *
+ * You are given a string s consisting of the characters 'a', 'b', and 'c' and a non-negative
+ * integer k. Each minute, you may take either the leftmost character of s, or the rightmost
+ * character of s.
+ *
+ * Return the minimum number of minutes needed for you to take at least k of each character,
+ * or return -1 if it is not possible to take k of each character.
+ */
+
+/**
+ * @param {string} s
+ * @param {number} k
+ * @return {number}
+ */
+var takeCharacters = function(s, k) {
+  const n = s.length;
+  const counts = { a: 0, b: 0, c: 0 };
+
+  for (const char of s) {
+    counts[char]++;
+  }
+
+  if (counts.a < k || counts.b < k || counts.c < k) return -1;
+
+  let maxWindow = 0;
+  let left = 0;
+  const windowCounts = { a: 0, b: 0, c: 0 };
+
+  for (let right = 0; right < n; right++) {
+    windowCounts[s[right]]++;
+
+    while (windowCounts.a > counts.a - k || windowCounts.b > counts.b - k
+          || windowCounts.c > counts.c - k) {
+      windowCounts[s[left]]--;
+      left++;
+    }
+
+    maxWindow = Math.max(maxWindow, right - left + 1);
+  }
+
+  return n - maxWindow;
+};

From 2210c027f7453727d25ef4896e1b25601a356752 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 24 May 2025 12:54:32 -0500
Subject: [PATCH 283/571] Add solution #2517

---
 README.md                                     |  3 +-
 .../2517-maximum-tastiness-of-candy-basket.js | 47 +++++++++++++++++++
 2 files changed, 49 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2517-maximum-tastiness-of-candy-basket.js

diff --git a/README.md b/README.md
index b5dd30ef..0e83cfb4 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,991 LeetCode solutions in JavaScript
+# 1,992 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1891,6 +1891,7 @@
 2509|[Cycle Length Queries in a Tree](./solutions/2509-cycle-length-queries-in-a-tree.js)|Hard|
 2515|[Shortest Distance to Target String in a Circular Array](./solutions/2515-shortest-distance-to-target-string-in-a-circular-array.js)|Easy|
 2516|[Take K of Each Character From Left and Right](./solutions/2516-take-k-of-each-character-from-left-and-right.js)|Medium|
+2517|[Maximum Tastiness of Candy Basket](./solutions/2517-maximum-tastiness-of-candy-basket.js)|Medium|
 2523|[Closest Prime Numbers in Range](./solutions/2523-closest-prime-numbers-in-range.js)|Medium|
 2529|[Maximum Count of Positive Integer and Negative Integer](./solutions/2529-maximum-count-of-positive-integer-and-negative-integer.js)|Easy|
 2535|[Difference Between Element Sum and Digit Sum of an Array](./solutions/2535-difference-between-element-sum-and-digit-sum-of-an-array.js)|Easy|
diff --git a/solutions/2517-maximum-tastiness-of-candy-basket.js b/solutions/2517-maximum-tastiness-of-candy-basket.js
new file mode 100644
index 00000000..6ef4a383
--- /dev/null
+++ b/solutions/2517-maximum-tastiness-of-candy-basket.js
@@ -0,0 +1,47 @@
+/**
+ * 2517. Maximum Tastiness of Candy Basket
+ * https://leetcode.com/problems/maximum-tastiness-of-candy-basket/
+ * Difficulty: Medium
+ *
+ * You are given an array of positive integers price where price[i] denotes the price of the ith
+ * candy and a positive integer k.
+ *
+ * The store sells baskets of k distinct candies. The tastiness of a candy basket is the smallest
+ * absolute difference of the prices of any two candies in the basket.
+ *
+ * Return the maximum tastiness of a candy basket.
+ */
+
+/**
+ * @param {number[]} price
+ * @param {number} k
+ * @return {number}
+ */
+var maximumTastiness = function(price, k) {
+  price.sort((a, b) => a - b);
+  let left = 0;
+  let right = price[price.length - 1] - price[0];
+  let result = 0;
+
+  while (left <= right) {
+    const mid = Math.floor((left + right) / 2);
+    let count = 1;
+    let prev = price[0];
+
+    for (let i = 1; i < price.length; i++) {
+      if (price[i] - prev >= mid) {
+        count++;
+        prev = price[i];
+      }
+    }
+
+    if (count >= k) {
+      result = mid;
+      left = mid + 1;
+    } else {
+      right = mid - 1;
+    }
+  }
+
+  return result;
+};

From bdb037a30311457667066f085ecebe03472ca37c Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 24 May 2025 12:56:09 -0500
Subject: [PATCH 284/571] Add solution #2520

---
 README.md                                     |  3 ++-
 ...0-count-the-digits-that-divide-a-number.js | 25 +++++++++++++++++++
 2 files changed, 27 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2520-count-the-digits-that-divide-a-number.js

diff --git a/README.md b/README.md
index 0e83cfb4..a1fecaaa 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,992 LeetCode solutions in JavaScript
+# 1,993 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1892,6 +1892,7 @@
 2515|[Shortest Distance to Target String in a Circular Array](./solutions/2515-shortest-distance-to-target-string-in-a-circular-array.js)|Easy|
 2516|[Take K of Each Character From Left and Right](./solutions/2516-take-k-of-each-character-from-left-and-right.js)|Medium|
 2517|[Maximum Tastiness of Candy Basket](./solutions/2517-maximum-tastiness-of-candy-basket.js)|Medium|
+2520|[Count the Digits That Divide a Number](./solutions/2520-count-the-digits-that-divide-a-number.js)|Easy|
 2523|[Closest Prime Numbers in Range](./solutions/2523-closest-prime-numbers-in-range.js)|Medium|
 2529|[Maximum Count of Positive Integer and Negative Integer](./solutions/2529-maximum-count-of-positive-integer-and-negative-integer.js)|Easy|
 2535|[Difference Between Element Sum and Digit Sum of an Array](./solutions/2535-difference-between-element-sum-and-digit-sum-of-an-array.js)|Easy|
diff --git a/solutions/2520-count-the-digits-that-divide-a-number.js b/solutions/2520-count-the-digits-that-divide-a-number.js
new file mode 100644
index 00000000..614d3add
--- /dev/null
+++ b/solutions/2520-count-the-digits-that-divide-a-number.js
@@ -0,0 +1,25 @@
+/**
+ * 2520. Count the Digits That Divide a Number
+ * https://leetcode.com/problems/count-the-digits-that-divide-a-number/
+ * Difficulty: Easy
+ *
+ * Given an integer num, return the number of digits in num that divide num.
+ *
+ * An integer val divides nums if nums % val == 0.
+ */
+
+/**
+ * @param {number} num
+ * @return {number}
+ */
+var countDigits = function(num) {
+  let result = 0;
+  let n = num;
+
+  while (n > 0) {
+    if (num % (n % 10) === 0) result++;
+    n = Math.floor(n / 10);
+  }
+
+  return result;
+};

From a8ea67bd0c93525f5f00456ad37941908cabe445 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 24 May 2025 12:57:36 -0500
Subject: [PATCH 285/571] Add solution #2521

---
 README.md                                     |  3 +-
 ...tinct-prime-factors-of-product-of-array.js | 36 +++++++++++++++++++
 2 files changed, 38 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2521-distinct-prime-factors-of-product-of-array.js

diff --git a/README.md b/README.md
index a1fecaaa..fb0246cc 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,993 LeetCode solutions in JavaScript
+# 1,994 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1893,6 +1893,7 @@
 2516|[Take K of Each Character From Left and Right](./solutions/2516-take-k-of-each-character-from-left-and-right.js)|Medium|
 2517|[Maximum Tastiness of Candy Basket](./solutions/2517-maximum-tastiness-of-candy-basket.js)|Medium|
 2520|[Count the Digits That Divide a Number](./solutions/2520-count-the-digits-that-divide-a-number.js)|Easy|
+2521|[Distinct Prime Factors of Product of Array](./solutions/2521-distinct-prime-factors-of-product-of-array.js)|Medium|
 2523|[Closest Prime Numbers in Range](./solutions/2523-closest-prime-numbers-in-range.js)|Medium|
 2529|[Maximum Count of Positive Integer and Negative Integer](./solutions/2529-maximum-count-of-positive-integer-and-negative-integer.js)|Easy|
 2535|[Difference Between Element Sum and Digit Sum of an Array](./solutions/2535-difference-between-element-sum-and-digit-sum-of-an-array.js)|Easy|
diff --git a/solutions/2521-distinct-prime-factors-of-product-of-array.js b/solutions/2521-distinct-prime-factors-of-product-of-array.js
new file mode 100644
index 00000000..6d723c46
--- /dev/null
+++ b/solutions/2521-distinct-prime-factors-of-product-of-array.js
@@ -0,0 +1,36 @@
+/**
+ * 2521. Distinct Prime Factors of Product of Array
+ * https://leetcode.com/problems/distinct-prime-factors-of-product-of-array/
+ * Difficulty: Medium
+ *
+ * Given an array of positive integers nums, return the number of distinct prime factors in the
+ * product of the elements of nums.
+ *
+ * Note that:
+ * - A number greater than 1 is called prime if it is divisible by only 1 and itself.
+ * - An integer val1 is a factor of another integer val2 if val2 / val1 is an integer.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var distinctPrimeFactors = function(nums) {
+  const set = new Set();
+
+  for (const num of nums) {
+    factorize(num);
+  }
+
+  return set.size;
+
+  function factorize(num) {
+    for (let i = 2; i * i <= num; i++) {
+      while (num % i === 0) {
+        set.add(i);
+        num /= i;
+      }
+    }
+    if (num > 1) set.add(num);
+  }
+};

From a95ea86a372cec98fa45eb1bf80947d2f172a1af Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 24 May 2025 12:59:10 -0500
Subject: [PATCH 286/571] Add solution #2522

---
 README.md                                     |  3 +-
 ...g-into-substrings-with-values-at-most-k.js | 42 +++++++++++++++++++
 2 files changed, 44 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2522-partition-string-into-substrings-with-values-at-most-k.js

diff --git a/README.md b/README.md
index fb0246cc..433f4bfa 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,994 LeetCode solutions in JavaScript
+# 1,995 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1894,6 +1894,7 @@
 2517|[Maximum Tastiness of Candy Basket](./solutions/2517-maximum-tastiness-of-candy-basket.js)|Medium|
 2520|[Count the Digits That Divide a Number](./solutions/2520-count-the-digits-that-divide-a-number.js)|Easy|
 2521|[Distinct Prime Factors of Product of Array](./solutions/2521-distinct-prime-factors-of-product-of-array.js)|Medium|
+2522|[Partition String Into Substrings With Values at Most K](./solutions/2522-partition-string-into-substrings-with-values-at-most-k.js)|Medium|
 2523|[Closest Prime Numbers in Range](./solutions/2523-closest-prime-numbers-in-range.js)|Medium|
 2529|[Maximum Count of Positive Integer and Negative Integer](./solutions/2529-maximum-count-of-positive-integer-and-negative-integer.js)|Easy|
 2535|[Difference Between Element Sum and Digit Sum of an Array](./solutions/2535-difference-between-element-sum-and-digit-sum-of-an-array.js)|Easy|
diff --git a/solutions/2522-partition-string-into-substrings-with-values-at-most-k.js b/solutions/2522-partition-string-into-substrings-with-values-at-most-k.js
new file mode 100644
index 00000000..f5777dcf
--- /dev/null
+++ b/solutions/2522-partition-string-into-substrings-with-values-at-most-k.js
@@ -0,0 +1,42 @@
+/**
+ * 2522. Partition String Into Substrings With Values at Most K
+ * https://leetcode.com/problems/partition-string-into-substrings-with-values-at-most-k/
+ * Difficulty: Medium
+ *
+ * You are given a string s consisting of digits from 1 to 9 and an integer k.
+ *
+ * A partition of a string s is called good if:
+ * - Each digit of s is part of exactly one substring.
+ * - The value of each substring is less than or equal to k.
+ *
+ * Return the minimum number of substrings in a good partition of s. If no good partition of
+ * s exists, return -1.
+ *
+ * Note that:
+ * - The value of a string is its result when interpreted as an integer. For example, the value
+ *   of "123" is 123 and the value of "1" is 1.
+ * - A substring is a contiguous sequence of characters within a string.
+ */
+
+/**
+ * @param {string} s
+ * @param {number} k
+ * @return {number}
+ */
+var minimumPartition = function(s, k) {
+  let result = 1;
+  let current = 0;
+
+  for (const digit of s) {
+    const value = current * 10 + Number(digit);
+    if (value <= k) {
+      current = value;
+    } else {
+      if (Number(digit) > k) return -1;
+      current = Number(digit);
+      result++;
+    }
+  }
+
+  return result;
+};

From 31a3618dec6f2381735d72c06577b6b721695658 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 24 May 2025 13:00:33 -0500
Subject: [PATCH 287/571] Add solution #2527

---
 README.md                                  |  3 ++-
 solutions/2527-find-xor-beauty-of-array.js | 30 ++++++++++++++++++++++
 2 files changed, 32 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2527-find-xor-beauty-of-array.js

diff --git a/README.md b/README.md
index 433f4bfa..f886a2a6 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,995 LeetCode solutions in JavaScript
+# 1,996 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1896,6 +1896,7 @@
 2521|[Distinct Prime Factors of Product of Array](./solutions/2521-distinct-prime-factors-of-product-of-array.js)|Medium|
 2522|[Partition String Into Substrings With Values at Most K](./solutions/2522-partition-string-into-substrings-with-values-at-most-k.js)|Medium|
 2523|[Closest Prime Numbers in Range](./solutions/2523-closest-prime-numbers-in-range.js)|Medium|
+2527|[Find Xor-Beauty of Array](./solutions/2527-find-xor-beauty-of-array.js)|Medium|
 2529|[Maximum Count of Positive Integer and Negative Integer](./solutions/2529-maximum-count-of-positive-integer-and-negative-integer.js)|Easy|
 2535|[Difference Between Element Sum and Digit Sum of an Array](./solutions/2535-difference-between-element-sum-and-digit-sum-of-an-array.js)|Easy|
 2537|[Count the Number of Good Subarrays](./solutions/2537-count-the-number-of-good-subarrays.js)|Medium|
diff --git a/solutions/2527-find-xor-beauty-of-array.js b/solutions/2527-find-xor-beauty-of-array.js
new file mode 100644
index 00000000..172eb3e2
--- /dev/null
+++ b/solutions/2527-find-xor-beauty-of-array.js
@@ -0,0 +1,30 @@
+/**
+ * 2527. Find Xor-Beauty of Array
+ * https://leetcode.com/problems/find-xor-beauty-of-array/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed integer array nums.
+ *
+ * The effective value of three indices i, j, and k is defined as ((nums[i] | nums[j]) & nums[k]).
+ *
+ * The xor-beauty of the array is the XORing of the effective values of all the possible triplets
+ * of indices (i, j, k) where 0 <= i, j, k < n.
+ *
+ * Return the xor-beauty of nums.
+ *
+ * Note that:
+ * - val1 | val2 is bitwise OR of val1 and val2.
+ * - val1 & val2 is bitwise AND of val1 and val2.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var xorBeauty = function(nums) {
+  let result = 0;
+  for (const num of nums) {
+    result ^= num;
+  }
+  return result;
+};

From 2614f5d2037953b93892270e37e4ed9c1d161ef9 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 24 May 2025 13:01:42 -0500
Subject: [PATCH 288/571] Add solution #2536

---
 README.md                                     |  3 +-
 .../2536-increment-submatrices-by-one.js      | 46 +++++++++++++++++++
 2 files changed, 48 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2536-increment-submatrices-by-one.js

diff --git a/README.md b/README.md
index f886a2a6..fac00357 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,996 LeetCode solutions in JavaScript
+# 1,997 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1899,6 +1899,7 @@
 2527|[Find Xor-Beauty of Array](./solutions/2527-find-xor-beauty-of-array.js)|Medium|
 2529|[Maximum Count of Positive Integer and Negative Integer](./solutions/2529-maximum-count-of-positive-integer-and-negative-integer.js)|Easy|
 2535|[Difference Between Element Sum and Digit Sum of an Array](./solutions/2535-difference-between-element-sum-and-digit-sum-of-an-array.js)|Easy|
+2536|[Increment Submatrices by One](./solutions/2536-increment-submatrices-by-one.js)|Medium|
 2537|[Count the Number of Good Subarrays](./solutions/2537-count-the-number-of-good-subarrays.js)|Medium|
 2542|[Maximum Subsequence Score](./solutions/2542-maximum-subsequence-score.js)|Medium|
 2551|[Put Marbles in Bags](./solutions/2551-put-marbles-in-bags.js)|Hard|
diff --git a/solutions/2536-increment-submatrices-by-one.js b/solutions/2536-increment-submatrices-by-one.js
new file mode 100644
index 00000000..c5acdddd
--- /dev/null
+++ b/solutions/2536-increment-submatrices-by-one.js
@@ -0,0 +1,46 @@
+/**
+ * 2536. Increment Submatrices by One
+ * https://leetcode.com/problems/increment-submatrices-by-one/
+ * Difficulty: Medium
+ *
+ * You are given a positive integer n, indicating that we initially have an n x n 0-indexed integer
+ * matrix mat filled with zeroes.
+ *
+ * You are also given a 2D integer array query. For each query[i] = [row1i, col1i, row2i, col2i],
+ * you should do the following operation:
+ * - Add 1 to every element in the submatrix with the top left corner (row1i, col1i) and the bottom
+ *   right corner (row2i, col2i). That is, add 1 to mat[x][y] for all row1i <= x <= row2i and
+ *   col1i <= y <= col2i.
+ *
+ * Return the matrix mat after performing every query.
+ */
+
+/**
+ * @param {number} n
+ * @param {number[][]} queries
+ * @return {number[][]}
+ */
+var rangeAddQueries = function(n, queries) {
+  const matrix = new Array(n).fill().map(() => new Array(n).fill(0));
+
+  for (const [row1, col1, row2, col2] of queries) {
+    matrix[row1][col1]++;
+    if (row2 + 1 < n) matrix[row2 + 1][col1]--;
+    if (col2 + 1 < n) matrix[row1][col2 + 1]--;
+    if (row2 + 1 < n && col2 + 1 < n) matrix[row2 + 1][col2 + 1]++;
+  }
+
+  for (let i = 0; i < n; i++) {
+    for (let j = 1; j < n; j++) {
+      matrix[i][j] += matrix[i][j - 1];
+    }
+  }
+
+  for (let i = 1; i < n; i++) {
+    for (let j = 0; j < n; j++) {
+      matrix[i][j] += matrix[i - 1][j];
+    }
+  }
+
+  return matrix;
+};

From 9412c6701f9aaec7c58991e404fa58023af5458f Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 24 May 2025 13:02:48 -0500
Subject: [PATCH 289/571] Add solution #2540

---
 README.md                              |  3 ++-
 solutions/2540-minimum-common-value.js | 29 ++++++++++++++++++++++++++
 2 files changed, 31 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2540-minimum-common-value.js

diff --git a/README.md b/README.md
index fac00357..b2bf0e04 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,997 LeetCode solutions in JavaScript
+# 1,998 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1901,6 +1901,7 @@
 2535|[Difference Between Element Sum and Digit Sum of an Array](./solutions/2535-difference-between-element-sum-and-digit-sum-of-an-array.js)|Easy|
 2536|[Increment Submatrices by One](./solutions/2536-increment-submatrices-by-one.js)|Medium|
 2537|[Count the Number of Good Subarrays](./solutions/2537-count-the-number-of-good-subarrays.js)|Medium|
+2540|[Minimum Common Value](./solutions/2540-minimum-common-value.js)|Easy|
 2542|[Maximum Subsequence Score](./solutions/2542-maximum-subsequence-score.js)|Medium|
 2551|[Put Marbles in Bags](./solutions/2551-put-marbles-in-bags.js)|Hard|
 2559|[Count Vowel Strings in Ranges](./solutions/2559-count-vowel-strings-in-ranges.js)|Medium|
diff --git a/solutions/2540-minimum-common-value.js b/solutions/2540-minimum-common-value.js
new file mode 100644
index 00000000..32b8dea1
--- /dev/null
+++ b/solutions/2540-minimum-common-value.js
@@ -0,0 +1,29 @@
+/**
+ * 2540. Minimum Common Value
+ * https://leetcode.com/problems/minimum-common-value/
+ * Difficulty: Easy
+ *
+ * Given two integer arrays nums1 and nums2, sorted in non-decreasing order, return the minimum
+ * integer common to both arrays. If there is no common integer amongst nums1 and nums2, return -1.
+ *
+ * Note that an integer is said to be common to nums1 and nums2 if both arrays have at least one
+ * occurrence of that integer.
+ */
+
+/**
+ * @param {number[]} nums1
+ * @param {number[]} nums2
+ * @return {number}
+ */
+var getCommon = function(nums1, nums2) {
+  let i = 0;
+  let j = 0;
+
+  while (i < nums1.length && j < nums2.length) {
+    if (nums1[i] === nums2[j]) return nums1[i];
+    if (nums1[i] < nums2[j]) i++;
+    else j++;
+  }
+
+  return -1;
+};

From 7fb7aa9c6ff121565b9294d6b311e0a39702228d Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 24 May 2025 13:04:38 -0500
Subject: [PATCH 290/571] Add solution #2543

---
 README.md                                     |  3 +-
 solutions/2543-check-if-point-is-reachable.js | 40 +++++++++++++++++++
 2 files changed, 42 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2543-check-if-point-is-reachable.js

diff --git a/README.md b/README.md
index b2bf0e04..5624c56a 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,998 LeetCode solutions in JavaScript
+# 1,999 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1903,6 +1903,7 @@
 2537|[Count the Number of Good Subarrays](./solutions/2537-count-the-number-of-good-subarrays.js)|Medium|
 2540|[Minimum Common Value](./solutions/2540-minimum-common-value.js)|Easy|
 2542|[Maximum Subsequence Score](./solutions/2542-maximum-subsequence-score.js)|Medium|
+2543|[Check if Point Is Reachable](./solutions/2543-check-if-point-is-reachable.js)|Hard|
 2551|[Put Marbles in Bags](./solutions/2551-put-marbles-in-bags.js)|Hard|
 2559|[Count Vowel Strings in Ranges](./solutions/2559-count-vowel-strings-in-ranges.js)|Medium|
 2560|[House Robber IV](./solutions/2560-house-robber-iv.js)|Medium|
diff --git a/solutions/2543-check-if-point-is-reachable.js b/solutions/2543-check-if-point-is-reachable.js
new file mode 100644
index 00000000..31d51902
--- /dev/null
+++ b/solutions/2543-check-if-point-is-reachable.js
@@ -0,0 +1,40 @@
+/**
+ * 2543. Check if Point Is Reachable
+ * https://leetcode.com/problems/check-if-point-is-reachable/
+ * Difficulty: Hard
+ *
+ * There exists an infinitely large grid. You are currently at point (1, 1), and you need
+ * to reach the point (targetX, targetY) using a finite number of steps.
+ *
+ * In one step, you can move from point (x, y) to any one of the following points:
+ * - (x, y - x)
+ * - (x - y, y)
+ * - (2 * x, y)
+ * - (x, 2 * y)
+ *
+ * Given two integers targetX and targetY representing the X-coordinate and Y-coordinate of
+ * your final position, return true if you can reach the point from (1, 1) using some number
+ * of steps, and false otherwise.
+ */
+
+/**
+ * @param {number} targetX
+ * @param {number} targetY
+ * @return {boolean}
+ */
+var isReachable = function(targetX, targetY) {
+  let g = gcd(targetX, targetY);
+  while (g % 2 === 0) {
+    g /= 2;
+  }
+
+  return g === 1;
+};
+
+function gcd(a, b) {
+  while (b) {
+    a %= b;
+    [a, b] = [b, a];
+  }
+  return a;
+}

From b001f480629975ebcbf394f679ec6954601ada27 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 24 May 2025 13:05:29 -0500
Subject: [PATCH 291/571] Add solution #2544

---
 README.md                               |  3 ++-
 solutions/2544-alternating-digit-sum.js | 29 +++++++++++++++++++++++++
 2 files changed, 31 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2544-alternating-digit-sum.js

diff --git a/README.md b/README.md
index 5624c56a..753dadfe 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 1,999 LeetCode solutions in JavaScript
+# 2,000 LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1904,6 +1904,7 @@
 2540|[Minimum Common Value](./solutions/2540-minimum-common-value.js)|Easy|
 2542|[Maximum Subsequence Score](./solutions/2542-maximum-subsequence-score.js)|Medium|
 2543|[Check if Point Is Reachable](./solutions/2543-check-if-point-is-reachable.js)|Hard|
+2544|[Alternating Digit Sum](./solutions/2544-alternating-digit-sum.js)|Easy|
 2551|[Put Marbles in Bags](./solutions/2551-put-marbles-in-bags.js)|Hard|
 2559|[Count Vowel Strings in Ranges](./solutions/2559-count-vowel-strings-in-ranges.js)|Medium|
 2560|[House Robber IV](./solutions/2560-house-robber-iv.js)|Medium|
diff --git a/solutions/2544-alternating-digit-sum.js b/solutions/2544-alternating-digit-sum.js
new file mode 100644
index 00000000..49aa7939
--- /dev/null
+++ b/solutions/2544-alternating-digit-sum.js
@@ -0,0 +1,29 @@
+/**
+ * 2544. Alternating Digit Sum
+ * https://leetcode.com/problems/alternating-digit-sum/
+ * Difficulty: Easy
+ *
+ * You are given a positive integer n. Each digit of n has a sign according to the following rules:
+ * - The most significant digit is assigned a positive sign.
+ * - Each other digit has an opposite sign to its adjacent digits.
+ *
+ * Return the sum of all digits with their corresponding sign.
+ */
+
+/**
+ * @param {number} n
+ * @return {number}
+ */
+var alternateDigitSum = function(n) {
+  let sum = 0;
+  let isPositive = true;
+
+  while (n > 0) {
+    const digit = n % 10;
+    sum += isPositive ? digit : -digit;
+    isPositive = !isPositive;
+    n = Math.floor(n / 10);
+  }
+
+  return isPositive ? -sum : sum;
+};

From e244f915c557f017043834cc88c1fd7d3b92f149 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 25 May 2025 00:03:15 -0500
Subject: [PATCH 292/571] Add solution #2545

---
 README.md                                     |  3 ++-
 ...45-sort-the-students-by-their-kth-score.js | 23 +++++++++++++++++++
 2 files changed, 25 insertions(+), 1 deletion(-)
 create mode 100644 solutions/2545-sort-the-students-by-their-kth-score.js

diff --git a/README.md b/README.md
index 753dadfe..4b582e67 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 2,000 LeetCode solutions in JavaScript
+# 2,000+ LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -1905,6 +1905,7 @@
 2542|[Maximum Subsequence Score](./solutions/2542-maximum-subsequence-score.js)|Medium|
 2543|[Check if Point Is Reachable](./solutions/2543-check-if-point-is-reachable.js)|Hard|
 2544|[Alternating Digit Sum](./solutions/2544-alternating-digit-sum.js)|Easy|
+2545|[Sort the Students by Their Kth Score](./solutions/2545-sort-the-students-by-their-kth-score.js)|Medium|
 2551|[Put Marbles in Bags](./solutions/2551-put-marbles-in-bags.js)|Hard|
 2559|[Count Vowel Strings in Ranges](./solutions/2559-count-vowel-strings-in-ranges.js)|Medium|
 2560|[House Robber IV](./solutions/2560-house-robber-iv.js)|Medium|
diff --git a/solutions/2545-sort-the-students-by-their-kth-score.js b/solutions/2545-sort-the-students-by-their-kth-score.js
new file mode 100644
index 00000000..55464ba9
--- /dev/null
+++ b/solutions/2545-sort-the-students-by-their-kth-score.js
@@ -0,0 +1,23 @@
+/**
+ * 2545. Sort the Students by Their Kth Score
+ * https://leetcode.com/problems/sort-the-students-by-their-kth-score/
+ * Difficulty: Medium
+ *
+ * There is a class with m students and n exams. You are given a 0-indexed m x n integer matrix
+ * score, where each row represents one student and score[i][j] denotes the score the ith student
+ * got in the jth exam. The matrix score contains distinct integers only.
+ *
+ * You are also given an integer k. Sort the students (i.e., the rows of the matrix) by their
+ * scores in the kth (0-indexed) exam from the highest to the lowest.
+ *
+ * Return the matrix after sorting it.
+ */
+
+/**
+ * @param {number[][]} score
+ * @param {number} k
+ * @return {number[][]}
+ */
+var sortTheStudents = function(score, k) {
+  return score.sort((studentA, studentB) => studentB[k] - studentA[k]);
+};

From 28b4ba01a68e627abf83631da4d0e63c04a26f6f Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 25 May 2025 00:04:56 -0500
Subject: [PATCH 293/571] Add solution #2546

---
 README.md                                     |  1 +
 ...itwise-operations-to-make-strings-equal.js | 25 +++++++++++++++++++
 2 files changed, 26 insertions(+)
 create mode 100644 solutions/2546-apply-bitwise-operations-to-make-strings-equal.js

diff --git a/README.md b/README.md
index 4b582e67..b029b0b5 100644
--- a/README.md
+++ b/README.md
@@ -1906,6 +1906,7 @@
 2543|[Check if Point Is Reachable](./solutions/2543-check-if-point-is-reachable.js)|Hard|
 2544|[Alternating Digit Sum](./solutions/2544-alternating-digit-sum.js)|Easy|
 2545|[Sort the Students by Their Kth Score](./solutions/2545-sort-the-students-by-their-kth-score.js)|Medium|
+2546|[Apply Bitwise Operations to Make Strings Equal](./solutions/2546-apply-bitwise-operations-to-make-strings-equal.js)|Medium|
 2551|[Put Marbles in Bags](./solutions/2551-put-marbles-in-bags.js)|Hard|
 2559|[Count Vowel Strings in Ranges](./solutions/2559-count-vowel-strings-in-ranges.js)|Medium|
 2560|[House Robber IV](./solutions/2560-house-robber-iv.js)|Medium|
diff --git a/solutions/2546-apply-bitwise-operations-to-make-strings-equal.js b/solutions/2546-apply-bitwise-operations-to-make-strings-equal.js
new file mode 100644
index 00000000..e3b401a5
--- /dev/null
+++ b/solutions/2546-apply-bitwise-operations-to-make-strings-equal.js
@@ -0,0 +1,25 @@
+/**
+ * 2546. Apply Bitwise Operations to Make Strings Equal
+ * https://leetcode.com/problems/apply-bitwise-operations-to-make-strings-equal/
+ * Difficulty: Medium
+ *
+ * You are given two 0-indexed binary strings s and target of the same length n. You can do the
+ * following operation on s any number of times:
+ * - Choose two different indices i and j where 0 <= i, j < n.
+ * - Simultaneously, replace s[i] with (s[i] OR s[j]) and s[j] with (s[i] XOR s[j]).
+ *
+ * For example, if s = "0110", you can choose i = 0 and j = 2, then simultaneously replace s[0]
+ * with (s[0] OR s[2] = 0 OR 1 = 1), and s[2] with (s[0] XOR s[2] = 0 XOR 1 = 1), so we will
+ * have s = "1110".
+ *
+ * Return true if you can make the string s equal to target, or false otherwise.
+ */
+
+/**
+ * @param {string} s
+ * @param {string} target
+ * @return {boolean}
+ */
+var makeStringsEqual = function(s, target) {
+  return (s.includes('1') === target.includes('1'));
+};

From aa1ab97f5002e0baacbe68c9938315f6ffd03cbf Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 25 May 2025 00:06:31 -0500
Subject: [PATCH 294/571] Add solution #2547

---
 README.md                                     |  1 +
 .../2547-minimum-cost-to-split-an-array.js    | 48 +++++++++++++++++++
 2 files changed, 49 insertions(+)
 create mode 100644 solutions/2547-minimum-cost-to-split-an-array.js

diff --git a/README.md b/README.md
index b029b0b5..9b13011f 100644
--- a/README.md
+++ b/README.md
@@ -1907,6 +1907,7 @@
 2544|[Alternating Digit Sum](./solutions/2544-alternating-digit-sum.js)|Easy|
 2545|[Sort the Students by Their Kth Score](./solutions/2545-sort-the-students-by-their-kth-score.js)|Medium|
 2546|[Apply Bitwise Operations to Make Strings Equal](./solutions/2546-apply-bitwise-operations-to-make-strings-equal.js)|Medium|
+2547|[Minimum Cost to Split an Array](./solutions/2547-minimum-cost-to-split-an-array.js)|Hard|
 2551|[Put Marbles in Bags](./solutions/2551-put-marbles-in-bags.js)|Hard|
 2559|[Count Vowel Strings in Ranges](./solutions/2559-count-vowel-strings-in-ranges.js)|Medium|
 2560|[House Robber IV](./solutions/2560-house-robber-iv.js)|Medium|
diff --git a/solutions/2547-minimum-cost-to-split-an-array.js b/solutions/2547-minimum-cost-to-split-an-array.js
new file mode 100644
index 00000000..04732298
--- /dev/null
+++ b/solutions/2547-minimum-cost-to-split-an-array.js
@@ -0,0 +1,48 @@
+/**
+ * 2547. Minimum Cost to Split an Array
+ * https://leetcode.com/problems/minimum-cost-to-split-an-array/
+ * Difficulty: Hard
+ *
+ * You are given an integer array nums and an integer k.
+ *
+ * Split the array into some number of non-empty subarrays. The cost of a split is the sum of
+ * the importance value of each subarray in the split.
+ *
+ * Let trimmed(subarray) be the version of the subarray where all numbers which appear only
+ * once are removed.
+ * - For example, trimmed([3,1,2,4,3,4]) = [3,4,3,4].
+ *
+ * The importance value of a subarray is k + trimmed(subarray).length.
+ * - For example, if a subarray is [1,2,3,3,3,4,4], then trimmed([1,2,3,3,3,4,4]) = [3,3,3,4,4].
+ *   The importance value of this subarray will be k + 5.
+ *
+ * Return the minimum possible cost of a split of nums.
+ *
+ * A subarray is a contiguous non-empty sequence of elements within an array.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} k
+ * @return {number}
+ */
+var minCost = function(nums, k) {
+  const n = nums.length;
+  const dp = new Array(n + 1).fill(Infinity);
+  dp[0] = 0;
+
+  for (let end = 1; end <= n; end++) {
+    const freq = new Map();
+    let trimLen = 0;
+    for (let start = end - 1; start >= 0; start--) {
+      const num = nums[start];
+      const count = (freq.get(num) || 0) + 1;
+      freq.set(num, count);
+      if (count === 1) trimLen++;
+      if (count === 2) trimLen--;
+      dp[end] = Math.min(dp[end], dp[start] + k + (end - start - trimLen));
+    }
+  }
+
+  return dp[n];
+};

From 8fbd8be7aa92680ec49fb88d4edd5faa4c55f558 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 25 May 2025 00:07:37 -0500
Subject: [PATCH 295/571] Add solution #2549

---
 README.md                                     |  1 +
 .../2549-count-distinct-numbers-on-board.js   | 24 +++++++++++++++++++
 2 files changed, 25 insertions(+)
 create mode 100644 solutions/2549-count-distinct-numbers-on-board.js

diff --git a/README.md b/README.md
index 9b13011f..78281399 100644
--- a/README.md
+++ b/README.md
@@ -1908,6 +1908,7 @@
 2545|[Sort the Students by Their Kth Score](./solutions/2545-sort-the-students-by-their-kth-score.js)|Medium|
 2546|[Apply Bitwise Operations to Make Strings Equal](./solutions/2546-apply-bitwise-operations-to-make-strings-equal.js)|Medium|
 2547|[Minimum Cost to Split an Array](./solutions/2547-minimum-cost-to-split-an-array.js)|Hard|
+2549|[Count Distinct Numbers on Board](./solutions/2549-count-distinct-numbers-on-board.js)|Easy|
 2551|[Put Marbles in Bags](./solutions/2551-put-marbles-in-bags.js)|Hard|
 2559|[Count Vowel Strings in Ranges](./solutions/2559-count-vowel-strings-in-ranges.js)|Medium|
 2560|[House Robber IV](./solutions/2560-house-robber-iv.js)|Medium|
diff --git a/solutions/2549-count-distinct-numbers-on-board.js b/solutions/2549-count-distinct-numbers-on-board.js
new file mode 100644
index 00000000..861cd59d
--- /dev/null
+++ b/solutions/2549-count-distinct-numbers-on-board.js
@@ -0,0 +1,24 @@
+/**
+ * 2549. Count Distinct Numbers on Board
+ * https://leetcode.com/problems/count-distinct-numbers-on-board/
+ * Difficulty: Easy
+ *
+ * You are given a positive integer n, that is initially placed on a board. Every day, for
+ * 109 days, you perform the following procedure:
+ * - For each number x present on the board, find all numbers 1 <= i <= n such that x % i == 1.
+ * - Then, place those numbers on the board.
+ *
+ * Return the number of distinct integers present on the board after 109 days have elapsed.
+ *
+ * Note:
+ * - Once a number is placed on the board, it will remain on it until the end.
+ * - % stands for the modulo operation. For example, 14 % 3 is 2.
+ */
+
+/**
+ * @param {number} n
+ * @return {number}
+ */
+var distinctIntegers = function(n) {
+  return n === 1 ? 1 : n - 1;
+};

From 0766c03c76f95527af23f7d73040184fcd881a5e Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 25 May 2025 00:08:34 -0500
Subject: [PATCH 296/571] Add solution #2553

---
 README.md                                     |  1 +
 .../2553-separate-the-digits-in-an-array.js   | 19 +++++++++++++++++++
 2 files changed, 20 insertions(+)
 create mode 100644 solutions/2553-separate-the-digits-in-an-array.js

diff --git a/README.md b/README.md
index 78281399..80ea1406 100644
--- a/README.md
+++ b/README.md
@@ -1910,6 +1910,7 @@
 2547|[Minimum Cost to Split an Array](./solutions/2547-minimum-cost-to-split-an-array.js)|Hard|
 2549|[Count Distinct Numbers on Board](./solutions/2549-count-distinct-numbers-on-board.js)|Easy|
 2551|[Put Marbles in Bags](./solutions/2551-put-marbles-in-bags.js)|Hard|
+2553|[Separate the Digits in an Array](./solutions/2553-separate-the-digits-in-an-array.js)|Easy|
 2559|[Count Vowel Strings in Ranges](./solutions/2559-count-vowel-strings-in-ranges.js)|Medium|
 2560|[House Robber IV](./solutions/2560-house-robber-iv.js)|Medium|
 2563|[Count the Number of Fair Pairs](./solutions/2563-count-the-number-of-fair-pairs.js)|Medium|
diff --git a/solutions/2553-separate-the-digits-in-an-array.js b/solutions/2553-separate-the-digits-in-an-array.js
new file mode 100644
index 00000000..1255dfb6
--- /dev/null
+++ b/solutions/2553-separate-the-digits-in-an-array.js
@@ -0,0 +1,19 @@
+/**
+ * 2553. Separate the Digits in an Array
+ * https://leetcode.com/problems/separate-the-digits-in-an-array/
+ * Difficulty: Easy
+ *
+ * Given an array of positive integers nums, return an array answer that consists of the digits
+ * of each integer in nums after separating them in the same order they appear in nums.
+ *
+ * To separate the digits of an integer is to get all the digits it has in the same order.
+ * - For example, for the integer 10921, the separation of its digits is [1,0,9,2,1].
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number[]}
+ */
+var separateDigits = function(nums) {
+  return nums.flatMap(num => String(num).split('').map(Number));
+};

From 241e4ddcd7180cc223b2f843c63f5beb9b87c8ea Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 25 May 2025 00:11:31 -0500
Subject: [PATCH 297/571] Add solution #2554

---
 README.md                                     |  1 +
 ...er-of-integers-to-choose-from-a-range-i.js | 35 +++++++++++++++++++
 2 files changed, 36 insertions(+)
 create mode 100644 solutions/2554-maximum-number-of-integers-to-choose-from-a-range-i.js

diff --git a/README.md b/README.md
index 80ea1406..9ea60fcc 100644
--- a/README.md
+++ b/README.md
@@ -1911,6 +1911,7 @@
 2549|[Count Distinct Numbers on Board](./solutions/2549-count-distinct-numbers-on-board.js)|Easy|
 2551|[Put Marbles in Bags](./solutions/2551-put-marbles-in-bags.js)|Hard|
 2553|[Separate the Digits in an Array](./solutions/2553-separate-the-digits-in-an-array.js)|Easy|
+2554|[Maximum Number of Integers to Choose From a Range I](./solutions/2554-maximum-number-of-integers-to-choose-from-a-range-i.js)|Medium|
 2559|[Count Vowel Strings in Ranges](./solutions/2559-count-vowel-strings-in-ranges.js)|Medium|
 2560|[House Robber IV](./solutions/2560-house-robber-iv.js)|Medium|
 2563|[Count the Number of Fair Pairs](./solutions/2563-count-the-number-of-fair-pairs.js)|Medium|
diff --git a/solutions/2554-maximum-number-of-integers-to-choose-from-a-range-i.js b/solutions/2554-maximum-number-of-integers-to-choose-from-a-range-i.js
new file mode 100644
index 00000000..bb160607
--- /dev/null
+++ b/solutions/2554-maximum-number-of-integers-to-choose-from-a-range-i.js
@@ -0,0 +1,35 @@
+/**
+ * 2554. Maximum Number of Integers to Choose From a Range I
+ * https://leetcode.com/problems/maximum-number-of-integers-to-choose-from-a-range-i/
+ * Difficulty: Medium
+ *
+ * You are given an integer array banned and two integers n and maxSum. You are choosing some
+ * number of integers following the below rules:
+ * - The chosen integers have to be in the range [1, n].
+ * - Each integer can be chosen at most once.
+ * - The chosen integers should not be in the array banned.
+ * - The sum of the chosen integers should not exceed maxSum.
+ *
+ * Return the maximum number of integers you can choose following the mentioned rules.
+ */
+
+/**
+ * @param {number[]} banned
+ * @param {number} n
+ * @param {number} maxSum
+ * @return {number}
+ */
+var maxCount = function(banned, n, maxSum) {
+  const set = new Set(banned);
+  let result = 0;
+  let currentSum = 0;
+
+  for (let num = 1; num <= n; num++) {
+    if (!set.has(num) && currentSum + num <= maxSum) {
+      result++;
+      currentSum += num;
+    }
+  }
+
+  return result;
+};

From ecf4e5394b6c79038defc1a3a31f8d9cc74babd3 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 25 May 2025 00:12:49 -0500
Subject: [PATCH 298/571] Add solution #2562

---
 README.md                                     |  1 +
 ...2562-find-the-array-concatenation-value.js | 42 +++++++++++++++++++
 2 files changed, 43 insertions(+)
 create mode 100644 solutions/2562-find-the-array-concatenation-value.js

diff --git a/README.md b/README.md
index 9ea60fcc..afb78bfd 100644
--- a/README.md
+++ b/README.md
@@ -1914,6 +1914,7 @@
 2554|[Maximum Number of Integers to Choose From a Range I](./solutions/2554-maximum-number-of-integers-to-choose-from-a-range-i.js)|Medium|
 2559|[Count Vowel Strings in Ranges](./solutions/2559-count-vowel-strings-in-ranges.js)|Medium|
 2560|[House Robber IV](./solutions/2560-house-robber-iv.js)|Medium|
+2562|[Find the Array Concatenation Value](./solutions/2562-find-the-array-concatenation-value.js)|Easy|
 2563|[Count the Number of Fair Pairs](./solutions/2563-count-the-number-of-fair-pairs.js)|Medium|
 2570|[Merge Two 2D Arrays by Summing Values](./solutions/2570-merge-two-2d-arrays-by-summing-values.js)|Easy|
 2579|[Count Total Number of Colored Cells](./solutions/2579-count-total-number-of-colored-cells.js)|Medium|
diff --git a/solutions/2562-find-the-array-concatenation-value.js b/solutions/2562-find-the-array-concatenation-value.js
new file mode 100644
index 00000000..b35decfc
--- /dev/null
+++ b/solutions/2562-find-the-array-concatenation-value.js
@@ -0,0 +1,42 @@
+/**
+ * 2562. Find the Array Concatenation Value
+ * https://leetcode.com/problems/find-the-array-concatenation-value/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed integer array nums.
+ *
+ * The concatenation of two numbers is the number formed by concatenating their numerals.
+ * - For example, the concatenation of 15, 49 is 1549.
+ *
+ * The concatenation value of nums is initially equal to 0. Perform this operation until nums
+ * becomes empty:
+ * - If nums has a size greater than one, add the value of the concatenation of the first and
+ *   the last element to the concatenation value of nums, and remove those two elements from
+ *   nums. For example, if the nums was [1, 2, 4, 5, 6], add 16 to the concatenation value.
+ * - If only one element exists in nums, add its value to the concatenation value of nums,
+ *   then remove it.
+ *
+ * Return the concatenation value of nums.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var findTheArrayConcVal = function(nums) {
+  let result = 0;
+  let left = 0;
+  let right = nums.length - 1;
+
+  while (left <= right) {
+    if (left === right) {
+      result += nums[left];
+    } else {
+      result += Number(`${nums[left]}${nums[right]}`);
+    }
+    left++;
+    right--;
+  }
+
+  return result;
+};

From 0e3229c2d487d334cbd4cdd86c25c70370bd7d05 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 25 May 2025 00:13:50 -0500
Subject: [PATCH 299/571] Add solution #2566

---
 README.md                                     |  1 +
 ...maximum-difference-by-remapping-a-digit.js | 40 +++++++++++++++++++
 2 files changed, 41 insertions(+)
 create mode 100644 solutions/2566-maximum-difference-by-remapping-a-digit.js

diff --git a/README.md b/README.md
index afb78bfd..daeaa7d5 100644
--- a/README.md
+++ b/README.md
@@ -1916,6 +1916,7 @@
 2560|[House Robber IV](./solutions/2560-house-robber-iv.js)|Medium|
 2562|[Find the Array Concatenation Value](./solutions/2562-find-the-array-concatenation-value.js)|Easy|
 2563|[Count the Number of Fair Pairs](./solutions/2563-count-the-number-of-fair-pairs.js)|Medium|
+2566|[Maximum Difference by Remapping a Digit](./solutions/2566-maximum-difference-by-remapping-a-digit.js)|Easy|
 2570|[Merge Two 2D Arrays by Summing Values](./solutions/2570-merge-two-2d-arrays-by-summing-values.js)|Easy|
 2579|[Count Total Number of Colored Cells](./solutions/2579-count-total-number-of-colored-cells.js)|Medium|
 2594|[Minimum Time to Repair Cars](./solutions/2594-minimum-time-to-repair-cars.js)|Medium|
diff --git a/solutions/2566-maximum-difference-by-remapping-a-digit.js b/solutions/2566-maximum-difference-by-remapping-a-digit.js
new file mode 100644
index 00000000..55898513
--- /dev/null
+++ b/solutions/2566-maximum-difference-by-remapping-a-digit.js
@@ -0,0 +1,40 @@
+/**
+ * 2566. Maximum Difference by Remapping a Digit
+ * https://leetcode.com/problems/maximum-difference-by-remapping-a-digit/
+ * Difficulty: Easy
+ *
+ * You are given an integer num. You know that Bob will sneakily remap one of the 10 possible
+ * digits (0 to 9) to another digit.
+ *
+ * Return the difference between the maximum and minimum values Bob can make by remapping
+ * exactly one digit in num.
+ *
+ * Notes:
+ * - When Bob remaps a digit d1 to another digit d2, Bob replaces all occurrences of d1 in
+ *   num with d2.
+ * - Bob can remap a digit to itself, in which case num does not change.
+ * - Bob can remap different digits for obtaining minimum and maximum values respectively.
+ * - The resulting number after remapping can contain leading zeroes.
+ */
+
+/**
+ * @param {number} num
+ * @return {number}
+ */
+var minMaxDifference = function(num) {
+  const digits = String(num).split('');
+  let maxNum = num;
+  let minNum = num;
+
+  for (let i = 0; i < 10; i++) {
+    const digit = String(i);
+    if (digits.includes(digit)) {
+      const maxCandidate = Number(digits.join('').replaceAll(digit, '9'));
+      const minCandidate = Number(digits.join('').replaceAll(digit, '0'));
+      maxNum = Math.max(maxNum, maxCandidate);
+      minNum = Math.min(minNum, minCandidate);
+    }
+  }
+
+  return maxNum - minNum;
+};

From db3bd6182b99c67d4337ec03db1e2f388fea3293 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 25 May 2025 00:15:05 -0500
Subject: [PATCH 300/571] Add solution #2567

---
 README.md                                     |  1 +
 ...-minimum-score-by-changing-two-elements.js | 26 +++++++++++++++++++
 2 files changed, 27 insertions(+)
 create mode 100644 solutions/2567-minimum-score-by-changing-two-elements.js

diff --git a/README.md b/README.md
index daeaa7d5..0da1f6d5 100644
--- a/README.md
+++ b/README.md
@@ -1917,6 +1917,7 @@
 2562|[Find the Array Concatenation Value](./solutions/2562-find-the-array-concatenation-value.js)|Easy|
 2563|[Count the Number of Fair Pairs](./solutions/2563-count-the-number-of-fair-pairs.js)|Medium|
 2566|[Maximum Difference by Remapping a Digit](./solutions/2566-maximum-difference-by-remapping-a-digit.js)|Easy|
+2567|[Minimum Score by Changing Two Elements](./solutions/2567-minimum-score-by-changing-two-elements.js)|Medium|
 2570|[Merge Two 2D Arrays by Summing Values](./solutions/2570-merge-two-2d-arrays-by-summing-values.js)|Easy|
 2579|[Count Total Number of Colored Cells](./solutions/2579-count-total-number-of-colored-cells.js)|Medium|
 2594|[Minimum Time to Repair Cars](./solutions/2594-minimum-time-to-repair-cars.js)|Medium|
diff --git a/solutions/2567-minimum-score-by-changing-two-elements.js b/solutions/2567-minimum-score-by-changing-two-elements.js
new file mode 100644
index 00000000..a5f5d1c5
--- /dev/null
+++ b/solutions/2567-minimum-score-by-changing-two-elements.js
@@ -0,0 +1,26 @@
+/**
+ * 2567. Minimum Score by Changing Two Elements
+ * https://leetcode.com/problems/minimum-score-by-changing-two-elements/
+ * Difficulty: Medium
+ *
+ * You are given an integer array nums.
+ * - The low score of nums is the minimum absolute difference between any two integers.
+ * - The high score of nums is the maximum absolute difference between any two integers.
+ * - The score of nums is the sum of the high and low scores.
+ *
+ * Return the minimum score after changing two elements of nums.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var minimizeSum = function(nums) {
+  const sorted = nums.sort((a, b) => a - b);
+
+  return Math.min(
+    sorted[sorted.length - 2] - sorted[1],
+    sorted[sorted.length - 1] - sorted[2],
+    sorted[sorted.length - 3] - sorted[0]
+  );
+};

From fd4597bacb61adaa360fd861a2671418dbdd70f9 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 25 May 2025 00:16:25 -0500
Subject: [PATCH 301/571] Add solution #2568

---
 README.md                               |  1 +
 solutions/2568-minimum-impossible-or.js | 30 +++++++++++++++++++++++++
 2 files changed, 31 insertions(+)
 create mode 100644 solutions/2568-minimum-impossible-or.js

diff --git a/README.md b/README.md
index 0da1f6d5..447e564d 100644
--- a/README.md
+++ b/README.md
@@ -1918,6 +1918,7 @@
 2563|[Count the Number of Fair Pairs](./solutions/2563-count-the-number-of-fair-pairs.js)|Medium|
 2566|[Maximum Difference by Remapping a Digit](./solutions/2566-maximum-difference-by-remapping-a-digit.js)|Easy|
 2567|[Minimum Score by Changing Two Elements](./solutions/2567-minimum-score-by-changing-two-elements.js)|Medium|
+2568|[Minimum Impossible OR](./solutions/2568-minimum-impossible-or.js)|Medium|
 2570|[Merge Two 2D Arrays by Summing Values](./solutions/2570-merge-two-2d-arrays-by-summing-values.js)|Easy|
 2579|[Count Total Number of Colored Cells](./solutions/2579-count-total-number-of-colored-cells.js)|Medium|
 2594|[Minimum Time to Repair Cars](./solutions/2594-minimum-time-to-repair-cars.js)|Medium|
diff --git a/solutions/2568-minimum-impossible-or.js b/solutions/2568-minimum-impossible-or.js
new file mode 100644
index 00000000..6cb1df58
--- /dev/null
+++ b/solutions/2568-minimum-impossible-or.js
@@ -0,0 +1,30 @@
+/**
+ * 2568. Minimum Impossible OR
+ * https://leetcode.com/problems/minimum-impossible-or/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed integer array nums.
+ *
+ * We say that an integer x is expressible from nums if there exist some integers
+ * 0 <= index1 < index2 < ... < indexk < nums.length for which
+ * nums[index1] | nums[index2] | ... | nums[indexk] = x. In other words, an
+ * integer is expressible if it can be written as the bitwise OR of some subsequence
+ * of nums.
+ *
+ * Return the minimum positive non-zero integer that is not expressible from nums.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var minImpossibleOR = function(nums) {
+  const set = new Set(nums);
+  let result = 1;
+
+  while (set.has(result)) {
+    result <<= 1;
+  }
+
+  return result;
+};

From 3214643fccb6812d32dc24a6290c079ad6d8fb9b Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 25 May 2025 18:50:50 -0500
Subject: [PATCH 302/571] Add solution #2571

---
 README.md                                     |  1 +
 ...um-operations-to-reduce-an-integer-to-0.js | 34 +++++++++++++++++++
 2 files changed, 35 insertions(+)
 create mode 100644 solutions/2571-minimum-operations-to-reduce-an-integer-to-0.js

diff --git a/README.md b/README.md
index 447e564d..1ed2a80c 100644
--- a/README.md
+++ b/README.md
@@ -1920,6 +1920,7 @@
 2567|[Minimum Score by Changing Two Elements](./solutions/2567-minimum-score-by-changing-two-elements.js)|Medium|
 2568|[Minimum Impossible OR](./solutions/2568-minimum-impossible-or.js)|Medium|
 2570|[Merge Two 2D Arrays by Summing Values](./solutions/2570-merge-two-2d-arrays-by-summing-values.js)|Easy|
+2571|[Minimum Operations to Reduce an Integer to 0](./solutions/2571-minimum-operations-to-reduce-an-integer-to-0.js)|Medium|
 2579|[Count Total Number of Colored Cells](./solutions/2579-count-total-number-of-colored-cells.js)|Medium|
 2594|[Minimum Time to Repair Cars](./solutions/2594-minimum-time-to-repair-cars.js)|Medium|
 2615|[Sum of Distances](./solutions/2615-sum-of-distances.js)|Medium|
diff --git a/solutions/2571-minimum-operations-to-reduce-an-integer-to-0.js b/solutions/2571-minimum-operations-to-reduce-an-integer-to-0.js
new file mode 100644
index 00000000..0ee9bb23
--- /dev/null
+++ b/solutions/2571-minimum-operations-to-reduce-an-integer-to-0.js
@@ -0,0 +1,34 @@
+/**
+ * 2571. Minimum Operations to Reduce an Integer to 0
+ * https://leetcode.com/problems/minimum-operations-to-reduce-an-integer-to-0/
+ * Difficulty: Medium
+ *
+ * You are given a positive integer n, you can do the following operation any number of times:
+ * - Add or subtract a power of 2 from n.
+ *
+ * Return the minimum number of operations to make n equal to 0.
+ *
+ * A number x is power of 2 if x == 2i where i >= 0.
+ */
+
+/**
+ * @param {number} n
+ * @return {number}
+ */
+var minOperations = function(n) {
+  let result = 0;
+
+  while (n > 0) {
+    if ((n & 1) === 0) {
+      n >>= 1;
+    } else if ((n & 3) === 3) {
+      n += 1;
+      result++;
+    } else {
+      n -= 1;
+      result++;
+    }
+  }
+
+  return result;
+};

From 757e5194ef14548b5b449f0821343403fb6edbab Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 25 May 2025 18:51:56 -0500
Subject: [PATCH 303/571] Add solution #2574

---
 README.md                                     |  1 +
 .../2574-left-and-right-sum-differences.js    | 34 +++++++++++++++++++
 2 files changed, 35 insertions(+)
 create mode 100644 solutions/2574-left-and-right-sum-differences.js

diff --git a/README.md b/README.md
index 1ed2a80c..657ad623 100644
--- a/README.md
+++ b/README.md
@@ -1921,6 +1921,7 @@
 2568|[Minimum Impossible OR](./solutions/2568-minimum-impossible-or.js)|Medium|
 2570|[Merge Two 2D Arrays by Summing Values](./solutions/2570-merge-two-2d-arrays-by-summing-values.js)|Easy|
 2571|[Minimum Operations to Reduce an Integer to 0](./solutions/2571-minimum-operations-to-reduce-an-integer-to-0.js)|Medium|
+2574|[Left and Right Sum Differences](./solutions/2574-left-and-right-sum-differences.js)|Easy|
 2579|[Count Total Number of Colored Cells](./solutions/2579-count-total-number-of-colored-cells.js)|Medium|
 2594|[Minimum Time to Repair Cars](./solutions/2594-minimum-time-to-repair-cars.js)|Medium|
 2615|[Sum of Distances](./solutions/2615-sum-of-distances.js)|Medium|
diff --git a/solutions/2574-left-and-right-sum-differences.js b/solutions/2574-left-and-right-sum-differences.js
new file mode 100644
index 00000000..e3292140
--- /dev/null
+++ b/solutions/2574-left-and-right-sum-differences.js
@@ -0,0 +1,34 @@
+/**
+ * 2574. Left and Right Sum Differences
+ * https://leetcode.com/problems/left-and-right-sum-differences/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed integer array nums of size n.
+ *
+ * Define two arrays leftSum and rightSum where:
+ * - leftSum[i] is the sum of elements to the left of the index i in the array nums.
+ *   If there is no such element, leftSum[i] = 0.
+ * - rightSum[i] is the sum of elements to the right of the index i in the array nums.
+ *   If there is no such element, rightSum[i] = 0.
+ *
+ * Return an integer array answer of size n where answer[i] = |leftSum[i] - rightSum[i]|.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number[]}
+ */
+var leftRightDifference = function(nums) {
+  const n = nums.length;
+  const result = new Array(n).fill(0);
+  let leftSum = 0;
+  let rightSum = nums.reduce((sum, num) => sum + num, 0);
+
+  for (let i = 0; i < n; i++) {
+    rightSum -= nums[i];
+    result[i] = Math.abs(leftSum - rightSum);
+    leftSum += nums[i];
+  }
+
+  return result;
+};

From 8f0b99341b12c34def1276e1543a7f8b6f3fa615 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 25 May 2025 18:53:02 -0500
Subject: [PATCH 304/571] Add solution #2578

---
 README.md                                |  1 +
 solutions/2578-split-with-minimum-sum.js | 38 ++++++++++++++++++++++++
 2 files changed, 39 insertions(+)
 create mode 100644 solutions/2578-split-with-minimum-sum.js

diff --git a/README.md b/README.md
index 657ad623..0db4269c 100644
--- a/README.md
+++ b/README.md
@@ -1922,6 +1922,7 @@
 2570|[Merge Two 2D Arrays by Summing Values](./solutions/2570-merge-two-2d-arrays-by-summing-values.js)|Easy|
 2571|[Minimum Operations to Reduce an Integer to 0](./solutions/2571-minimum-operations-to-reduce-an-integer-to-0.js)|Medium|
 2574|[Left and Right Sum Differences](./solutions/2574-left-and-right-sum-differences.js)|Easy|
+2578|[Split With Minimum Sum](./solutions/2578-split-with-minimum-sum.js)|Easy|
 2579|[Count Total Number of Colored Cells](./solutions/2579-count-total-number-of-colored-cells.js)|Medium|
 2594|[Minimum Time to Repair Cars](./solutions/2594-minimum-time-to-repair-cars.js)|Medium|
 2615|[Sum of Distances](./solutions/2615-sum-of-distances.js)|Medium|
diff --git a/solutions/2578-split-with-minimum-sum.js b/solutions/2578-split-with-minimum-sum.js
new file mode 100644
index 00000000..3d81e46c
--- /dev/null
+++ b/solutions/2578-split-with-minimum-sum.js
@@ -0,0 +1,38 @@
+/**
+ * 2578. Split With Minimum Sum
+ * https://leetcode.com/problems/split-with-minimum-sum/
+ * Difficulty: Easy
+ *
+ * Given a positive integer num, split it into two non-negative integers num1 and num2 such that:
+ * - The concatenation of num1 and num2 is a permutation of num.
+ *   - In other words, the sum of the number of occurrences of each digit in num1 and num2 is equal
+ *     to the number of occurrences of that digit in num.
+ * - num1 and num2 can contain leading zeros.
+ *
+ * Return the minimum possible sum of num1 and num2.
+ *
+ * Notes:
+ * - It is guaranteed that num does not contain any leading zeros.
+ * - The order of occurrence of the digits in num1 and num2 may differ from the order of occurrence
+ *   of num.
+ */
+
+/**
+ * @param {number} num
+ * @return {number}
+ */
+var splitNum = function(num) {
+  const digits = String(num).split('').sort((a, b) => a - b);
+  let num1 = '';
+  let num2 = '';
+
+  for (let i = 0; i < digits.length; i++) {
+    if (i % 2 === 0) {
+      num1 += digits[i];
+    } else {
+      num2 += digits[i];
+    }
+  }
+
+  return Number(num1) + Number(num2);
+};

From 8105de04e852f7cf89f37096da1bb81c9045c316 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 25 May 2025 18:57:49 -0500
Subject: [PATCH 305/571] Add solution #2581

---
 README.md                                     |  1 +
 ...581-count-number-of-possible-root-nodes.js | 78 +++++++++++++++++++
 2 files changed, 79 insertions(+)
 create mode 100644 solutions/2581-count-number-of-possible-root-nodes.js

diff --git a/README.md b/README.md
index 0db4269c..d9af0c4b 100644
--- a/README.md
+++ b/README.md
@@ -1924,6 +1924,7 @@
 2574|[Left and Right Sum Differences](./solutions/2574-left-and-right-sum-differences.js)|Easy|
 2578|[Split With Minimum Sum](./solutions/2578-split-with-minimum-sum.js)|Easy|
 2579|[Count Total Number of Colored Cells](./solutions/2579-count-total-number-of-colored-cells.js)|Medium|
+2581|[Count Number of Possible Root Nodes](./solutions/2581-count-number-of-possible-root-nodes.js)|Hard|
 2594|[Minimum Time to Repair Cars](./solutions/2594-minimum-time-to-repair-cars.js)|Medium|
 2615|[Sum of Distances](./solutions/2615-sum-of-distances.js)|Medium|
 2618|[Check if Object Instance of Class](./solutions/2618-check-if-object-instance-of-class.js)|Medium|
diff --git a/solutions/2581-count-number-of-possible-root-nodes.js b/solutions/2581-count-number-of-possible-root-nodes.js
new file mode 100644
index 00000000..4d879928
--- /dev/null
+++ b/solutions/2581-count-number-of-possible-root-nodes.js
@@ -0,0 +1,78 @@
+/**
+ * 2581. Count Number of Possible Root Nodes
+ * https://leetcode.com/problems/count-number-of-possible-root-nodes/
+ * Difficulty: Hard
+ *
+ * Alice has an undirected tree with n nodes labeled from 0 to n - 1. The tree is represented as a
+ * 2D integer array edges of length n - 1 where edges[i] = [ai, bi] indicates that there is an edge
+ * between nodes ai and bi in the tree.
+ *
+ * Alice wants Bob to find the root of the tree. She allows Bob to make several guesses about her
+ * tree. In one guess, he does the following:
+ * - Chooses two distinct integers u and v such that there exists an edge [u, v] in the tree.
+ * - He tells Alice that u is the parent of v in the tree.
+ *
+ * Bob's guesses are represented by a 2D integer array guesses where guesses[j] = [uj, vj] indicates
+ * Bob guessed uj to be the parent of vj.
+ *
+ * Alice being lazy, does not reply to each of Bob's guesses, but just says that at least k of his
+ * guesses are true.
+ *
+ * Given the 2D integer arrays edges, guesses and the integer k, return the number of possible
+ * nodes that can be the root of Alice's tree. If there is no such tree, return 0.
+ */
+
+/**
+ * @param {number[][]} edges
+ * @param {number[][]} guesses
+ * @param {number} k
+ * @return {number}
+ */
+var rootCount = function(edges, guesses, k) {
+  const n = edges.length + 1;
+  const adj = Array.from({ length: n }, () => new Set());
+  const set = new Set();
+
+  for (const [u, v] of edges) {
+    adj[u].add(v);
+    adj[v].add(u);
+  }
+
+  for (const [u, v] of guesses) {
+    set.add(u * n + v);
+  }
+
+  const rootCorrect = dfs(0, -1);
+  let result = rootCorrect >= k ? 1 : 0;
+
+  for (const neighbor of adj[0]) {
+    helper(neighbor, 0, rootCorrect);
+  }
+
+  return result;
+
+  function helper(node, parent, parentCorrect) {
+    let count = parentCorrect;
+    if (set.has(parent * n + node)) count--;
+    if (set.has(node * n + parent)) count++;
+
+    if (count >= k) result++;
+
+    for (const neighbor of adj[node]) {
+      if (neighbor !== parent) {
+        helper(neighbor, node, count);
+      }
+    }
+  }
+
+  function dfs(node, parent) {
+    let count = 0;
+    for (const neighbor of adj[node]) {
+      if (neighbor !== parent) {
+        if (set.has(node * n + neighbor)) count++;
+        count += dfs(neighbor, node);
+      }
+    }
+    return count;
+  }
+};

From 344bcdcca7a079fef043b54b5b231e10a1ff0b46 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 25 May 2025 18:59:02 -0500
Subject: [PATCH 306/571] Add solution #2582

---
 README.md                         |  1 +
 solutions/2582-pass-the-pillow.js | 25 +++++++++++++++++++++++++
 2 files changed, 26 insertions(+)
 create mode 100644 solutions/2582-pass-the-pillow.js

diff --git a/README.md b/README.md
index d9af0c4b..efbb85dd 100644
--- a/README.md
+++ b/README.md
@@ -1925,6 +1925,7 @@
 2578|[Split With Minimum Sum](./solutions/2578-split-with-minimum-sum.js)|Easy|
 2579|[Count Total Number of Colored Cells](./solutions/2579-count-total-number-of-colored-cells.js)|Medium|
 2581|[Count Number of Possible Root Nodes](./solutions/2581-count-number-of-possible-root-nodes.js)|Hard|
+2582|[Pass the Pillow](./solutions/2582-pass-the-pillow.js)|Easy|
 2594|[Minimum Time to Repair Cars](./solutions/2594-minimum-time-to-repair-cars.js)|Medium|
 2615|[Sum of Distances](./solutions/2615-sum-of-distances.js)|Medium|
 2618|[Check if Object Instance of Class](./solutions/2618-check-if-object-instance-of-class.js)|Medium|
diff --git a/solutions/2582-pass-the-pillow.js b/solutions/2582-pass-the-pillow.js
new file mode 100644
index 00000000..6f1a17a9
--- /dev/null
+++ b/solutions/2582-pass-the-pillow.js
@@ -0,0 +1,25 @@
+/**
+ * 2582. Pass the Pillow
+ * https://leetcode.com/problems/pass-the-pillow/
+ * Difficulty: Easy
+ *
+ * There are n people standing in a line labeled from 1 to n. The first person in the line is
+ * holding a pillow initially. Every second, the person holding the pillow passes it to the
+ * next person standing in the line. Once the pillow reaches the end of the line, the direction
+ * changes, and people continue passing the pillow in the opposite direction.
+ * - For example, once the pillow reaches the nth person they pass it to the n - 1th person,
+ *   then to the n - 2th person and so on.
+ *
+ * Given the two positive integers n and time, return the index of the person holding the pillow
+ * after time seconds.
+ */
+
+/**
+ * @param {number} n
+ * @param {number} time
+ * @return {number}
+ */
+var passThePillow = function(n, time) {
+  const position = time % (2 * (n - 1));
+  return position < n ? position + 1 : 2 * n - position - 1;
+};

From c1f2baa3af02d87f22516416628e2d4829752d7a Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 25 May 2025 19:00:46 -0500
Subject: [PATCH 307/571] Add solution #3178

---
 README.md                                     |  1 +
 ...-child-who-has-the-ball-after-k-seconds.js | 25 +++++++++++++++++++
 2 files changed, 26 insertions(+)
 create mode 100644 solutions/3178-find-the-child-who-has-the-ball-after-k-seconds.js

diff --git a/README.md b/README.md
index efbb85dd..0520d19e 100644
--- a/README.md
+++ b/README.md
@@ -1997,6 +1997,7 @@
 3160|[Find the Number of Distinct Colors Among the Balls](./solutions/3160-find-the-number-of-distinct-colors-among-the-balls.js)|Medium|
 3169|[Count Days Without Meetings](./solutions/3169-count-days-without-meetings.js)|Medium|
 3174|[Clear Digits](./solutions/3174-clear-digits.js)|Easy|
+3178|[Find the Child Who Has the Ball After K Seconds](./solutions/3178-find-the-child-who-has-the-ball-after-k-seconds.js)|Easy|
 3191|[Minimum Operations to Make Binary Array Elements Equal to One I](./solutions/3191-minimum-operations-to-make-binary-array-elements-equal-to-one-i.js)|Medium|
 3208|[Alternating Groups II](./solutions/3208-alternating-groups-ii.js)|Medium|
 3223|[Minimum Length of String After Operations](./solutions/3223-minimum-length-of-string-after-operations.js)|Medium|
diff --git a/solutions/3178-find-the-child-who-has-the-ball-after-k-seconds.js b/solutions/3178-find-the-child-who-has-the-ball-after-k-seconds.js
new file mode 100644
index 00000000..cdbd5d88
--- /dev/null
+++ b/solutions/3178-find-the-child-who-has-the-ball-after-k-seconds.js
@@ -0,0 +1,25 @@
+/**
+ * 3178. Find the Child Who Has the Ball After K Seconds
+ * https://leetcode.com/problems/find-the-child-who-has-the-ball-after-k-seconds/
+ * Difficulty: Easy
+ *
+ * You are given two positive integers n and k. There are n children numbered from 0 to n - 1
+ * standing in a queue in order from left to right.
+ *
+ * Initially, child 0 holds a ball and the direction of passing the ball is towards the right
+ * direction. After each second, the child holding the ball passes it to the child next to
+ * them. Once the ball reaches either end of the line, i.e. child 0 or child n - 1, the direction
+ * of passing is reversed.
+ *
+ * Return the number of the child who receives the ball after k seconds.
+ */
+
+/**
+ * @param {number} n
+ * @param {number} k
+ * @return {number}
+ */
+var numberOfChild = function(n, k) {
+  const position = k % (2 * (n - 1));
+  return position < n ? position : 2 * n - position - 2;
+};

From 2514c7ba4dca47d6b6f5638c3dcf82551f2bb40a Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 25 May 2025 19:02:36 -0500
Subject: [PATCH 308/571] Add solution #2583

---
 README.md                                     |  1 +
 .../2583-kth-largest-sum-in-a-binary-tree.js  | 50 +++++++++++++++++++
 2 files changed, 51 insertions(+)
 create mode 100644 solutions/2583-kth-largest-sum-in-a-binary-tree.js

diff --git a/README.md b/README.md
index 0520d19e..1c1bfaa9 100644
--- a/README.md
+++ b/README.md
@@ -1926,6 +1926,7 @@
 2579|[Count Total Number of Colored Cells](./solutions/2579-count-total-number-of-colored-cells.js)|Medium|
 2581|[Count Number of Possible Root Nodes](./solutions/2581-count-number-of-possible-root-nodes.js)|Hard|
 2582|[Pass the Pillow](./solutions/2582-pass-the-pillow.js)|Easy|
+2583|[Kth Largest Sum in a Binary Tree](./solutions/2583-kth-largest-sum-in-a-binary-tree.js)|Medium|
 2594|[Minimum Time to Repair Cars](./solutions/2594-minimum-time-to-repair-cars.js)|Medium|
 2615|[Sum of Distances](./solutions/2615-sum-of-distances.js)|Medium|
 2618|[Check if Object Instance of Class](./solutions/2618-check-if-object-instance-of-class.js)|Medium|
diff --git a/solutions/2583-kth-largest-sum-in-a-binary-tree.js b/solutions/2583-kth-largest-sum-in-a-binary-tree.js
new file mode 100644
index 00000000..b8759f23
--- /dev/null
+++ b/solutions/2583-kth-largest-sum-in-a-binary-tree.js
@@ -0,0 +1,50 @@
+/**
+ * 2583. Kth Largest Sum in a Binary Tree
+ * https://leetcode.com/problems/kth-largest-sum-in-a-binary-tree/
+ * Difficulty: Medium
+ *
+ * You are given the root of a binary tree and a positive integer k.
+ *
+ * The level sum in the tree is the sum of the values of the nodes that are on the same level.
+ *
+ * Return the kth largest level sum in the tree (not necessarily distinct). If there are fewer
+ * than k levels in the tree, return -1.
+ *
+ * Note that two nodes are on the same level if they have the same distance from the root.
+ */
+
+/**
+ * Definition for a binary tree node.
+ * function TreeNode(val, left, right) {
+ *     this.val = (val===undefined ? 0 : val)
+ *     this.left = (left===undefined ? null : left)
+ *     this.right = (right===undefined ? null : right)
+ * }
+ */
+/**
+ * @param {TreeNode} root
+ * @param {number} k
+ * @return {number}
+ */
+var kthLargestLevelSum = function(root, k) {
+  const levelSums = [];
+  const queue = [root];
+
+  while (queue.length) {
+    let levelSize = queue.length;
+    let levelSum = 0;
+
+    while (levelSize--) {
+      const node = queue.shift();
+      levelSum += node.val;
+      if (node.left) queue.push(node.left);
+      if (node.right) queue.push(node.right);
+    }
+
+    levelSums.push(levelSum);
+  }
+
+  if (levelSums.length < k) return -1;
+
+  return levelSums.sort((a, b) => b - a)[k - 1];
+};

From 1c8707a4fdc3116189783ddd2ef9ae91f6beee6e Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 25 May 2025 19:03:52 -0500
Subject: [PATCH 309/571] Add solution #2585

---
 README.md                                     |  1 +
 .../2585-number-of-ways-to-earn-points.js     | 37 +++++++++++++++++++
 2 files changed, 38 insertions(+)
 create mode 100644 solutions/2585-number-of-ways-to-earn-points.js

diff --git a/README.md b/README.md
index 1c1bfaa9..34aac4cb 100644
--- a/README.md
+++ b/README.md
@@ -1927,6 +1927,7 @@
 2581|[Count Number of Possible Root Nodes](./solutions/2581-count-number-of-possible-root-nodes.js)|Hard|
 2582|[Pass the Pillow](./solutions/2582-pass-the-pillow.js)|Easy|
 2583|[Kth Largest Sum in a Binary Tree](./solutions/2583-kth-largest-sum-in-a-binary-tree.js)|Medium|
+2585|[Number of Ways to Earn Points](./solutions/2585-number-of-ways-to-earn-points.js)|Hard|
 2594|[Minimum Time to Repair Cars](./solutions/2594-minimum-time-to-repair-cars.js)|Medium|
 2615|[Sum of Distances](./solutions/2615-sum-of-distances.js)|Medium|
 2618|[Check if Object Instance of Class](./solutions/2618-check-if-object-instance-of-class.js)|Medium|
diff --git a/solutions/2585-number-of-ways-to-earn-points.js b/solutions/2585-number-of-ways-to-earn-points.js
new file mode 100644
index 00000000..a88d5050
--- /dev/null
+++ b/solutions/2585-number-of-ways-to-earn-points.js
@@ -0,0 +1,37 @@
+/**
+ * 2585. Number of Ways to Earn Points
+ * https://leetcode.com/problems/number-of-ways-to-earn-points/
+ * Difficulty: Hard
+ *
+ * There is a test that has n types of questions. You are given an integer target and a 0-indexed
+ * 2D integer array types where types[i] = [counti, marksi] indicates that there are counti
+ * questions of the ith type, and each one of them is worth marksi points.
+ *
+ * Return the number of ways you can earn exactly target points in the exam. Since the answer may
+ * be too large, return it modulo 109 + 7.
+ *
+ * Note that questions of the same type are indistinguishable.
+ * - For example, if there are 3 questions of the same type, then solving the 1st and 2nd questions
+ *   is the same as solving the 1st and 3rd questions, or the 2nd and 3rd questions.
+ */
+
+/**
+ * @param {number} target
+ * @param {number[][]} types
+ * @return {number}
+ */
+var waysToReachTarget = function(target, types) {
+  const MOD = 1e9 + 7;
+  const dp = new Array(target + 1).fill(0);
+  dp[0] = 1;
+
+  for (const [count, marks] of types) {
+    for (let points = target; points >= 0; points--) {
+      for (let k = 1; k <= count && points >= k * marks; k++) {
+        dp[points] = (dp[points] + dp[points - k * marks]) % MOD;
+      }
+    }
+  }
+
+  return dp[target];
+};

From dd6ed4095ea355b6509fbbaf03eae6ea15c37e91 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 25 May 2025 19:04:54 -0500
Subject: [PATCH 310/571] Add solution #2586

---
 README.md                                     |  1 +
 ...nt-the-number-of-vowel-strings-in-range.js | 32 +++++++++++++++++++
 2 files changed, 33 insertions(+)
 create mode 100644 solutions/2586-count-the-number-of-vowel-strings-in-range.js

diff --git a/README.md b/README.md
index 34aac4cb..6d61e8f2 100644
--- a/README.md
+++ b/README.md
@@ -1928,6 +1928,7 @@
 2582|[Pass the Pillow](./solutions/2582-pass-the-pillow.js)|Easy|
 2583|[Kth Largest Sum in a Binary Tree](./solutions/2583-kth-largest-sum-in-a-binary-tree.js)|Medium|
 2585|[Number of Ways to Earn Points](./solutions/2585-number-of-ways-to-earn-points.js)|Hard|
+2586|[Count the Number of Vowel Strings in Range](./solutions/2586-count-the-number-of-vowel-strings-in-range.js)|Easy|
 2594|[Minimum Time to Repair Cars](./solutions/2594-minimum-time-to-repair-cars.js)|Medium|
 2615|[Sum of Distances](./solutions/2615-sum-of-distances.js)|Medium|
 2618|[Check if Object Instance of Class](./solutions/2618-check-if-object-instance-of-class.js)|Medium|
diff --git a/solutions/2586-count-the-number-of-vowel-strings-in-range.js b/solutions/2586-count-the-number-of-vowel-strings-in-range.js
new file mode 100644
index 00000000..feff0ca4
--- /dev/null
+++ b/solutions/2586-count-the-number-of-vowel-strings-in-range.js
@@ -0,0 +1,32 @@
+/**
+ * 2586. Count the Number of Vowel Strings in Range
+ * https://leetcode.com/problems/count-the-number-of-vowel-strings-in-range/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed array of string words and two integers left and right.
+ *
+ * A string is called a vowel string if it starts with a vowel character and ends with
+ * a vowel character where vowel characters are 'a', 'e', 'i', 'o', and 'u'.
+ *
+ * Return the number of vowel strings words[i] where i belongs to the inclusive range [left, right].
+ */
+
+/**
+ * @param {string[]} words
+ * @param {number} left
+ * @param {number} right
+ * @return {number}
+ */
+var vowelStrings = function(words, left, right) {
+  const vowels = new Set(['a', 'e', 'i', 'o', 'u']);
+  let result = 0;
+
+  for (let i = left; i <= right; i++) {
+    const word = words[i];
+    if (vowels.has(word[0]) && vowels.has(word[word.length - 1])) {
+      result++;
+    }
+  }
+
+  return result;
+};

From 63004b7f9c2153bd37b65cbb6cff4bf14479f377 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 25 May 2025 19:06:02 -0500
Subject: [PATCH 311/571] Add solution #2587

---
 README.md                                     |  1 +
 ...earrange-array-to-maximize-prefix-score.js | 32 +++++++++++++++++++
 2 files changed, 33 insertions(+)
 create mode 100644 solutions/2587-rearrange-array-to-maximize-prefix-score.js

diff --git a/README.md b/README.md
index 6d61e8f2..91dc1039 100644
--- a/README.md
+++ b/README.md
@@ -1929,6 +1929,7 @@
 2583|[Kth Largest Sum in a Binary Tree](./solutions/2583-kth-largest-sum-in-a-binary-tree.js)|Medium|
 2585|[Number of Ways to Earn Points](./solutions/2585-number-of-ways-to-earn-points.js)|Hard|
 2586|[Count the Number of Vowel Strings in Range](./solutions/2586-count-the-number-of-vowel-strings-in-range.js)|Easy|
+2587|[Rearrange Array to Maximize Prefix Score](./solutions/2587-rearrange-array-to-maximize-prefix-score.js)|Medium|
 2594|[Minimum Time to Repair Cars](./solutions/2594-minimum-time-to-repair-cars.js)|Medium|
 2615|[Sum of Distances](./solutions/2615-sum-of-distances.js)|Medium|
 2618|[Check if Object Instance of Class](./solutions/2618-check-if-object-instance-of-class.js)|Medium|
diff --git a/solutions/2587-rearrange-array-to-maximize-prefix-score.js b/solutions/2587-rearrange-array-to-maximize-prefix-score.js
new file mode 100644
index 00000000..585a0d04
--- /dev/null
+++ b/solutions/2587-rearrange-array-to-maximize-prefix-score.js
@@ -0,0 +1,32 @@
+/**
+ * 2587. Rearrange Array to Maximize Prefix Score
+ * https://leetcode.com/problems/rearrange-array-to-maximize-prefix-score/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed integer array nums. You can rearrange the elements of nums to any
+ * order (including the given order).
+ *
+ * Let prefix be the array containing the prefix sums of nums after rearranging it. In other words,
+ * prefix[i] is the sum of the elements from 0 to i in nums after rearranging it. The score of nums
+ * is the number of positive integers in the array prefix.
+ *
+ * Return the maximum score you can achieve.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var maxScore = function(nums) {
+  const sorted = nums.sort((a, b) => b - a);
+  let prefixSum = 0;
+  let result = 0;
+
+  for (const num of sorted) {
+    prefixSum += num;
+    if (prefixSum > 0) result++;
+    else break;
+  }
+
+  return result;
+};

From e68d280d3f6fe1c74595c7699a6afd30b1588d37 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 25 May 2025 23:24:04 -0500
Subject: [PATCH 312/571] Add solution #2588

---
 README.md                                     |  1 +
 ...count-the-number-of-beautiful-subarrays.js | 36 +++++++++++++++++++
 2 files changed, 37 insertions(+)
 create mode 100644 solutions/2588-count-the-number-of-beautiful-subarrays.js

diff --git a/README.md b/README.md
index 91dc1039..a4a01905 100644
--- a/README.md
+++ b/README.md
@@ -1930,6 +1930,7 @@
 2585|[Number of Ways to Earn Points](./solutions/2585-number-of-ways-to-earn-points.js)|Hard|
 2586|[Count the Number of Vowel Strings in Range](./solutions/2586-count-the-number-of-vowel-strings-in-range.js)|Easy|
 2587|[Rearrange Array to Maximize Prefix Score](./solutions/2587-rearrange-array-to-maximize-prefix-score.js)|Medium|
+2588|[Count the Number of Beautiful Subarrays](./solutions/2588-count-the-number-of-beautiful-subarrays.js)|Medium|
 2594|[Minimum Time to Repair Cars](./solutions/2594-minimum-time-to-repair-cars.js)|Medium|
 2615|[Sum of Distances](./solutions/2615-sum-of-distances.js)|Medium|
 2618|[Check if Object Instance of Class](./solutions/2618-check-if-object-instance-of-class.js)|Medium|
diff --git a/solutions/2588-count-the-number-of-beautiful-subarrays.js b/solutions/2588-count-the-number-of-beautiful-subarrays.js
new file mode 100644
index 00000000..122bc329
--- /dev/null
+++ b/solutions/2588-count-the-number-of-beautiful-subarrays.js
@@ -0,0 +1,36 @@
+/**
+ * 2588. Count the Number of Beautiful Subarrays
+ * https://leetcode.com/problems/count-the-number-of-beautiful-subarrays/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed integer array nums. In one operation, you can:
+ * - Choose two different indices i and j such that 0 <= i, j < nums.length.
+ * - Choose a non-negative integer k such that the kth bit (0-indexed) in the binary representation
+ *   of nums[i] and nums[j] is 1.
+ * - Subtract 2k from nums[i] and nums[j].
+ *
+ * A subarray is beautiful if it is possible to make all of its elements equal to 0 after applying
+ * the above operation any number of times.
+ *
+ * Return the number of beautiful subarrays in the array nums.
+ *
+ * A subarray is a contiguous non-empty sequence of elements within an array.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var beautifulSubarrays = function(nums) {
+  let result = 0;
+  const prefixXOR = new Map([[0, 1]]);
+  let currentXOR = 0;
+
+  for (const num of nums) {
+    currentXOR ^= num;
+    result += prefixXOR.get(currentXOR) || 0;
+    prefixXOR.set(currentXOR, (prefixXOR.get(currentXOR) || 0) + 1);
+  }
+
+  return result;
+};

From 01567c128849e71109278640787f1bbb803ae6b6 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 25 May 2025 23:25:43 -0500
Subject: [PATCH 313/571] Add solution #2592

---
 README.md                                     |  1 +
 .../2592-maximize-greatness-of-an-array.js    | 36 +++++++++++++++++++
 2 files changed, 37 insertions(+)
 create mode 100644 solutions/2592-maximize-greatness-of-an-array.js

diff --git a/README.md b/README.md
index a4a01905..f742c6b0 100644
--- a/README.md
+++ b/README.md
@@ -1931,6 +1931,7 @@
 2586|[Count the Number of Vowel Strings in Range](./solutions/2586-count-the-number-of-vowel-strings-in-range.js)|Easy|
 2587|[Rearrange Array to Maximize Prefix Score](./solutions/2587-rearrange-array-to-maximize-prefix-score.js)|Medium|
 2588|[Count the Number of Beautiful Subarrays](./solutions/2588-count-the-number-of-beautiful-subarrays.js)|Medium|
+2592|[Maximize Greatness of an Array](./solutions/2592-maximize-greatness-of-an-array.js)|Medium|
 2594|[Minimum Time to Repair Cars](./solutions/2594-minimum-time-to-repair-cars.js)|Medium|
 2615|[Sum of Distances](./solutions/2615-sum-of-distances.js)|Medium|
 2618|[Check if Object Instance of Class](./solutions/2618-check-if-object-instance-of-class.js)|Medium|
diff --git a/solutions/2592-maximize-greatness-of-an-array.js b/solutions/2592-maximize-greatness-of-an-array.js
new file mode 100644
index 00000000..07b1edea
--- /dev/null
+++ b/solutions/2592-maximize-greatness-of-an-array.js
@@ -0,0 +1,36 @@
+/**
+ * 2592. Maximize Greatness of an Array
+ * https://leetcode.com/problems/maximize-greatness-of-an-array/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed integer array nums. You are allowed to permute nums into a new
+ * array perm of your choosing.
+ *
+ * We define the greatness of nums be the number of indices 0 <= i < nums.length for which
+ * perm[i] > nums[i].
+ *
+ * Return the maximum possible greatness you can achieve after permuting nums.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var maximizeGreatness = function(nums) {
+  nums.sort((a, b) => a - b);
+  let result = 0;
+  let i = 0;
+  let j = 1;
+
+  while (j < nums.length) {
+    if (nums[j] > nums[i]) {
+      result++;
+      i++;
+      j++;
+    } else {
+      j++;
+    }
+  }
+
+  return result;
+};

From 359a6488376320b41f2dba70923d645047b78995 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 25 May 2025 23:26:40 -0500
Subject: [PATCH 314/571] Add solution #2595

---
 README.md                                     |  1 +
 solutions/2595-number-of-even-and-odd-bits.js | 36 +++++++++++++++++++
 2 files changed, 37 insertions(+)
 create mode 100644 solutions/2595-number-of-even-and-odd-bits.js

diff --git a/README.md b/README.md
index f742c6b0..2f9881e8 100644
--- a/README.md
+++ b/README.md
@@ -1933,6 +1933,7 @@
 2588|[Count the Number of Beautiful Subarrays](./solutions/2588-count-the-number-of-beautiful-subarrays.js)|Medium|
 2592|[Maximize Greatness of an Array](./solutions/2592-maximize-greatness-of-an-array.js)|Medium|
 2594|[Minimum Time to Repair Cars](./solutions/2594-minimum-time-to-repair-cars.js)|Medium|
+2595|[Number of Even and Odd Bits](./solutions/2595-number-of-even-and-odd-bits.js)|Easy|
 2615|[Sum of Distances](./solutions/2615-sum-of-distances.js)|Medium|
 2618|[Check if Object Instance of Class](./solutions/2618-check-if-object-instance-of-class.js)|Medium|
 2619|[Array Prototype Last](./solutions/2619-array-prototype-last.js)|Easy|
diff --git a/solutions/2595-number-of-even-and-odd-bits.js b/solutions/2595-number-of-even-and-odd-bits.js
new file mode 100644
index 00000000..e4508491
--- /dev/null
+++ b/solutions/2595-number-of-even-and-odd-bits.js
@@ -0,0 +1,36 @@
+/**
+ * 2595. Number of Even and Odd Bits
+ * https://leetcode.com/problems/number-of-even-and-odd-bits/
+ * Difficulty: Easy
+ *
+ * You are given a positive integer n.
+ *
+ * Let even denote the number of even indices in the binary representation of n with value 1.
+ *
+ * Let odd denote the number of odd indices in the binary representation of n with value 1.
+ *
+ * Note that bits are indexed from right to left in the binary representation of a number.
+ *
+ * Return the array [even, odd].
+ */
+
+/**
+ * @param {number} n
+ * @return {number[]}
+ */
+var evenOddBit = function(n) {
+  let evenCount = 0;
+  let oddCount = 0;
+  let index = 0;
+
+  while (n > 0) {
+    if (n & 1) {
+      if (index % 2 === 0) evenCount++;
+      else oddCount++;
+    }
+    n >>= 1;
+    index++;
+  }
+
+  return [evenCount, oddCount];
+};

From b9a2b2f36bcf1cfac4a8c7401ea2f15165791441 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 25 May 2025 23:27:52 -0500
Subject: [PATCH 315/571] Add solution #2596

---
 README.md                                     |  1 +
 .../2596-check-knight-tour-configuration.js   | 52 +++++++++++++++++++
 2 files changed, 53 insertions(+)
 create mode 100644 solutions/2596-check-knight-tour-configuration.js

diff --git a/README.md b/README.md
index 2f9881e8..9f3f6f4d 100644
--- a/README.md
+++ b/README.md
@@ -1934,6 +1934,7 @@
 2592|[Maximize Greatness of an Array](./solutions/2592-maximize-greatness-of-an-array.js)|Medium|
 2594|[Minimum Time to Repair Cars](./solutions/2594-minimum-time-to-repair-cars.js)|Medium|
 2595|[Number of Even and Odd Bits](./solutions/2595-number-of-even-and-odd-bits.js)|Easy|
+2596|[Check Knight Tour Configuration](./solutions/2596-check-knight-tour-configuration.js)|Medium|
 2615|[Sum of Distances](./solutions/2615-sum-of-distances.js)|Medium|
 2618|[Check if Object Instance of Class](./solutions/2618-check-if-object-instance-of-class.js)|Medium|
 2619|[Array Prototype Last](./solutions/2619-array-prototype-last.js)|Easy|
diff --git a/solutions/2596-check-knight-tour-configuration.js b/solutions/2596-check-knight-tour-configuration.js
new file mode 100644
index 00000000..d75bc66a
--- /dev/null
+++ b/solutions/2596-check-knight-tour-configuration.js
@@ -0,0 +1,52 @@
+/**
+ * 2596. Check Knight Tour Configuration
+ * https://leetcode.com/problems/check-knight-tour-configuration/
+ * Difficulty: Medium
+ *
+ * There is a knight on an n x n chessboard. In a valid configuration, the knight starts at the
+ * top-left cell of the board and visits every cell on the board exactly once.
+ *
+ * You are given an n x n integer matrix grid consisting of distinct integers from the range
+ * [0, n * n - 1] where grid[row][col] indicates that the cell (row, col) is the grid[row][col]th
+ * cell that the knight visited. The moves are 0-indexed.
+ *
+ * Return true if grid represents a valid configuration of the knight's movements or false
+ * otherwise.
+ *
+ * Note that a valid knight move consists of moving two squares vertically and one square
+ * horizontally, or two squares horizontally and one square vertically. The figure below
+ * illustrates all the possible eight moves of a knight from some cell.
+ */
+
+/**
+ * @param {number[][]} grid
+ * @return {boolean}
+ */
+var checkValidGrid = function(grid) {
+  const n = grid.length;
+  const moves = [[-2, -1], [-2, 1], [-1, -2], [-1, 2], [1, -2], [1, 2], [2, -1], [2, 1]];
+
+  if (grid[0][0] !== 0) return false;
+
+  const isValidMove = (fromRow, fromCol, toRow, toCol) => {
+    for (const [dr, dc] of moves) {
+      if (fromRow + dr === toRow && fromCol + dc === toCol) return true;
+    }
+    return false;
+  };
+
+  const positions = new Array(n * n).fill(0).map(() => [0, 0]);
+  for (let row = 0; row < n; row++) {
+    for (let col = 0; col < n; col++) {
+      positions[grid[row][col]] = [row, col];
+    }
+  }
+
+  for (let i = 1; i < n * n; i++) {
+    const [prevRow, prevCol] = positions[i - 1];
+    const [currRow, currCol] = positions[i];
+    if (!isValidMove(prevRow, prevCol, currRow, currCol)) return false;
+  }
+
+  return true;
+};

From 801d159953e0058d6252fb215f27cb25411daf56 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 25 May 2025 23:29:16 -0500
Subject: [PATCH 316/571] Add solution #2597

---
 README.md                                     |  1 +
 .../2597-the-number-of-beautiful-subsets.js   | 42 +++++++++++++++++++
 2 files changed, 43 insertions(+)
 create mode 100644 solutions/2597-the-number-of-beautiful-subsets.js

diff --git a/README.md b/README.md
index 9f3f6f4d..e066bacd 100644
--- a/README.md
+++ b/README.md
@@ -1935,6 +1935,7 @@
 2594|[Minimum Time to Repair Cars](./solutions/2594-minimum-time-to-repair-cars.js)|Medium|
 2595|[Number of Even and Odd Bits](./solutions/2595-number-of-even-and-odd-bits.js)|Easy|
 2596|[Check Knight Tour Configuration](./solutions/2596-check-knight-tour-configuration.js)|Medium|
+2597|[The Number of Beautiful Subsets](./solutions/2597-the-number-of-beautiful-subsets.js)|Medium|
 2615|[Sum of Distances](./solutions/2615-sum-of-distances.js)|Medium|
 2618|[Check if Object Instance of Class](./solutions/2618-check-if-object-instance-of-class.js)|Medium|
 2619|[Array Prototype Last](./solutions/2619-array-prototype-last.js)|Easy|
diff --git a/solutions/2597-the-number-of-beautiful-subsets.js b/solutions/2597-the-number-of-beautiful-subsets.js
new file mode 100644
index 00000000..9f72486d
--- /dev/null
+++ b/solutions/2597-the-number-of-beautiful-subsets.js
@@ -0,0 +1,42 @@
+/**
+ * 2597. The Number of Beautiful Subsets
+ * https://leetcode.com/problems/the-number-of-beautiful-subsets/
+ * Difficulty: Medium
+ *
+ * You are given an array nums of positive integers and a positive integer k.
+ *
+ * A subset of nums is beautiful if it does not contain two integers with an absolute difference
+ * equal to k.
+ *
+ * Return the number of non-empty beautiful subsets of the array nums.
+ *
+ * A subset of nums is an array that can be obtained by deleting some (possibly none) elements
+ * from nums. Two subsets are different if and only if the chosen indices to delete are different.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} k
+ * @return {number}
+ */
+var beautifulSubsets = function(nums, k) {
+  const n = nums.length;
+  let count = 0;
+  backtrack(0, []);
+  return count;
+
+  function backtrack(index, selected) {
+    if (index === n) {
+      if (selected.length > 0) count++;
+      return;
+    }
+
+    const isValid = selected.every(num => Math.abs(num - nums[index]) !== k);
+
+    backtrack(index + 1, selected);
+
+    if (isValid) {
+      backtrack(index + 1, [...selected, nums[index]]);
+    }
+  }
+};

From ee672d63d5ecee5e6efa14b17eb6e7d4135025bd Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 25 May 2025 23:37:16 -0500
Subject: [PATCH 317/571] Add solution #2600

---
 README.md                                     |  1 +
 .../2600-k-items-with-the-maximum-sum.js      | 38 +++++++++++++++++++
 2 files changed, 39 insertions(+)
 create mode 100644 solutions/2600-k-items-with-the-maximum-sum.js

diff --git a/README.md b/README.md
index e066bacd..5ba9cf78 100644
--- a/README.md
+++ b/README.md
@@ -1936,6 +1936,7 @@
 2595|[Number of Even and Odd Bits](./solutions/2595-number-of-even-and-odd-bits.js)|Easy|
 2596|[Check Knight Tour Configuration](./solutions/2596-check-knight-tour-configuration.js)|Medium|
 2597|[The Number of Beautiful Subsets](./solutions/2597-the-number-of-beautiful-subsets.js)|Medium|
+2600|[K Items With the Maximum Sum](./solutions/2600-k-items-with-the-maximum-sum.js)|Easy|
 2615|[Sum of Distances](./solutions/2615-sum-of-distances.js)|Medium|
 2618|[Check if Object Instance of Class](./solutions/2618-check-if-object-instance-of-class.js)|Medium|
 2619|[Array Prototype Last](./solutions/2619-array-prototype-last.js)|Easy|
diff --git a/solutions/2600-k-items-with-the-maximum-sum.js b/solutions/2600-k-items-with-the-maximum-sum.js
new file mode 100644
index 00000000..c6952fe3
--- /dev/null
+++ b/solutions/2600-k-items-with-the-maximum-sum.js
@@ -0,0 +1,38 @@
+/**
+ * 2600. K Items With the Maximum Sum
+ * https://leetcode.com/problems/k-items-with-the-maximum-sum/
+ * Difficulty: Easy
+ *
+ * There is a bag that consists of items, each item has a number 1, 0, or -1 written on it.
+ *
+ * You are given four non-negative integers numOnes, numZeros, numNegOnes, and k.
+ *
+ * The bag initially contains:
+ * - numOnes items with 1s written on them.
+ * - numZeroes items with 0s written on them.
+ * - numNegOnes items with -1s written on them.
+ *
+ * We want to pick exactly k items among the available items. Return the maximum possible sum
+ * of numbers written on the items.
+ */
+
+/**
+ * @param {number} numOnes
+ * @param {number} numZeros
+ * @param {number} numNegOnes
+ * @param {number} k
+ * @return {number}
+ */
+var kItemsWithMaximumSum = function(numOnes, numZeros, numNegOnes, k) {
+  let result = 0;
+
+  if (k <= numOnes) {
+    result = k;
+  } else if (k <= numOnes + numZeros) {
+    result = numOnes;
+  } else {
+    result = numOnes - (k - numOnes - numZeros);
+  }
+
+  return result;
+};

From 7e3a06093fa37b7af8e27bb0aa6205dc310274bb Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Mon, 26 May 2025 22:20:30 -0500
Subject: [PATCH 318/571] Add solution #2894

---
 README.md                                     |  1 +
 ...sible-and-non-divisible-sums-difference.js | 33 +++++++++++++++++++
 2 files changed, 34 insertions(+)
 create mode 100644 solutions/2894-divisible-and-non-divisible-sums-difference.js

diff --git a/README.md b/README.md
index 5ba9cf78..98b6cfb2 100644
--- a/README.md
+++ b/README.md
@@ -1988,6 +1988,7 @@
 2845|[Count of Interesting Subarrays](./solutions/2845-count-of-interesting-subarrays.js)|Medium|
 2873|[Maximum Value of an Ordered Triplet I](./solutions/2873-maximum-value-of-an-ordered-triplet-i.js)|Easy|
 2874|[Maximum Value of an Ordered Triplet II](./solutions/2874-maximum-value-of-an-ordered-triplet-ii.js)|Medium|
+2894|[Divisible and Non-divisible Sums Difference](./solutions/2894-divisible-and-non-divisible-sums-difference.js)|Easy|
 2900|[Longest Unequal Adjacent Groups Subsequence I](./solutions/2900-longest-unequal-adjacent-groups-subsequence-i.js)|Easy|
 2901|[Longest Unequal Adjacent Groups Subsequence II](./solutions/2901-longest-unequal-adjacent-groups-subsequence-ii.js)|Medium|
 2918|[Minimum Equal Sum of Two Arrays After Replacing Zeros](./solutions/2918-minimum-equal-sum-of-two-arrays-after-replacing-zeros.js)|Medium|
diff --git a/solutions/2894-divisible-and-non-divisible-sums-difference.js b/solutions/2894-divisible-and-non-divisible-sums-difference.js
new file mode 100644
index 00000000..31f068ec
--- /dev/null
+++ b/solutions/2894-divisible-and-non-divisible-sums-difference.js
@@ -0,0 +1,33 @@
+/**
+ * 2894. Divisible and Non-divisible Sums Difference
+ * https://leetcode.com/problems/divisible-and-non-divisible-sums-difference/
+ * Difficulty: Easy
+ *
+ * You are given positive integers n and m.
+ *
+ * Define two integers as follows:
+ * - num1: The sum of all integers in the range [1, n] (both inclusive) that are not divisible by m.
+ * - num2: The sum of all integers in the range [1, n] (both inclusive) that are divisible by m.
+ *
+ * Return the integer num1 - num2.
+ */
+
+/**
+ * @param {number} n
+ * @param {number} m
+ * @return {number}
+ */
+var differenceOfSums = function(n, m) {
+  let nonDivisibleSum = 0;
+  let divisibleSum = 0;
+
+  for (let i = 1; i <= n; i++) {
+    if (i % m === 0) {
+      divisibleSum += i;
+    } else {
+      nonDivisibleSum += i;
+    }
+  }
+
+  return nonDivisibleSum - divisibleSum;
+};

From 48add7a59c781214b4f3df2255787bcce2e49ba0 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Mon, 26 May 2025 22:27:34 -0500
Subject: [PATCH 319/571] Add solution #2601

---
 README.md                                     |  1 +
 solutions/2601-prime-subtraction-operation.js | 62 +++++++++++++++++++
 2 files changed, 63 insertions(+)
 create mode 100644 solutions/2601-prime-subtraction-operation.js

diff --git a/README.md b/README.md
index 98b6cfb2..a369db67 100644
--- a/README.md
+++ b/README.md
@@ -1937,6 +1937,7 @@
 2596|[Check Knight Tour Configuration](./solutions/2596-check-knight-tour-configuration.js)|Medium|
 2597|[The Number of Beautiful Subsets](./solutions/2597-the-number-of-beautiful-subsets.js)|Medium|
 2600|[K Items With the Maximum Sum](./solutions/2600-k-items-with-the-maximum-sum.js)|Easy|
+2601|[Prime Subtraction Operation](./solutions/2601-prime-subtraction-operation.js)|Medium|
 2615|[Sum of Distances](./solutions/2615-sum-of-distances.js)|Medium|
 2618|[Check if Object Instance of Class](./solutions/2618-check-if-object-instance-of-class.js)|Medium|
 2619|[Array Prototype Last](./solutions/2619-array-prototype-last.js)|Easy|
diff --git a/solutions/2601-prime-subtraction-operation.js b/solutions/2601-prime-subtraction-operation.js
new file mode 100644
index 00000000..c9fbc184
--- /dev/null
+++ b/solutions/2601-prime-subtraction-operation.js
@@ -0,0 +1,62 @@
+/**
+ * 2601. Prime Subtraction Operation
+ * https://leetcode.com/problems/prime-subtraction-operation/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed integer array nums of length n.
+ *
+ * You can perform the following operation as many times as you want:
+ * - Pick an index i that you haven’t picked before, and pick a prime p strictly less than
+ *   nums[i], then subtract p from nums[i].
+ *
+ * Return true if you can make nums a strictly increasing array using the above operation
+ * and false otherwise.
+ *
+ * A strictly increasing array is an array whose each element is strictly greater than its
+ * preceding element.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {boolean}
+ */
+var primeSubOperation = function(nums) {
+  const primes = generatePrimes(1000);
+  const adjusted = [...nums];
+  let prev = 0;
+
+  for (let i = 0; i < adjusted.length; i++) {
+    const curr = adjusted[i];
+    let maxPrime = 0;
+
+    for (const prime of primes) {
+      if (prime >= curr) break;
+      if (curr - prime > prev && (i === adjusted.length - 1 || curr - prime < adjusted[i + 1])) {
+        maxPrime = prime;
+      }
+    }
+
+    adjusted[i] -= maxPrime;
+    if (adjusted[i] <= prev) return false;
+    prev = adjusted[i];
+  }
+
+  return true;
+
+  function generatePrimes(limit) {
+    const group = new Array(limit + 1).fill(true);
+    const primes = [];
+    group[0] = group[1] = false;
+
+    for (let i = 2; i <= limit; i++) {
+      if (group[i]) {
+        primes.push(i);
+        for (let j = i * i; j <= limit; j += i) {
+          group[j] = false;
+        }
+      }
+    }
+
+    return primes;
+  }
+};

From 871601b68bd6e3d53e0e7cf5db20d50283c14d3a Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Mon, 26 May 2025 22:29:13 -0500
Subject: [PATCH 320/571] Add solution #2605

---
 README.md                                     |  1 +
 ...m-smallest-number-from-two-digit-arrays.js | 31 +++++++++++++++++++
 2 files changed, 32 insertions(+)
 create mode 100644 solutions/2605-form-smallest-number-from-two-digit-arrays.js

diff --git a/README.md b/README.md
index a369db67..34b6862b 100644
--- a/README.md
+++ b/README.md
@@ -1938,6 +1938,7 @@
 2597|[The Number of Beautiful Subsets](./solutions/2597-the-number-of-beautiful-subsets.js)|Medium|
 2600|[K Items With the Maximum Sum](./solutions/2600-k-items-with-the-maximum-sum.js)|Easy|
 2601|[Prime Subtraction Operation](./solutions/2601-prime-subtraction-operation.js)|Medium|
+2605|[Form Smallest Number From Two Digit Arrays](./solutions/2605-form-smallest-number-from-two-digit-arrays.js)|Easy|
 2615|[Sum of Distances](./solutions/2615-sum-of-distances.js)|Medium|
 2618|[Check if Object Instance of Class](./solutions/2618-check-if-object-instance-of-class.js)|Medium|
 2619|[Array Prototype Last](./solutions/2619-array-prototype-last.js)|Easy|
diff --git a/solutions/2605-form-smallest-number-from-two-digit-arrays.js b/solutions/2605-form-smallest-number-from-two-digit-arrays.js
new file mode 100644
index 00000000..4892b564
--- /dev/null
+++ b/solutions/2605-form-smallest-number-from-two-digit-arrays.js
@@ -0,0 +1,31 @@
+/**
+ * 2605. Form Smallest Number From Two Digit Arrays
+ * https://leetcode.com/problems/form-smallest-number-from-two-digit-arrays/
+ * Difficulty: Easy
+ *
+ * Given two arrays of unique digits nums1 and nums2, return the smallest number that contains
+ * at least one digit from each array.
+ */
+
+/**
+ * @param {number[]} nums1
+ * @param {number[]} nums2
+ * @return {number}
+ */
+var minNumber = function(nums1, nums2) {
+  const set1 = new Set(nums1);
+  const set2 = new Set(nums2);
+  const min1 = Math.min(...nums1);
+  const min2 = Math.min(...nums2);
+  let smallestCommon = 10;
+
+  for (const digit of set1) {
+    if (set2.has(digit) && digit < smallestCommon) {
+      smallestCommon = digit;
+    }
+  }
+
+  if (smallestCommon !== 10) return smallestCommon;
+
+  return min1 < min2 ? min1 * 10 + min2 : min2 * 10 + min1;
+};

From eee204f06b8075effee05749d145d760d4f81f07 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Mon, 26 May 2025 22:31:35 -0500
Subject: [PATCH 321/571] Add solution #2606

---
 README.md                                     |  1 +
 ...06-find-the-substring-with-maximum-cost.js | 42 +++++++++++++++++++
 2 files changed, 43 insertions(+)
 create mode 100644 solutions/2606-find-the-substring-with-maximum-cost.js

diff --git a/README.md b/README.md
index 34b6862b..234f0af2 100644
--- a/README.md
+++ b/README.md
@@ -1939,6 +1939,7 @@
 2600|[K Items With the Maximum Sum](./solutions/2600-k-items-with-the-maximum-sum.js)|Easy|
 2601|[Prime Subtraction Operation](./solutions/2601-prime-subtraction-operation.js)|Medium|
 2605|[Form Smallest Number From Two Digit Arrays](./solutions/2605-form-smallest-number-from-two-digit-arrays.js)|Easy|
+2606|[Find the Substring With Maximum Cost](./solutions/2606-find-the-substring-with-maximum-cost.js)|Medium|
 2615|[Sum of Distances](./solutions/2615-sum-of-distances.js)|Medium|
 2618|[Check if Object Instance of Class](./solutions/2618-check-if-object-instance-of-class.js)|Medium|
 2619|[Array Prototype Last](./solutions/2619-array-prototype-last.js)|Easy|
diff --git a/solutions/2606-find-the-substring-with-maximum-cost.js b/solutions/2606-find-the-substring-with-maximum-cost.js
new file mode 100644
index 00000000..0a4572c5
--- /dev/null
+++ b/solutions/2606-find-the-substring-with-maximum-cost.js
@@ -0,0 +1,42 @@
+/**
+ * 2606. Find the Substring With Maximum Cost
+ * https://leetcode.com/problems/find-the-substring-with-maximum-cost/
+ * Difficulty: Medium
+ *
+ * You are given a string s, a string chars of distinct characters and an integer array vals of
+ * the same length as chars.
+ *
+ * The cost of the substring is the sum of the values of each character in the substring. The
+ * cost of an empty string is considered 0.
+ *
+ * The value of the character is defined in the following way:
+ * - If the character is not in the string chars, then its value is its corresponding position
+ *   (1-indexed) in the alphabet.
+ *   - For example, the value of 'a' is 1, the value of 'b' is 2, and so on. The value of 'z' is 26.
+ * - Otherwise, assuming i is the index where the character occurs in the string chars, then its
+ *   value is vals[i].
+ *
+ * Return the maximum cost among all substrings of the string s.
+ */
+
+/**
+ * @param {string} s
+ * @param {string} chars
+ * @param {number[]} vals
+ * @return {number}
+ */
+var maximumCostSubstring = function(s, chars, vals) {
+  const charValues = new Array(26).fill().map((_, i) => i + 1);
+  for (let i = 0; i < chars.length; i++) {
+    charValues[chars.charCodeAt(i) - 97] = vals[i];
+  }
+
+  let result = 0;
+  let currentCost = 0;
+  for (const char of s) {
+    currentCost = Math.max(0, currentCost + charValues[char.charCodeAt(0) - 97]);
+    result = Math.max(result, currentCost);
+  }
+
+  return result;
+};

From d913ffec1ca3f4abeec5e2368b5fd74583eb9ddf Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 27 May 2025 23:52:21 -0500
Subject: [PATCH 322/571] Add solution #3372

---
 README.md                                     |  1 +
 ...f-target-nodes-after-connecting-trees-i.js | 87 +++++++++++++++++++
 2 files changed, 88 insertions(+)
 create mode 100644 solutions/3372-maximize-the-number-of-target-nodes-after-connecting-trees-i.js

diff --git a/README.md b/README.md
index 234f0af2..ce16e526 100644
--- a/README.md
+++ b/README.md
@@ -2025,6 +2025,7 @@
 3355|[Zero Array Transformation I](./solutions/3355-zero-array-transformation-i.js)|Medium|
 3356|[Zero Array Transformation II](./solutions/3356-zero-array-transformation-ii.js)|Medium|
 3362|[Zero Array Transformation III](./solutions/3362-zero-array-transformation-iii.js)|Medium|
+3372|[Maximize the Number of Target Nodes After Connecting Trees I](./solutions/3372-maximize-the-number-of-target-nodes-after-connecting-trees-i.js)|Medium|
 3375|[Minimum Operations to Make Array Values Equal to K](./solutions/3375-minimum-operations-to-make-array-values-equal-to-k.js)|Easy|
 3392|[Count Subarrays of Length Three With a Condition](./solutions/3392-count-subarrays-of-length-three-with-a-condition.js)|Easy|
 3394|[Check if Grid can be Cut into Sections](./solutions/3394-check-if-grid-can-be-cut-into-sections.js)|Medium|
diff --git a/solutions/3372-maximize-the-number-of-target-nodes-after-connecting-trees-i.js b/solutions/3372-maximize-the-number-of-target-nodes-after-connecting-trees-i.js
new file mode 100644
index 00000000..c4ce5f98
--- /dev/null
+++ b/solutions/3372-maximize-the-number-of-target-nodes-after-connecting-trees-i.js
@@ -0,0 +1,87 @@
+/**
+ * 3372. Maximize the Number of Target Nodes After Connecting Trees I
+ * https://leetcode.com/problems/maximize-the-number-of-target-nodes-after-connecting-trees-i/
+ * Difficulty: Medium
+ *
+ * There exist two undirected trees with n and m nodes, with distinct labels in ranges [0, n - 1]
+ * and [0, m - 1], respectively.
+ *
+ * You are given two 2D integer arrays edges1 and edges2 of lengths n - 1 and m - 1, respectively,
+ * where edges1[i] = [ai, bi] indicates that there is an edge between nodes ai and bi in the first
+ * tree and edges2[i] = [ui, vi] indicates that there is an edge between nodes ui and vi in the
+ * second tree. You are also given an integer k.
+ *
+ * Node u is target to node v if the number of edges on the path from u to v is less than or equal
+ * to k. Note that a node is always target to itself.
+ *
+ * Return an array of n integers answer, where answer[i] is the maximum possible number of nodes
+ * target to node i of the first tree if you have to connect one node from the first tree to
+ * another node in the second tree.
+ *
+ * Note that queries are independent from each other. That is, for every query you will remove
+ * the added edge before proceeding to the next query.
+ */
+
+/**
+ * @param {number[][]} edges1
+ * @param {number[][]} edges2
+ * @param {number} k
+ * @return {number[]}
+ */
+var maxTargetNodes = function(edges1, edges2, k) {
+  const graph1 = buildGraph(edges1);
+  const graph2 = buildGraph(edges2);
+  const n = edges1.length + 1;
+  const m = edges2.length + 1;
+
+  let tree2Max = 0;
+  if (k > 0) {
+    tree2Max = Math.max(...Array.from({ length: m }, (_, i) =>
+      countReachable(graph2, i, k - 1)
+    ));
+  }
+
+  const result = [];
+  for (let i = 0; i < n; i++) {
+    const tree1Count = countReachable(graph1, i, k);
+    result.push(tree1Count + tree2Max);
+  }
+
+  return result;
+
+  function buildGraph(edges) {
+    const graph = {};
+    for (const [u, v] of edges) {
+      if (!graph[u]) graph[u] = [];
+      if (!graph[v]) graph[v] = [];
+      graph[u].push(v);
+      graph[v].push(u);
+    }
+    return graph;
+  }
+
+  function countReachable(graph, start, maxDist) {
+    const queue = [start];
+    const visited = new Set([start]);
+    let count = 1;
+    let dist = 0;
+
+    while (queue.length > 0 && dist < maxDist) {
+      const size = queue.length;
+      dist++;
+      for (let i = 0; i < size; i++) {
+        const node = queue.shift();
+        if (graph[node]) {
+          for (const neighbor of graph[node]) {
+            if (!visited.has(neighbor)) {
+              visited.add(neighbor);
+              queue.push(neighbor);
+              count++;
+            }
+          }
+        }
+      }
+    }
+    return count;
+  }
+};

From 08a3758216ac5a47401e7c7c8512206907512272 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 27 May 2025 23:53:55 -0500
Subject: [PATCH 323/571] Add solution #2609

---
 README.md                                     |  1 +
 ...t-balanced-substring-of-a-binary-string.js | 45 +++++++++++++++++++
 2 files changed, 46 insertions(+)
 create mode 100644 solutions/2609-find-the-longest-balanced-substring-of-a-binary-string.js

diff --git a/README.md b/README.md
index ce16e526..e20be8ef 100644
--- a/README.md
+++ b/README.md
@@ -1940,6 +1940,7 @@
 2601|[Prime Subtraction Operation](./solutions/2601-prime-subtraction-operation.js)|Medium|
 2605|[Form Smallest Number From Two Digit Arrays](./solutions/2605-form-smallest-number-from-two-digit-arrays.js)|Easy|
 2606|[Find the Substring With Maximum Cost](./solutions/2606-find-the-substring-with-maximum-cost.js)|Medium|
+2609|[Find the Longest Balanced Substring of a Binary String](./solutions/2609-find-the-longest-balanced-substring-of-a-binary-string.js)|Easy|
 2615|[Sum of Distances](./solutions/2615-sum-of-distances.js)|Medium|
 2618|[Check if Object Instance of Class](./solutions/2618-check-if-object-instance-of-class.js)|Medium|
 2619|[Array Prototype Last](./solutions/2619-array-prototype-last.js)|Easy|
diff --git a/solutions/2609-find-the-longest-balanced-substring-of-a-binary-string.js b/solutions/2609-find-the-longest-balanced-substring-of-a-binary-string.js
new file mode 100644
index 00000000..3884e54e
--- /dev/null
+++ b/solutions/2609-find-the-longest-balanced-substring-of-a-binary-string.js
@@ -0,0 +1,45 @@
+/**
+ * 2609. Find the Longest Balanced Substring of a Binary String
+ * https://leetcode.com/problems/find-the-longest-balanced-substring-of-a-binary-string/
+ * Difficulty: Easy
+ *
+ * You are given a binary string s consisting only of zeroes and ones.
+ *
+ * A substring of s is considered balanced if all zeroes are before ones and the number of zeroes
+ * is equal to the number of ones inside the substring. Notice that the empty substring is
+ * considered a balanced substring.
+ *
+ * Return the length of the longest balanced substring of s.
+ *
+ * A substring is a contiguous sequence of characters within a string.
+ */
+
+/**
+ * @param {string} s
+ * @return {number}
+ */
+var findTheLongestBalancedSubstring = function(s) {
+  let result = 0;
+  let zeros = 0;
+  let ones = 0;
+
+  for (let i = 0; i < s.length; i++) {
+    if (s[i] === '0') {
+      if (ones > 0) {
+        zeros = 0;
+        ones = 0;
+      }
+      zeros++;
+    } else {
+      if (zeros >= ones + 1) {
+        ones++;
+        result = Math.max(result, 2 * ones);
+      } else {
+        zeros = 0;
+        ones = 0;
+      }
+    }
+  }
+
+  return result;
+};

From 087a594be12978a7141948229a464919e28bbe49 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 27 May 2025 23:55:07 -0500
Subject: [PATCH 324/571] Add solution #2610

---
 README.md                                     |  1 +
 ...n-array-into-a-2d-array-with-conditions.js | 42 +++++++++++++++++++
 2 files changed, 43 insertions(+)
 create mode 100644 solutions/2610-convert-an-array-into-a-2d-array-with-conditions.js

diff --git a/README.md b/README.md
index e20be8ef..53856d04 100644
--- a/README.md
+++ b/README.md
@@ -1941,6 +1941,7 @@
 2605|[Form Smallest Number From Two Digit Arrays](./solutions/2605-form-smallest-number-from-two-digit-arrays.js)|Easy|
 2606|[Find the Substring With Maximum Cost](./solutions/2606-find-the-substring-with-maximum-cost.js)|Medium|
 2609|[Find the Longest Balanced Substring of a Binary String](./solutions/2609-find-the-longest-balanced-substring-of-a-binary-string.js)|Easy|
+2610|[Convert an Array Into a 2D Array With Conditions](./solutions/2610-convert-an-array-into-a-2d-array-with-conditions.js)|Medium|
 2615|[Sum of Distances](./solutions/2615-sum-of-distances.js)|Medium|
 2618|[Check if Object Instance of Class](./solutions/2618-check-if-object-instance-of-class.js)|Medium|
 2619|[Array Prototype Last](./solutions/2619-array-prototype-last.js)|Easy|
diff --git a/solutions/2610-convert-an-array-into-a-2d-array-with-conditions.js b/solutions/2610-convert-an-array-into-a-2d-array-with-conditions.js
new file mode 100644
index 00000000..7c584818
--- /dev/null
+++ b/solutions/2610-convert-an-array-into-a-2d-array-with-conditions.js
@@ -0,0 +1,42 @@
+/**
+ * 2610. Convert an Array Into a 2D Array With Conditions
+ * https://leetcode.com/problems/convert-an-array-into-a-2d-array-with-conditions/
+ * Difficulty: Medium
+ *
+ * You are given an integer array nums. You need to create a 2D array from nums satisfying
+ * the following conditions:
+ * - The 2D array should contain only the elements of the array nums.
+ * - Each row in the 2D array contains distinct integers.
+ * - The number of rows in the 2D array should be minimal.
+ *
+ * Return the resulting array. If there are multiple answers, return any of them.
+ *
+ * Note that the 2D array can have a different number of elements on each row.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number[][]}
+ */
+var findMatrix = function(nums) {
+  const frequency = new Map();
+  for (const num of nums) {
+    frequency.set(num, (frequency.get(num) || 0) + 1);
+  }
+
+  const result = [];
+  while (frequency.size) {
+    const row = [];
+    for (const [num, count] of frequency) {
+      row.push(num);
+      if (count === 1) {
+        frequency.delete(num);
+      } else {
+        frequency.set(num, count - 1);
+      }
+    }
+    result.push(row);
+  }
+
+  return result;
+};

From 5df4e7bdf28edcc5ff71f299d7c6434767c6469d Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 27 May 2025 23:56:25 -0500
Subject: [PATCH 325/571] Add solution #2616

---
 README.md                                     |  1 +
 ...inimize-the-maximum-difference-of-pairs.js | 53 +++++++++++++++++++
 2 files changed, 54 insertions(+)
 create mode 100644 solutions/2616-minimize-the-maximum-difference-of-pairs.js

diff --git a/README.md b/README.md
index 53856d04..15946b34 100644
--- a/README.md
+++ b/README.md
@@ -1943,6 +1943,7 @@
 2609|[Find the Longest Balanced Substring of a Binary String](./solutions/2609-find-the-longest-balanced-substring-of-a-binary-string.js)|Easy|
 2610|[Convert an Array Into a 2D Array With Conditions](./solutions/2610-convert-an-array-into-a-2d-array-with-conditions.js)|Medium|
 2615|[Sum of Distances](./solutions/2615-sum-of-distances.js)|Medium|
+2616|[Minimize the Maximum Difference of Pairs](./solutions/2616-minimize-the-maximum-difference-of-pairs.js)|Medium|
 2618|[Check if Object Instance of Class](./solutions/2618-check-if-object-instance-of-class.js)|Medium|
 2619|[Array Prototype Last](./solutions/2619-array-prototype-last.js)|Easy|
 2620|[Counter](./solutions/2620-counter.js)|Easy|
diff --git a/solutions/2616-minimize-the-maximum-difference-of-pairs.js b/solutions/2616-minimize-the-maximum-difference-of-pairs.js
new file mode 100644
index 00000000..691f2e60
--- /dev/null
+++ b/solutions/2616-minimize-the-maximum-difference-of-pairs.js
@@ -0,0 +1,53 @@
+/**
+ * 2616. Minimize the Maximum Difference of Pairs
+ * https://leetcode.com/problems/minimize-the-maximum-difference-of-pairs/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed integer array nums and an integer p. Find p pairs of indices
+ * of nums such that the maximum difference amongst all the pairs is minimized. Also, ensure
+ * no index appears more than once amongst the p pairs.
+ *
+ * Note that for a pair of elements at the index i and j, the difference of this pair is
+ * |nums[i] - nums[j]|, where |x| represents the absolute value of x.
+ *
+ * Return the minimum maximum difference among all p pairs. We define the maximum of an empty
+ * set to be zero.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} p
+ * @return {number}
+ */
+var minimizeMax = function(nums, p) {
+  nums.sort((a, b) => a - b);
+  const n = nums.length;
+
+  let left = 0;
+  let right = nums[n - 1] - nums[0];
+  let result = 0;
+
+  while (left <= right) {
+    const mid = Math.floor((left + right) / 2);
+    if (canFormPairs(mid)) {
+      result = mid;
+      right = mid - 1;
+    } else {
+      left = mid + 1;
+    }
+  }
+
+  return result;
+
+  function canFormPairs(maxDiff) {
+    let pairs = 0;
+    for (let i = 0; i < n - 1 && pairs < p; i += 2) {
+      if (nums[i + 1] - nums[i] <= maxDiff) {
+        pairs++;
+      } else {
+        i--;
+      }
+    }
+    return pairs >= p;
+  }
+};

From df1b48592891773ad968e56e3d50732fe88d06b2 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 27 May 2025 23:58:28 -0500
Subject: [PATCH 326/571] Add solution #2639

---
 README.md                                     |  1 +
 ...639-find-the-width-of-columns-of-a-grid.js | 34 +++++++++++++++++++
 2 files changed, 35 insertions(+)
 create mode 100644 solutions/2639-find-the-width-of-columns-of-a-grid.js

diff --git a/README.md b/README.md
index 15946b34..d7aeb8c8 100644
--- a/README.md
+++ b/README.md
@@ -1960,6 +1960,7 @@
 2634|[Filter Elements from Array](./solutions/2634-filter-elements-from-array.js)|Easy|
 2635|[Apply Transform Over Each Element in Array](./solutions/2635-apply-transform-over-each-element-in-array.js)|Easy|
 2637|[Promise Time Limit](./solutions/2637-promise-time-limit.js)|Medium|
+2639|[Find the Width of Columns of a Grid](./solutions/2639-find-the-width-of-columns-of-a-grid.js)|Easy|
 2648|[Generate Fibonacci Sequence](./solutions/2648-generate-fibonacci-sequence.js)|Easy|
 2649|[Nested Array Generator](./solutions/2649-nested-array-generator.js)|Medium|
 2650|[Design Cancellable Function](./solutions/2650-design-cancellable-function.js)|Hard|
diff --git a/solutions/2639-find-the-width-of-columns-of-a-grid.js b/solutions/2639-find-the-width-of-columns-of-a-grid.js
new file mode 100644
index 00000000..e544bc23
--- /dev/null
+++ b/solutions/2639-find-the-width-of-columns-of-a-grid.js
@@ -0,0 +1,34 @@
+/**
+ * 2639. Find the Width of Columns of a Grid
+ * https://leetcode.com/problems/find-the-width-of-columns-of-a-grid/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed m x n integer matrix grid. The width of a column is the
+ * maximum length of its integers.
+ * - For example, if grid = [[-10], [3], [12]], the width of the only column is 3
+ *   since -10 is of length 3.
+ *
+ * Return an integer array ans of size n where ans[i] is the width of the ith column.
+ *
+ * The length of an integer x with len digits is equal to len if x is non-negative, and
+ * len + 1 otherwise.
+ */
+
+/**
+ * @param {number[][]} grid
+ * @return {number[]}
+ */
+var findColumnWidth = function(grid) {
+  const rows = grid.length;
+  const cols = grid[0].length;
+  const result = new Array(cols).fill(0);
+
+  for (let col = 0; col < cols; col++) {
+    for (let row = 0; row < rows; row++) {
+      const num = grid[row][col];
+      result[col] = Math.max(result[col], String(num).length);
+    }
+  }
+
+  return result;
+};

From d5fd25111b81552ea3d3478ed7fb853496737ed7 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 28 May 2025 00:00:31 -0500
Subject: [PATCH 327/571] Add solution #2640

---
 README.md                                     |  1 +
 ...d-the-score-of-all-prefixes-of-an-array.js | 32 +++++++++++++++++++
 2 files changed, 33 insertions(+)
 create mode 100644 solutions/2640-find-the-score-of-all-prefixes-of-an-array.js

diff --git a/README.md b/README.md
index d7aeb8c8..88f071b3 100644
--- a/README.md
+++ b/README.md
@@ -1961,6 +1961,7 @@
 2635|[Apply Transform Over Each Element in Array](./solutions/2635-apply-transform-over-each-element-in-array.js)|Easy|
 2637|[Promise Time Limit](./solutions/2637-promise-time-limit.js)|Medium|
 2639|[Find the Width of Columns of a Grid](./solutions/2639-find-the-width-of-columns-of-a-grid.js)|Easy|
+2640|[Find the Score of All Prefixes of an Array](./solutions/2640-find-the-score-of-all-prefixes-of-an-array.js)|Medium|
 2648|[Generate Fibonacci Sequence](./solutions/2648-generate-fibonacci-sequence.js)|Easy|
 2649|[Nested Array Generator](./solutions/2649-nested-array-generator.js)|Medium|
 2650|[Design Cancellable Function](./solutions/2650-design-cancellable-function.js)|Hard|
diff --git a/solutions/2640-find-the-score-of-all-prefixes-of-an-array.js b/solutions/2640-find-the-score-of-all-prefixes-of-an-array.js
new file mode 100644
index 00000000..9ec56b99
--- /dev/null
+++ b/solutions/2640-find-the-score-of-all-prefixes-of-an-array.js
@@ -0,0 +1,32 @@
+/**
+ * 2640. Find the Score of All Prefixes of an Array
+ * https://leetcode.com/problems/find-the-score-of-all-prefixes-of-an-array/
+ * Difficulty: Medium
+ *
+ * We define the conversion array conver of an array arr as follows:
+ * - conver[i] = arr[i] + max(arr[0..i]) where max(arr[0..i]) is the maximum value of
+ *   arr[j] over 0 <= j <= i.
+ *
+ * We also define the score of an array arr as the sum of the values of the conversion array of arr.
+ *
+ * Given a 0-indexed integer array nums of length n, return an array ans of length n where ans[i]
+ * is the score of the prefix nums[0..i].
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number[]}
+ */
+var findPrefixScore = function(nums) {
+  const result = new Array(nums.length);
+  let maxSoFar = 0;
+  let total = 0;
+
+  for (let i = 0; i < nums.length; i++) {
+    maxSoFar = Math.max(maxSoFar, nums[i]);
+    total += nums[i] + maxSoFar;
+    result[i] = total;
+  }
+
+  return result;
+};

From 256f59a06c6ada9a3d34121f99f5d7227a0fba8c Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 28 May 2025 00:02:10 -0500
Subject: [PATCH 328/571] Add solution #2641

---
 README.md                                   |  1 +
 solutions/2641-cousins-in-binary-tree-ii.js | 53 +++++++++++++++++++++
 2 files changed, 54 insertions(+)
 create mode 100644 solutions/2641-cousins-in-binary-tree-ii.js

diff --git a/README.md b/README.md
index 88f071b3..4685a1b0 100644
--- a/README.md
+++ b/README.md
@@ -1962,6 +1962,7 @@
 2637|[Promise Time Limit](./solutions/2637-promise-time-limit.js)|Medium|
 2639|[Find the Width of Columns of a Grid](./solutions/2639-find-the-width-of-columns-of-a-grid.js)|Easy|
 2640|[Find the Score of All Prefixes of an Array](./solutions/2640-find-the-score-of-all-prefixes-of-an-array.js)|Medium|
+2641|[Cousins in Binary Tree II](./solutions/2641-cousins-in-binary-tree-ii.js)|Medium|
 2648|[Generate Fibonacci Sequence](./solutions/2648-generate-fibonacci-sequence.js)|Easy|
 2649|[Nested Array Generator](./solutions/2649-nested-array-generator.js)|Medium|
 2650|[Design Cancellable Function](./solutions/2650-design-cancellable-function.js)|Hard|
diff --git a/solutions/2641-cousins-in-binary-tree-ii.js b/solutions/2641-cousins-in-binary-tree-ii.js
new file mode 100644
index 00000000..07faea41
--- /dev/null
+++ b/solutions/2641-cousins-in-binary-tree-ii.js
@@ -0,0 +1,53 @@
+/**
+ * 2641. Cousins in Binary Tree II
+ * https://leetcode.com/problems/cousins-in-binary-tree-ii/
+ * Difficulty: Medium
+ *
+ * Given the root of a binary tree, replace the value of each node in the tree with the
+ * sum of all its cousins' values.
+ *
+ * Two nodes of a binary tree are cousins if they have the same depth with different parents.
+ *
+ * Return the root of the modified tree.
+ *
+ * Note that the depth of a node is the number of edges in the path from the root node to it.
+ */
+
+/**
+ * Definition for a binary tree node.
+ * function TreeNode(val, left, right) {
+ *     this.val = (val===undefined ? 0 : val)
+ *     this.left = (left===undefined ? null : left)
+ *     this.right = (right===undefined ? null : right)
+ * }
+ */
+/**
+ * @param {TreeNode} root
+ * @return {TreeNode}
+ */
+var replaceValueInTree = function(root) {
+  const levelSums = [];
+
+  collectSums(root, 0);
+  replaceValues(root, 0, 0);
+
+  return root;
+
+  function collectSums(node, depth) {
+    if (!node) return;
+    if (levelSums.length <= depth) levelSums.push(0);
+    levelSums[depth] += node.val;
+    collectSums(node.left, depth + 1);
+    collectSums(node.right, depth + 1);
+  }
+
+  function replaceValues(node, depth, siblingSum) {
+    if (!node) return;
+    node.val = levelSums[depth] - node.val - siblingSum;
+
+    const leftVal = node.left ? node.left.val : 0;
+    const rightVal = node.right ? node.right.val : 0;
+    replaceValues(node.left, depth + 1, rightVal);
+    replaceValues(node.right, depth + 1, leftVal);
+  }
+};

From 86120636b5d714f5361551c97d5849992b272dcf Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 28 May 2025 00:03:15 -0500
Subject: [PATCH 329/571] Add solution #2643

---
 README.md                               |  1 +
 solutions/2643-row-with-maximum-ones.js | 32 +++++++++++++++++++++++++
 2 files changed, 33 insertions(+)
 create mode 100644 solutions/2643-row-with-maximum-ones.js

diff --git a/README.md b/README.md
index 4685a1b0..de4d6d9a 100644
--- a/README.md
+++ b/README.md
@@ -1963,6 +1963,7 @@
 2639|[Find the Width of Columns of a Grid](./solutions/2639-find-the-width-of-columns-of-a-grid.js)|Easy|
 2640|[Find the Score of All Prefixes of an Array](./solutions/2640-find-the-score-of-all-prefixes-of-an-array.js)|Medium|
 2641|[Cousins in Binary Tree II](./solutions/2641-cousins-in-binary-tree-ii.js)|Medium|
+2643|[Row With Maximum Ones](./solutions/2643-row-with-maximum-ones.js)|Easy|
 2648|[Generate Fibonacci Sequence](./solutions/2648-generate-fibonacci-sequence.js)|Easy|
 2649|[Nested Array Generator](./solutions/2649-nested-array-generator.js)|Medium|
 2650|[Design Cancellable Function](./solutions/2650-design-cancellable-function.js)|Hard|
diff --git a/solutions/2643-row-with-maximum-ones.js b/solutions/2643-row-with-maximum-ones.js
new file mode 100644
index 00000000..aaa37e79
--- /dev/null
+++ b/solutions/2643-row-with-maximum-ones.js
@@ -0,0 +1,32 @@
+/**
+ * 2643. Row With Maximum Ones
+ * https://leetcode.com/problems/row-with-maximum-ones/
+ * Difficulty: Easy
+ *
+ * Given a m x n binary matrix mat, find the 0-indexed position of the row that contains
+ * the maximum count of ones, and the number of ones in that row.
+ *
+ * In case there are multiple rows that have the maximum count of ones, the row with the
+ * smallest row number should be selected.
+ *
+ * Return an array containing the index of the row, and the number of ones in it.
+ */
+
+/**
+ * @param {number[][]} mat
+ * @return {number[]}
+ */
+var rowAndMaximumOnes = function(mat) {
+  let maxOnes = 0;
+  let maxRow = 0;
+
+  for (let row = 0; row < mat.length; row++) {
+    const ones = mat[row].reduce((sum, val) => sum + val, 0);
+    if (ones > maxOnes) {
+      maxOnes = ones;
+      maxRow = row;
+    }
+  }
+
+  return [maxRow, maxOnes];
+};

From 3430ee44f15dd64d2535bbb92fe5e7a21d0045a9 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 28 May 2025 00:04:08 -0500
Subject: [PATCH 330/571] Add solution #2644

---
 README.md                                     |  1 +
 ...644-find-the-maximum-divisibility-score.js | 38 +++++++++++++++++++
 2 files changed, 39 insertions(+)
 create mode 100644 solutions/2644-find-the-maximum-divisibility-score.js

diff --git a/README.md b/README.md
index de4d6d9a..1ee91b26 100644
--- a/README.md
+++ b/README.md
@@ -1964,6 +1964,7 @@
 2640|[Find the Score of All Prefixes of an Array](./solutions/2640-find-the-score-of-all-prefixes-of-an-array.js)|Medium|
 2641|[Cousins in Binary Tree II](./solutions/2641-cousins-in-binary-tree-ii.js)|Medium|
 2643|[Row With Maximum Ones](./solutions/2643-row-with-maximum-ones.js)|Easy|
+2644|[Find the Maximum Divisibility Score](./solutions/2644-find-the-maximum-divisibility-score.js)|Easy|
 2648|[Generate Fibonacci Sequence](./solutions/2648-generate-fibonacci-sequence.js)|Easy|
 2649|[Nested Array Generator](./solutions/2649-nested-array-generator.js)|Medium|
 2650|[Design Cancellable Function](./solutions/2650-design-cancellable-function.js)|Hard|
diff --git a/solutions/2644-find-the-maximum-divisibility-score.js b/solutions/2644-find-the-maximum-divisibility-score.js
new file mode 100644
index 00000000..ac5c2e02
--- /dev/null
+++ b/solutions/2644-find-the-maximum-divisibility-score.js
@@ -0,0 +1,38 @@
+/**
+ * 2644. Find the Maximum Divisibility Score
+ * https://leetcode.com/problems/find-the-maximum-divisibility-score/
+ * Difficulty: Easy
+ *
+ * You are given two integer arrays nums and divisors.
+ *
+ * The divisibility score of divisors[i] is the number of indices j such that nums[j] is
+ * divisible by divisors[i].
+ *
+ * Return the integer divisors[i] with the maximum divisibility score. If multiple integers
+ * have the maximum score, return the smallest one.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number[]} divisors
+ * @return {number}
+ */
+var maxDivScore = function(nums, divisors) {
+  let maxScore = 0;
+  let result = divisors[0];
+
+  for (const divisor of divisors) {
+    let score = 0;
+    for (const num of nums) {
+      if (num % divisor === 0) {
+        score++;
+      }
+    }
+    if (score > maxScore || (score === maxScore && divisor < result)) {
+      maxScore = score;
+      result = divisor;
+    }
+  }
+
+  return result;
+};

From 2e770add94f1cbcf9da0f397f86ebb9f3d47e5d1 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 28 May 2025 00:05:03 -0500
Subject: [PATCH 331/571] Add solution #2645

---
 README.md                                     |  1 +
 ...-minimum-additions-to-make-valid-string.js | 49 +++++++++++++++++++
 2 files changed, 50 insertions(+)
 create mode 100644 solutions/2645-minimum-additions-to-make-valid-string.js

diff --git a/README.md b/README.md
index 1ee91b26..b2365313 100644
--- a/README.md
+++ b/README.md
@@ -1965,6 +1965,7 @@
 2641|[Cousins in Binary Tree II](./solutions/2641-cousins-in-binary-tree-ii.js)|Medium|
 2643|[Row With Maximum Ones](./solutions/2643-row-with-maximum-ones.js)|Easy|
 2644|[Find the Maximum Divisibility Score](./solutions/2644-find-the-maximum-divisibility-score.js)|Easy|
+2645|[Minimum Additions to Make Valid String](./solutions/2645-minimum-additions-to-make-valid-string.js)|Medium|
 2648|[Generate Fibonacci Sequence](./solutions/2648-generate-fibonacci-sequence.js)|Easy|
 2649|[Nested Array Generator](./solutions/2649-nested-array-generator.js)|Medium|
 2650|[Design Cancellable Function](./solutions/2650-design-cancellable-function.js)|Hard|
diff --git a/solutions/2645-minimum-additions-to-make-valid-string.js b/solutions/2645-minimum-additions-to-make-valid-string.js
new file mode 100644
index 00000000..fd6bec83
--- /dev/null
+++ b/solutions/2645-minimum-additions-to-make-valid-string.js
@@ -0,0 +1,49 @@
+/**
+ * 2645. Minimum Additions to Make Valid String
+ * https://leetcode.com/problems/minimum-additions-to-make-valid-string/
+ * Difficulty: Medium
+ *
+ * Given a string word to which you can insert letters "a", "b" or "c" anywhere and any number
+ * of times, return the minimum number of letters that must be inserted so that word becomes valid.
+ *
+ * A string is called valid if it can be formed by concatenating the string "abc" several times.
+ */
+
+/**
+ * @param {string} word
+ * @return {number}
+ */
+var addMinimum = function(word) {
+  let result = 0;
+  let index = 0;
+
+  while (index < word.length) {
+    if (word[index] === 'a') {
+      if (word[index + 1] === 'b' && word[index + 2] === 'c') {
+        index += 3;
+      } else if (word[index + 1] === 'b') {
+        result += 1;
+        index += 2;
+      } else if (word[index + 1] === 'c') {
+        result += 1;
+        index += 2;
+      } else {
+        result += 2;
+        index += 1;
+      }
+    } else if (word[index] === 'b') {
+      if (word[index + 1] === 'c') {
+        result += 1;
+        index += 2;
+      } else {
+        result += 2;
+        index += 1;
+      }
+    } else {
+      result += 2;
+      index += 1;
+    }
+  }
+
+  return result;
+};

From 892f5049b0e6cdd7ce7f609c1d1dfb132c94b104 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 28 May 2025 00:06:45 -0500
Subject: [PATCH 332/571] Add solution #2651

---
 README.md                                     |  1 +
 .../2651-calculate-delayed-arrival-time.js    | 21 +++++++++++++++++++
 2 files changed, 22 insertions(+)
 create mode 100644 solutions/2651-calculate-delayed-arrival-time.js

diff --git a/README.md b/README.md
index b2365313..84370002 100644
--- a/README.md
+++ b/README.md
@@ -1969,6 +1969,7 @@
 2648|[Generate Fibonacci Sequence](./solutions/2648-generate-fibonacci-sequence.js)|Easy|
 2649|[Nested Array Generator](./solutions/2649-nested-array-generator.js)|Medium|
 2650|[Design Cancellable Function](./solutions/2650-design-cancellable-function.js)|Hard|
+2651|[Calculate Delayed Arrival Time](./solutions/2651-calculate-delayed-arrival-time.js)|Easy|
 2657|[Find the Prefix Common Array of Two Arrays](./solutions/2657-find-the-prefix-common-array-of-two-arrays.js)|Medium|
 2658|[Maximum Number of Fish in a Grid](./solutions/2658-maximum-number-of-fish-in-a-grid.js)|Medium|
 2661|[First Completely Painted Row or Column](./solutions/2661-first-completely-painted-row-or-column.js)|Medium|
diff --git a/solutions/2651-calculate-delayed-arrival-time.js b/solutions/2651-calculate-delayed-arrival-time.js
new file mode 100644
index 00000000..09571897
--- /dev/null
+++ b/solutions/2651-calculate-delayed-arrival-time.js
@@ -0,0 +1,21 @@
+/**
+ * 2651. Calculate Delayed Arrival Time
+ * https://leetcode.com/problems/calculate-delayed-arrival-time/
+ * Difficulty: Easy
+ *
+ * You are given a positive integer arrivalTime denoting the arrival time of a train in
+ * hours, and another positive integer delayedTime denoting the amount of delay in hours.
+ *
+ * Return the time when the train will arrive at the station.
+ *
+ * Note that the time in this problem is in 24-hours format.
+ */
+
+/**
+ * @param {number} arrivalTime
+ * @param {number} delayedTime
+ * @return {number}
+ */
+var findDelayedArrivalTime = function(arrivalTime, delayedTime) {
+  return (arrivalTime + delayedTime) % 24;
+};

From 562bdb2a911f65fd46f33dbc2c57b0d1e7575502 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 28 May 2025 00:07:42 -0500
Subject: [PATCH 333/571] Add solution #2652

---
 README.md                       |  1 +
 solutions/2652-sum-multiples.js | 25 +++++++++++++++++++++++++
 2 files changed, 26 insertions(+)
 create mode 100644 solutions/2652-sum-multiples.js

diff --git a/README.md b/README.md
index 84370002..7c3c161b 100644
--- a/README.md
+++ b/README.md
@@ -1970,6 +1970,7 @@
 2649|[Nested Array Generator](./solutions/2649-nested-array-generator.js)|Medium|
 2650|[Design Cancellable Function](./solutions/2650-design-cancellable-function.js)|Hard|
 2651|[Calculate Delayed Arrival Time](./solutions/2651-calculate-delayed-arrival-time.js)|Easy|
+2652|[Sum Multiples](./solutions/2652-sum-multiples.js)|Easy|
 2657|[Find the Prefix Common Array of Two Arrays](./solutions/2657-find-the-prefix-common-array-of-two-arrays.js)|Medium|
 2658|[Maximum Number of Fish in a Grid](./solutions/2658-maximum-number-of-fish-in-a-grid.js)|Medium|
 2661|[First Completely Painted Row or Column](./solutions/2661-first-completely-painted-row-or-column.js)|Medium|
diff --git a/solutions/2652-sum-multiples.js b/solutions/2652-sum-multiples.js
new file mode 100644
index 00000000..340dbd2a
--- /dev/null
+++ b/solutions/2652-sum-multiples.js
@@ -0,0 +1,25 @@
+/**
+ * 2652. Sum Multiples
+ * https://leetcode.com/problems/sum-multiples/
+ * Difficulty: Easy
+ *
+ * Given a positive integer n, find the sum of all integers in the range [1, n] inclusive
+ * that are divisible by 3, 5, or 7.
+ *
+ * Return an integer denoting the sum of all numbers in the given range satisfying the constraint.
+ */
+
+/**
+ * @param {number} n
+ * @return {number}
+ */
+var sumOfMultiples = function(n) {
+  return sumDivisibleBy(3) + sumDivisibleBy(5) + sumDivisibleBy(7)
+    - sumDivisibleBy(15) - sumDivisibleBy(21) - sumDivisibleBy(35)
+    + sumDivisibleBy(105);
+
+  function sumDivisibleBy(divisor) {
+    const count = Math.floor(n / divisor);
+    return divisor * count * (count + 1) / 2;
+  }
+};

From bdd342a6b0a8873a0aef8e64c7b7900139d2afe3 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 28 May 2025 00:08:56 -0500
Subject: [PATCH 334/571] Add solution #2656

---
 README.md                                     |  1 +
 ...656-maximum-sum-with-exactly-k-elements.js | 23 +++++++++++++++++++
 2 files changed, 24 insertions(+)
 create mode 100644 solutions/2656-maximum-sum-with-exactly-k-elements.js

diff --git a/README.md b/README.md
index 7c3c161b..7cf2e7cd 100644
--- a/README.md
+++ b/README.md
@@ -1971,6 +1971,7 @@
 2650|[Design Cancellable Function](./solutions/2650-design-cancellable-function.js)|Hard|
 2651|[Calculate Delayed Arrival Time](./solutions/2651-calculate-delayed-arrival-time.js)|Easy|
 2652|[Sum Multiples](./solutions/2652-sum-multiples.js)|Easy|
+2656|[Maximum Sum With Exactly K Elements](./solutions/2656-maximum-sum-with-exactly-k-elements.js)|Easy|
 2657|[Find the Prefix Common Array of Two Arrays](./solutions/2657-find-the-prefix-common-array-of-two-arrays.js)|Medium|
 2658|[Maximum Number of Fish in a Grid](./solutions/2658-maximum-number-of-fish-in-a-grid.js)|Medium|
 2661|[First Completely Painted Row or Column](./solutions/2661-first-completely-painted-row-or-column.js)|Medium|
diff --git a/solutions/2656-maximum-sum-with-exactly-k-elements.js b/solutions/2656-maximum-sum-with-exactly-k-elements.js
new file mode 100644
index 00000000..fdac61de
--- /dev/null
+++ b/solutions/2656-maximum-sum-with-exactly-k-elements.js
@@ -0,0 +1,23 @@
+/**
+ * 2656. Maximum Sum With Exactly K Elements
+ * https://leetcode.com/problems/maximum-sum-with-exactly-k-elements/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed integer array nums and an integer k. Your task is to perform
+ * the following operation exactly k times in order to maximize your score:
+ * 1. Select an element m from nums.
+ * 2. Remove the selected element m from the array.
+ * 3. Add a new element with a value of m + 1 to the array.
+ * 4. Increase your score by m.
+ *
+ * Return the maximum score you can achieve after performing the operation exactly k times.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} k
+ * @return {number}
+ */
+var maximizeSum = function(nums, k) {
+  return k * Math.max(...nums) + k * (k - 1) / 2;
+};

From be5333dcbbed0808d7d24d946a57019360bd048c Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 28 May 2025 00:10:30 -0500
Subject: [PATCH 335/571] Add solution #2670

---
 README.md                                     |  1 +
 ...2670-find-the-distinct-difference-array.js | 46 +++++++++++++++++++
 2 files changed, 47 insertions(+)
 create mode 100644 solutions/2670-find-the-distinct-difference-array.js

diff --git a/README.md b/README.md
index 7cf2e7cd..ab290a08 100644
--- a/README.md
+++ b/README.md
@@ -1978,6 +1978,7 @@
 2665|[Counter II](./solutions/2665-counter-ii.js)|Easy|
 2666|[Allow One Function Call](./solutions/2666-allow-one-function-call.js)|Easy|
 2667|[Create Hello World Function](./solutions/2667-create-hello-world-function.js)|Easy|
+2670|[Find the Distinct Difference Array](./solutions/2670-find-the-distinct-difference-array.js)|Easy|
 2677|[Chunk Array](./solutions/2677-chunk-array.js)|Easy|
 2683|[Neighboring Bitwise XOR](./solutions/2683-neighboring-bitwise-xor.js)|Medium|
 2685|[Count the Number of Complete Components](./solutions/2685-count-the-number-of-complete-components.js)|Medium|
diff --git a/solutions/2670-find-the-distinct-difference-array.js b/solutions/2670-find-the-distinct-difference-array.js
new file mode 100644
index 00000000..fc3ddaea
--- /dev/null
+++ b/solutions/2670-find-the-distinct-difference-array.js
@@ -0,0 +1,46 @@
+/**
+ * 2670. Find the Distinct Difference Array
+ * https://leetcode.com/problems/find-the-distinct-difference-array/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed array nums of length n.
+ *
+ * The distinct difference array of nums is an array diff of length n such that diff[i] is
+ * equal to the number of distinct elements in the suffix nums[i + 1, ..., n - 1] subtracted
+ * from the number of distinct elements in the prefix nums[0, ..., i].
+ *
+ * Return the distinct difference array of nums.
+ *
+ * Note that nums[i, ..., j] denotes the subarray of nums starting at index i and ending at
+ * index j inclusive. Particularly, if i > j then nums[i, ..., j] denotes an empty subarray.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number[]}
+ */
+var distinctDifferenceArray = function(nums) {
+  const n = nums.length;
+  const result = new Array(n);
+  const prefixSet = new Set();
+  const suffixCount = new Map();
+
+  for (const num of nums) {
+    suffixCount.set(num, (suffixCount.get(num) || 0) + 1);
+  }
+
+  let suffixDistinct = suffixCount.size;
+
+  for (let i = 0; i < n; i++) {
+    prefixSet.add(nums[i]);
+    const count = suffixCount.get(nums[i]);
+    suffixCount.set(nums[i], count - 1);
+    if (count === 1) {
+      suffixCount.delete(nums[i]);
+      suffixDistinct--;
+    }
+    result[i] = prefixSet.size - suffixDistinct;
+  }
+
+  return result;
+};

From 3c26f7583a9768b56d809955ffe59cc4818999a2 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 28 May 2025 00:11:43 -0500
Subject: [PATCH 336/571] Add solution #2672

---
 README.md                                     |  1 +
 ...f-adjacent-elements-with-the-same-color.js | 44 +++++++++++++++++++
 2 files changed, 45 insertions(+)
 create mode 100644 solutions/2672-number-of-adjacent-elements-with-the-same-color.js

diff --git a/README.md b/README.md
index ab290a08..3a61dbc8 100644
--- a/README.md
+++ b/README.md
@@ -1979,6 +1979,7 @@
 2666|[Allow One Function Call](./solutions/2666-allow-one-function-call.js)|Easy|
 2667|[Create Hello World Function](./solutions/2667-create-hello-world-function.js)|Easy|
 2670|[Find the Distinct Difference Array](./solutions/2670-find-the-distinct-difference-array.js)|Easy|
+2672|[Number of Adjacent Elements With the Same Color](./solutions/2672-number-of-adjacent-elements-with-the-same-color.js)|Medium|
 2677|[Chunk Array](./solutions/2677-chunk-array.js)|Easy|
 2683|[Neighboring Bitwise XOR](./solutions/2683-neighboring-bitwise-xor.js)|Medium|
 2685|[Count the Number of Complete Components](./solutions/2685-count-the-number-of-complete-components.js)|Medium|
diff --git a/solutions/2672-number-of-adjacent-elements-with-the-same-color.js b/solutions/2672-number-of-adjacent-elements-with-the-same-color.js
new file mode 100644
index 00000000..257d4270
--- /dev/null
+++ b/solutions/2672-number-of-adjacent-elements-with-the-same-color.js
@@ -0,0 +1,44 @@
+/**
+ * 2672. Number of Adjacent Elements With the Same Color
+ * https://leetcode.com/problems/number-of-adjacent-elements-with-the-same-color/
+ * Difficulty: Medium
+ *
+ * You are given an integer n representing an array colors of length n where all elements
+ * are set to 0's meaning uncolored. You are also given a 2D integer array queries where
+ * queries[i] = [indexi, colori]. For the ith query:
+ * - Set colors[indexi] to colori.
+ * - Count the number of adjacent pairs in colors which have the same color (regardless of colori).
+ *
+ * Return an array answer of the same length as queries where answer[i] is the answer to the ith
+ * query.
+ */
+
+/**
+ * @param {number} n
+ * @param {number[][]} queries
+ * @return {number[]}
+ */
+var colorTheArray = function(n, queries) {
+  const colors = new Array(n).fill(0);
+  const result = new Array(queries.length).fill(0);
+  let sameColorPairs = 0;
+
+  for (let i = 0; i < queries.length; i++) {
+    const [index, color] = queries[i];
+    const prevColor = colors[index];
+
+    if (prevColor !== 0) {
+      if (index > 0 && colors[index - 1] === prevColor) sameColorPairs--;
+      if (index < n - 1 && colors[index + 1] === prevColor) sameColorPairs--;
+    }
+
+    colors[index] = color;
+
+    if (index > 0 && colors[index - 1] === color) sameColorPairs++;
+    if (index < n - 1 && colors[index + 1] === color) sameColorPairs++;
+
+    result[i] = sameColorPairs;
+  }
+
+  return result;
+};

From 6f116095f42e90385bfe3521d5f57b878c0cfc2b Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 28 May 2025 23:14:54 -0500
Subject: [PATCH 337/571] Add solution #2673

---
 README.md                                     |  1 +
 ...e-costs-of-paths-equal-in-a-binary-tree.js | 41 +++++++++++++++++++
 2 files changed, 42 insertions(+)
 create mode 100644 solutions/2673-make-costs-of-paths-equal-in-a-binary-tree.js

diff --git a/README.md b/README.md
index 3a61dbc8..87ddec71 100644
--- a/README.md
+++ b/README.md
@@ -1980,6 +1980,7 @@
 2667|[Create Hello World Function](./solutions/2667-create-hello-world-function.js)|Easy|
 2670|[Find the Distinct Difference Array](./solutions/2670-find-the-distinct-difference-array.js)|Easy|
 2672|[Number of Adjacent Elements With the Same Color](./solutions/2672-number-of-adjacent-elements-with-the-same-color.js)|Medium|
+2673|[Make Costs of Paths Equal in a Binary Tree](./solutions/2673-make-costs-of-paths-equal-in-a-binary-tree.js)|Medium|
 2677|[Chunk Array](./solutions/2677-chunk-array.js)|Easy|
 2683|[Neighboring Bitwise XOR](./solutions/2683-neighboring-bitwise-xor.js)|Medium|
 2685|[Count the Number of Complete Components](./solutions/2685-count-the-number-of-complete-components.js)|Medium|
diff --git a/solutions/2673-make-costs-of-paths-equal-in-a-binary-tree.js b/solutions/2673-make-costs-of-paths-equal-in-a-binary-tree.js
new file mode 100644
index 00000000..7d60cdb5
--- /dev/null
+++ b/solutions/2673-make-costs-of-paths-equal-in-a-binary-tree.js
@@ -0,0 +1,41 @@
+/**
+ * 2673. Make Costs of Paths Equal in a Binary Tree
+ * https://leetcode.com/problems/make-costs-of-paths-equal-in-a-binary-tree/
+ * Difficulty: Medium
+ *
+ * You are given an integer n representing the number of nodes in a perfect binary tree consisting
+ * of nodes numbered from 1 to n. The root of the tree is node 1 and each node i in the tree has
+ * two children where the left child is the node 2 * i and the right child is 2 * i + 1.
+ *
+ * Each node in the tree also has a cost represented by a given 0-indexed integer array cost of
+ * size n where cost[i] is the cost of node i + 1. You are allowed to increment the cost of any
+ * node by 1 any number of times.
+ *
+ * Return the minimum number of increments you need to make the cost of paths from the root to
+ * each leaf node equal.
+ *
+ * Note:
+ * - A perfect binary tree is a tree where each node, except the leaf nodes, has exactly 2 children.
+ * - The cost of a path is the sum of costs of nodes in the path.
+ */
+
+/**
+ * @param {number} n
+ * @param {number[]} cost
+ * @return {number}
+ */
+var minIncrements = function(n, cost) {
+  let result = 0;
+
+  for (let i = Math.floor(n / 2) - 1; i >= 0; i--) {
+    const left = 2 * i + 1;
+    const right = 2 * i + 2;
+    if (left < n && right < n) {
+      const maxChildCost = Math.max(cost[left], cost[right]);
+      result += maxChildCost - cost[left] + maxChildCost - cost[right];
+      cost[i] += maxChildCost;
+    }
+  }
+
+  return result;
+};

From d56f197363cfffa664e112b021ef2a9a9084335d Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 28 May 2025 23:16:16 -0500
Subject: [PATCH 338/571] Add solution #2678

---
 README.md                                   |  1 +
 solutions/2678-number-of-senior-citizens.js | 30 +++++++++++++++++++++
 2 files changed, 31 insertions(+)
 create mode 100644 solutions/2678-number-of-senior-citizens.js

diff --git a/README.md b/README.md
index 87ddec71..cde7900c 100644
--- a/README.md
+++ b/README.md
@@ -1982,6 +1982,7 @@
 2672|[Number of Adjacent Elements With the Same Color](./solutions/2672-number-of-adjacent-elements-with-the-same-color.js)|Medium|
 2673|[Make Costs of Paths Equal in a Binary Tree](./solutions/2673-make-costs-of-paths-equal-in-a-binary-tree.js)|Medium|
 2677|[Chunk Array](./solutions/2677-chunk-array.js)|Easy|
+2678|[Number of Senior Citizens](./solutions/2678-number-of-senior-citizens.js)|Easy|
 2683|[Neighboring Bitwise XOR](./solutions/2683-neighboring-bitwise-xor.js)|Medium|
 2685|[Count the Number of Complete Components](./solutions/2685-count-the-number-of-complete-components.js)|Medium|
 2693|[Call Function with Custom Context](./solutions/2693-call-function-with-custom-context.js)|Medium|
diff --git a/solutions/2678-number-of-senior-citizens.js b/solutions/2678-number-of-senior-citizens.js
new file mode 100644
index 00000000..7c599c9f
--- /dev/null
+++ b/solutions/2678-number-of-senior-citizens.js
@@ -0,0 +1,30 @@
+/**
+ * 2678. Number of Senior Citizens
+ * https://leetcode.com/problems/number-of-senior-citizens/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed array of strings details. Each element of details provides
+ * information about a given passenger compressed into a string of length 15. The system
+ * is such that:
+ * - The first ten characters consist of the phone number of passengers.
+ * - The next character denotes the gender of the person.
+ * - The following two characters are used to indicate the age of the person.
+ * - The last two characters determine the seat allotted to that person.
+ *
+ * Return the number of passengers who are strictly more than 60 years old.
+ */
+
+/**
+ * @param {string[]} details
+ * @return {number}
+ */
+var countSeniors = function(details) {
+  let result = 0;
+
+  for (const detail of details) {
+    const age = parseInt(detail.slice(11, 13));
+    if (age > 60) result++;
+  }
+
+  return result;
+};

From 441c3d01f21d58f9cecfb0c07463c7aa74da0271 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 28 May 2025 23:18:10 -0500
Subject: [PATCH 339/571] Add solution #2680

---
 README.md                    |  1 +
 solutions/2680-maximum-or.js | 41 ++++++++++++++++++++++++++++++++++++
 2 files changed, 42 insertions(+)
 create mode 100644 solutions/2680-maximum-or.js

diff --git a/README.md b/README.md
index cde7900c..29aaa672 100644
--- a/README.md
+++ b/README.md
@@ -1983,6 +1983,7 @@
 2673|[Make Costs of Paths Equal in a Binary Tree](./solutions/2673-make-costs-of-paths-equal-in-a-binary-tree.js)|Medium|
 2677|[Chunk Array](./solutions/2677-chunk-array.js)|Easy|
 2678|[Number of Senior Citizens](./solutions/2678-number-of-senior-citizens.js)|Easy|
+2680|[Maximum OR](./solutions/2680-maximum-or.js)|Medium|
 2683|[Neighboring Bitwise XOR](./solutions/2683-neighboring-bitwise-xor.js)|Medium|
 2685|[Count the Number of Complete Components](./solutions/2685-count-the-number-of-complete-components.js)|Medium|
 2693|[Call Function with Custom Context](./solutions/2693-call-function-with-custom-context.js)|Medium|
diff --git a/solutions/2680-maximum-or.js b/solutions/2680-maximum-or.js
new file mode 100644
index 00000000..fb53a9c9
--- /dev/null
+++ b/solutions/2680-maximum-or.js
@@ -0,0 +1,41 @@
+/**
+ * 2680. Maximum OR
+ * https://leetcode.com/problems/maximum-or/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed integer array nums of length n and an integer k. In an operation,
+ * you can choose an element and multiply it by 2.
+ *
+ * Return the maximum possible value of nums[0] | nums[1] | ... | nums[n - 1] that can be obtained
+ * after applying the operation on nums at most k times.
+ *
+ * Note that a | b denotes the bitwise or between two integers a and b.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} k
+ * @return {number}
+ */
+var maximumOr = function(nums, k) {
+  const n = nums.length;
+  const prefixOr = new Array(n + 1).fill(0n);
+  const suffixOr = new Array(n + 1).fill(0n);
+
+  for (let i = 0; i < n; i++) {
+    prefixOr[i + 1] = prefixOr[i] | BigInt(nums[i]);
+  }
+
+  for (let i = n - 1; i >= 0; i--) {
+    suffixOr[i] = suffixOr[i + 1] | BigInt(nums[i]);
+  }
+
+  let maxOr = 0n;
+  for (let i = 0; i < n; i++) {
+    maxOr = maxOr > (prefixOr[i] | (BigInt(nums[i]) << BigInt(k)) | suffixOr[i + 1])
+      ? maxOr
+      : (prefixOr[i] | (BigInt(nums[i]) << BigInt(k)) | suffixOr[i + 1]);
+  }
+
+  return Number(maxOr);
+};

From b1b981694ac722e4f8ba67a70b63d3ecbc1cb33a Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 28 May 2025 23:20:29 -0500
Subject: [PATCH 340/571] Add solution #2682

---
 README.md                                     |  1 +
 ...82-find-the-losers-of-the-circular-game.js | 56 +++++++++++++++++++
 2 files changed, 57 insertions(+)
 create mode 100644 solutions/2682-find-the-losers-of-the-circular-game.js

diff --git a/README.md b/README.md
index 29aaa672..06a8dc9e 100644
--- a/README.md
+++ b/README.md
@@ -1984,6 +1984,7 @@
 2677|[Chunk Array](./solutions/2677-chunk-array.js)|Easy|
 2678|[Number of Senior Citizens](./solutions/2678-number-of-senior-citizens.js)|Easy|
 2680|[Maximum OR](./solutions/2680-maximum-or.js)|Medium|
+2682|[Find the Losers of the Circular Game](./solutions/2682-find-the-losers-of-the-circular-game.js)|Easy|
 2683|[Neighboring Bitwise XOR](./solutions/2683-neighboring-bitwise-xor.js)|Medium|
 2685|[Count the Number of Complete Components](./solutions/2685-count-the-number-of-complete-components.js)|Medium|
 2693|[Call Function with Custom Context](./solutions/2693-call-function-with-custom-context.js)|Medium|
diff --git a/solutions/2682-find-the-losers-of-the-circular-game.js b/solutions/2682-find-the-losers-of-the-circular-game.js
new file mode 100644
index 00000000..8536fa0b
--- /dev/null
+++ b/solutions/2682-find-the-losers-of-the-circular-game.js
@@ -0,0 +1,56 @@
+/**
+ * 2682. Find the Losers of the Circular Game
+ * https://leetcode.com/problems/find-the-losers-of-the-circular-game/
+ * Difficulty: Easy
+ *
+ * There are n friends that are playing a game. The friends are sitting in a circle and are numbered
+ * from 1 to n in clockwise order. More formally, moving clockwise from the ith friend brings you to
+ * the (i+1)th friend for 1 <= i < n, and moving clockwise from the nth friend brings you to the 1st
+ * friend.
+ *
+ * The rules of the game are as follows:
+ *
+ * 1st friend receives the ball.
+ * - After that, 1st friend passes it to the friend who is k steps away from them in the clockwise
+ *   direction.
+ * - After that, the friend who receives the ball should pass it to the friend who is 2 * k steps
+ *   away from them in the clockwise direction.
+ * - After that, the friend who receives the ball should pass it to the friend who is 3 * k steps
+ *   away from them in the clockwise direction, and so on and so forth.
+ *
+ * In other words, on the ith turn, the friend holding the ball should pass it to the friend who
+ * is i * k steps away from them in the clockwise direction.
+ *
+ * The game is finished when some friend receives the ball for the second time.
+ *
+ * The losers of the game are friends who did not receive the ball in the entire game.
+ *
+ * Given the number of friends, n, and an integer k, return the array answer, which contains the
+ * losers of the game in the ascending order.
+ */
+
+/**
+ * @param {number} n
+ * @param {number} k
+ * @return {number[]}
+ */
+var circularGameLosers = function(n, k) {
+  const visited = new Set();
+  let current = 0;
+  let step = 1;
+
+  while (!visited.has(current)) {
+    visited.add(current);
+    current = (current + step * k) % n;
+    step++;
+  }
+
+  const result = [];
+  for (let i = 0; i < n; i++) {
+    if (!visited.has(i)) {
+      result.push(i + 1);
+    }
+  }
+
+  return result;
+};

From aa7a6f24d0ef09b9dce2d0bbb380ef6480bf56d6 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 28 May 2025 23:28:22 -0500
Subject: [PATCH 341/571] Add solution #3373

---
 README.md                                     |  1 +
 ...-target-nodes-after-connecting-trees-ii.js | 79 +++++++++++++++++++
 2 files changed, 80 insertions(+)
 create mode 100644 solutions/3373-maximize-the-number-of-target-nodes-after-connecting-trees-ii.js

diff --git a/README.md b/README.md
index 06a8dc9e..49dbbb1f 100644
--- a/README.md
+++ b/README.md
@@ -2044,6 +2044,7 @@
 3356|[Zero Array Transformation II](./solutions/3356-zero-array-transformation-ii.js)|Medium|
 3362|[Zero Array Transformation III](./solutions/3362-zero-array-transformation-iii.js)|Medium|
 3372|[Maximize the Number of Target Nodes After Connecting Trees I](./solutions/3372-maximize-the-number-of-target-nodes-after-connecting-trees-i.js)|Medium|
+3373|[Maximize the Number of Target Nodes After Connecting Trees II](./solutions/3373-maximize-the-number-of-target-nodes-after-connecting-trees-ii.js)|Hard|
 3375|[Minimum Operations to Make Array Values Equal to K](./solutions/3375-minimum-operations-to-make-array-values-equal-to-k.js)|Easy|
 3392|[Count Subarrays of Length Three With a Condition](./solutions/3392-count-subarrays-of-length-three-with-a-condition.js)|Easy|
 3394|[Check if Grid can be Cut into Sections](./solutions/3394-check-if-grid-can-be-cut-into-sections.js)|Medium|
diff --git a/solutions/3373-maximize-the-number-of-target-nodes-after-connecting-trees-ii.js b/solutions/3373-maximize-the-number-of-target-nodes-after-connecting-trees-ii.js
new file mode 100644
index 00000000..8ac956f1
--- /dev/null
+++ b/solutions/3373-maximize-the-number-of-target-nodes-after-connecting-trees-ii.js
@@ -0,0 +1,79 @@
+/**
+ * 3373. Maximize the Number of Target Nodes After Connecting Trees II
+ * https://leetcode.com/problems/maximize-the-number-of-target-nodes-after-connecting-trees-ii/
+ * Difficulty: Hard
+ *
+ * There exist two undirected trees with n and m nodes, labeled from [0, n - 1] and [0, m - 1],
+ * respectively.
+ *
+ * You are given two 2D integer arrays edges1 and edges2 of lengths n - 1 and m - 1, respectively,
+ * where edges1[i] = [ai, bi] indicates that there is an edge between nodes ai and bi in the first
+ * tree and edges2[i] = [ui, vi] indicates that there is an edge between nodes ui and vi in the
+ * second tree.
+ *
+ * Node u is target to node v if the number of edges on the path from u to v is even. Note that
+ * a node is always target to itself.
+ *
+ * Return an array of n integers answer, where answer[i] is the maximum possible number of nodes
+ * that are target to node i of the first tree if you had to connect one node from the first tree
+ * to another node in the second tree.
+ *
+ * Note that queries are independent from each other. That is, for every query you will remove the
+ * added edge before proceeding to the next query.
+ */
+
+/**
+ * @param {number[][]} edges1
+ * @param {number[][]} edges2
+ * @return {number[]}
+ */
+var maxTargetNodes = function(edges1, edges2) {
+  const graph1 = buildGraph(edges1);
+  const graph2 = buildGraph(edges2);
+  const n = graph1.length;
+  const { color: color1 } = getBipartiteGroups(graph1);
+  const { maxGroup: maxGroup2 } = getBipartiteGroups(graph2);
+  const group0Count = color1.filter(c => c === 0).length;
+  const group1Count = n - group0Count;
+  const result = new Array(n);
+
+  for (let i = 0; i < n; i++) {
+    result[i] = (color1[i] === 0 ? group0Count : group1Count) + maxGroup2;
+  }
+
+  return result;
+
+  function buildGraph(edges) {
+    const n = edges.length + 1;
+    const graph = Array.from({ length: n }, () => []);
+    for (const [u, v] of edges) {
+      graph[u].push(v);
+      graph[v].push(u);
+    }
+    return graph;
+  }
+
+  function getBipartiteGroups(graph) {
+    const n = graph.length;
+    const color = new Array(n).fill(-1);
+    const groups = [0, 0];
+
+    for (let i = 0; i < n; i++) {
+      if (color[i] === -1) {
+        dfs(i, 0);
+      }
+    }
+
+    return { color, maxGroup: Math.max(groups[0], groups[1]) };
+
+    function dfs(node, c) {
+      color[node] = c;
+      groups[c]++;
+      for (const neighbor of graph[node]) {
+        if (color[neighbor] === -1) {
+          dfs(neighbor, 1 - c);
+        }
+      }
+    }
+  }
+};

From ae23c0b4743b56fbe0d4f560e35f0b592a86faee Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 28 May 2025 23:36:34 -0500
Subject: [PATCH 342/571] Add solution #2684

---
 README.md                                     |  1 +
 .../2684-maximum-number-of-moves-in-a-grid.js | 53 +++++++++++++++++++
 2 files changed, 54 insertions(+)
 create mode 100644 solutions/2684-maximum-number-of-moves-in-a-grid.js

diff --git a/README.md b/README.md
index 49dbbb1f..c80e62f4 100644
--- a/README.md
+++ b/README.md
@@ -1986,6 +1986,7 @@
 2680|[Maximum OR](./solutions/2680-maximum-or.js)|Medium|
 2682|[Find the Losers of the Circular Game](./solutions/2682-find-the-losers-of-the-circular-game.js)|Easy|
 2683|[Neighboring Bitwise XOR](./solutions/2683-neighboring-bitwise-xor.js)|Medium|
+2684|[Maximum Number of Moves in a Grid](./solutions/2684-maximum-number-of-moves-in-a-grid.js)|Medium|
 2685|[Count the Number of Complete Components](./solutions/2685-count-the-number-of-complete-components.js)|Medium|
 2693|[Call Function with Custom Context](./solutions/2693-call-function-with-custom-context.js)|Medium|
 2694|[Event Emitter](./solutions/2694-event-emitter.js)|Medium|
diff --git a/solutions/2684-maximum-number-of-moves-in-a-grid.js b/solutions/2684-maximum-number-of-moves-in-a-grid.js
new file mode 100644
index 00000000..65b4464f
--- /dev/null
+++ b/solutions/2684-maximum-number-of-moves-in-a-grid.js
@@ -0,0 +1,53 @@
+/**
+ * 2684. Maximum Number of Moves in a Grid
+ * https://leetcode.com/problems/maximum-number-of-moves-in-a-grid/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed m x n matrix grid consisting of positive integers.
+ *
+ * You can start at any cell in the first column of the matrix, and traverse the grid in the
+ * following way:
+ * - From a cell (row, col), you can move to any of the cells: (row - 1, col + 1), (row, col + 1)
+ *   and (row + 1, col + 1) such that the value of the cell you move to, should be strictly bigger
+ *   than the value of the current cell.
+ *
+ * Return the maximum number of moves that you can perform.
+ */
+
+/**
+ * @param {number[][]} grid
+ * @return {number}
+ */
+var maxMoves = function(grid) {
+  const rows = grid.length;
+  const cols = grid[0].length;
+  const memo = Array.from({ length: rows }, () => new Array(cols).fill(-1));
+
+  let result = 0;
+  for (let row = 0; row < rows; row++) {
+    result = Math.max(result, explore(row, 0));
+  }
+
+  return result;
+
+  function explore(row, col) {
+    if (col === cols - 1) return 0;
+    if (memo[row][col] !== -1) return memo[row][col];
+
+    let maxSteps = 0;
+    const current = grid[row][col];
+
+    if (row > 0 && col + 1 < cols && grid[row - 1][col + 1] > current) {
+      maxSteps = Math.max(maxSteps, 1 + explore(row - 1, col + 1));
+    }
+    if (col + 1 < cols && grid[row][col + 1] > current) {
+      maxSteps = Math.max(maxSteps, 1 + explore(row, col + 1));
+    }
+    if (row + 1 < rows && col + 1 < cols && grid[row + 1][col + 1] > current) {
+      maxSteps = Math.max(maxSteps, 1 + explore(row + 1, col + 1));
+    }
+
+    memo[row][col] = maxSteps;
+    return maxSteps;
+  }
+};

From 78a451fdbc886d2daf7d2eee42ee6035b75c18ca Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 28 May 2025 23:37:53 -0500
Subject: [PATCH 343/571] Add solution #2696

---
 README.md                                     |  1 +
 ...string-length-after-removing-substrings.js | 34 +++++++++++++++++++
 2 files changed, 35 insertions(+)
 create mode 100644 solutions/2696-minimum-string-length-after-removing-substrings.js

diff --git a/README.md b/README.md
index c80e62f4..87d969fa 100644
--- a/README.md
+++ b/README.md
@@ -1991,6 +1991,7 @@
 2693|[Call Function with Custom Context](./solutions/2693-call-function-with-custom-context.js)|Medium|
 2694|[Event Emitter](./solutions/2694-event-emitter.js)|Medium|
 2695|[Array Wrapper](./solutions/2695-array-wrapper.js)|Easy|
+2696|[Minimum String Length After Removing Substrings](./solutions/2696-minimum-string-length-after-removing-substrings.js)|Easy|
 2698|[Find the Punishment Number of an Integer](./solutions/2698-find-the-punishment-number-of-an-integer.js)|Medium|
 2703|[Return Length of Arguments Passed](./solutions/2703-return-length-of-arguments-passed.js)|Easy|
 2704|[To Be Or Not To Be](./solutions/2704-to-be-or-not-to-be.js)|Easy|
diff --git a/solutions/2696-minimum-string-length-after-removing-substrings.js b/solutions/2696-minimum-string-length-after-removing-substrings.js
new file mode 100644
index 00000000..de51fb8f
--- /dev/null
+++ b/solutions/2696-minimum-string-length-after-removing-substrings.js
@@ -0,0 +1,34 @@
+/**
+ * 2696. Minimum String Length After Removing Substrings
+ * https://leetcode.com/problems/minimum-string-length-after-removing-substrings/
+ * Difficulty: Easy
+ *
+ * You are given a string s consisting only of uppercase English letters.
+ *
+ * You can apply some operations to this string where, in one operation, you can remove any
+ * occurrence of one of the substrings "AB" or "CD" from s.
+ *
+ * Return the minimum possible length of the resulting string that you can obtain.
+ *
+ * Note that the string concatenates after removing the substring and could produce new "AB"
+ * or "CD" substrings.
+ */
+
+/**
+ * @param {string} s
+ * @return {number}
+ */
+var minLength = function(s) {
+  const stack = [];
+
+  for (const char of s) {
+    if (stack.length && ((stack[stack.length - 1] === 'A' && char === 'B')
+        || (stack[stack.length - 1] === 'C' && char === 'D'))) {
+      stack.pop();
+    } else {
+      stack.push(char);
+    }
+  }
+
+  return stack.length;
+};

From 8aa2e9df4a4e218253695a3e7f7c9e3ce5c5dd5c Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 28 May 2025 23:39:16 -0500
Subject: [PATCH 344/571] Add solution #2697

---
 README.md                                     |  1 +
 ...7-lexicographically-smallest-palindrome.js | 39 +++++++++++++++++++
 2 files changed, 40 insertions(+)
 create mode 100644 solutions/2697-lexicographically-smallest-palindrome.js

diff --git a/README.md b/README.md
index 87d969fa..0b0a089c 100644
--- a/README.md
+++ b/README.md
@@ -1992,6 +1992,7 @@
 2694|[Event Emitter](./solutions/2694-event-emitter.js)|Medium|
 2695|[Array Wrapper](./solutions/2695-array-wrapper.js)|Easy|
 2696|[Minimum String Length After Removing Substrings](./solutions/2696-minimum-string-length-after-removing-substrings.js)|Easy|
+2697|[Lexicographically Smallest Palindrome](./solutions/2697-lexicographically-smallest-palindrome.js)|Easy|
 2698|[Find the Punishment Number of an Integer](./solutions/2698-find-the-punishment-number-of-an-integer.js)|Medium|
 2703|[Return Length of Arguments Passed](./solutions/2703-return-length-of-arguments-passed.js)|Easy|
 2704|[To Be Or Not To Be](./solutions/2704-to-be-or-not-to-be.js)|Easy|
diff --git a/solutions/2697-lexicographically-smallest-palindrome.js b/solutions/2697-lexicographically-smallest-palindrome.js
new file mode 100644
index 00000000..2489eb32
--- /dev/null
+++ b/solutions/2697-lexicographically-smallest-palindrome.js
@@ -0,0 +1,39 @@
+/**
+ * 2697. Lexicographically Smallest Palindrome
+ * https://leetcode.com/problems/lexicographically-smallest-palindrome/
+ * Difficulty: Easy
+ *
+ * You are given a string s consisting of lowercase English letters, and you are allowed to
+ * perform operations on it. In one operation, you can replace a character in s with another
+ * lowercase English letter.
+ *
+ * Your task is to make s a palindrome with the minimum number of operations possible. If there
+ * are multiple palindromes that can be made using the minimum number of operations, make the
+ * lexicographically smallest one.
+ *
+ * A string a is lexicographically smaller than a string b (of the same length) if in the first
+ * position where a and b differ, string a has a letter that appears earlier in the alphabet
+ * than the corresponding letter in b.
+ *
+ * Return the resulting palindrome string.
+ */
+
+/**
+ * @param {string} s
+ * @return {string}
+ */
+var makeSmallestPalindrome = function(s) {
+  const chars = s.split('');
+  let left = 0;
+  let right = s.length - 1;
+
+  while (left < right) {
+    if (chars[left] !== chars[right]) {
+      chars[left] = chars[right] = chars[left] < chars[right] ? chars[left] : chars[right];
+    }
+    left++;
+    right--;
+  }
+
+  return chars.join('');
+};

From f97b1a2b0742dc3aa1a5df57bf7cb6c638e9d158 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 28 May 2025 23:40:19 -0500
Subject: [PATCH 345/571] Add solution #2706

---
 README.md                            |  1 +
 solutions/2706-buy-two-chocolates.js | 28 ++++++++++++++++++++++++++++
 2 files changed, 29 insertions(+)
 create mode 100644 solutions/2706-buy-two-chocolates.js

diff --git a/README.md b/README.md
index 0b0a089c..06dd2c6d 100644
--- a/README.md
+++ b/README.md
@@ -1997,6 +1997,7 @@
 2703|[Return Length of Arguments Passed](./solutions/2703-return-length-of-arguments-passed.js)|Easy|
 2704|[To Be Or Not To Be](./solutions/2704-to-be-or-not-to-be.js)|Easy|
 2705|[Compact Object](./solutions/2705-compact-object.js)|Medium|
+2706|[Buy Two Chocolates](./solutions/2706-buy-two-chocolates.js)|Easy|
 2715|[Timeout Cancellation](./solutions/2715-timeout-cancellation.js)|Easy|
 2721|[Execute Asynchronous Functions in Parallel](./solutions/2721-execute-asynchronous-functions-in-parallel.js)|Medium|
 2722|[Join Two Arrays by ID](./solutions/2722-join-two-arrays-by-id.js)|Medium|
diff --git a/solutions/2706-buy-two-chocolates.js b/solutions/2706-buy-two-chocolates.js
new file mode 100644
index 00000000..8c77f0e5
--- /dev/null
+++ b/solutions/2706-buy-two-chocolates.js
@@ -0,0 +1,28 @@
+/**
+ * 2706. Buy Two Chocolates
+ * https://leetcode.com/problems/buy-two-chocolates/
+ * Difficulty: Easy
+ *
+ * You are given an integer array prices representing the prices of various chocolates in
+ * a store. You are also given a single integer money, which represents your initial amount
+ * of money.
+ *
+ * You must buy exactly two chocolates in such a way that you still have some non-negative
+ * leftover money. You would like to minimize the sum of the prices of the two chocolates
+ * you buy.
+ *
+ * Return the amount of money you will have leftover after buying the two chocolates. If
+ * there is no way for you to buy two chocolates without ending up in debt, return money.
+ * Note that the leftover must be non-negative.
+ */
+
+/**
+ * @param {number[]} prices
+ * @param {number} money
+ * @return {number}
+ */
+var buyChoco = function(prices, money) {
+  prices.sort((a, b) => a - b);
+  const minCost = prices[0] + prices[1];
+  return minCost <= money ? money - minCost : money;
+};

From 42516260a14bf3e81637e6626bc7a8a2324fa931 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 28 May 2025 23:41:18 -0500
Subject: [PATCH 346/571] Add solution #2707

---
 README.md                                     |  1 +
 .../2707-extra-characters-in-a-string.js      | 35 +++++++++++++++++++
 2 files changed, 36 insertions(+)
 create mode 100644 solutions/2707-extra-characters-in-a-string.js

diff --git a/README.md b/README.md
index 06dd2c6d..d7421e39 100644
--- a/README.md
+++ b/README.md
@@ -1998,6 +1998,7 @@
 2704|[To Be Or Not To Be](./solutions/2704-to-be-or-not-to-be.js)|Easy|
 2705|[Compact Object](./solutions/2705-compact-object.js)|Medium|
 2706|[Buy Two Chocolates](./solutions/2706-buy-two-chocolates.js)|Easy|
+2707|[Extra Characters in a String](./solutions/2707-extra-characters-in-a-string.js)|Medium|
 2715|[Timeout Cancellation](./solutions/2715-timeout-cancellation.js)|Easy|
 2721|[Execute Asynchronous Functions in Parallel](./solutions/2721-execute-asynchronous-functions-in-parallel.js)|Medium|
 2722|[Join Two Arrays by ID](./solutions/2722-join-two-arrays-by-id.js)|Medium|
diff --git a/solutions/2707-extra-characters-in-a-string.js b/solutions/2707-extra-characters-in-a-string.js
new file mode 100644
index 00000000..2d335169
--- /dev/null
+++ b/solutions/2707-extra-characters-in-a-string.js
@@ -0,0 +1,35 @@
+/**
+ * 2707. Extra Characters in a String
+ * https://leetcode.com/problems/extra-characters-in-a-string/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed string s and a dictionary of words dictionary. You have to break
+ * s into one or more non-overlapping substrings such that each substring is present in
+ * dictionary. There may be some extra characters in s which are not present in any of the
+ * substrings.
+ *
+ * Return the minimum number of extra characters left over if you break up s optimally.
+ */
+
+/**
+ * @param {string} s
+ * @param {string[]} dictionary
+ * @return {number}
+ */
+var minExtraChar = function(s, dictionary) {
+  const n = s.length;
+  const dp = new Array(n + 1).fill(Infinity);
+  dp[0] = 0;
+  const dictSet = new Set(dictionary);
+
+  for (let i = 1; i <= n; i++) {
+    dp[i] = dp[i - 1] + 1;
+    for (let j = 0; j < i; j++) {
+      if (dictSet.has(s.slice(j, i))) {
+        dp[i] = Math.min(dp[i], dp[j]);
+      }
+    }
+  }
+
+  return dp[n];
+};

From 87486ae46efaf4c2d86e47811db28d78741c67fd Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 29 May 2025 23:59:12 -0500
Subject: [PATCH 347/571] Add solution #2710

---
 README.md                                        |  1 +
 .../2710-remove-trailing-zeros-from-a-string.js  | 16 ++++++++++++++++
 2 files changed, 17 insertions(+)
 create mode 100644 solutions/2710-remove-trailing-zeros-from-a-string.js

diff --git a/README.md b/README.md
index d7421e39..31807b6f 100644
--- a/README.md
+++ b/README.md
@@ -1999,6 +1999,7 @@
 2705|[Compact Object](./solutions/2705-compact-object.js)|Medium|
 2706|[Buy Two Chocolates](./solutions/2706-buy-two-chocolates.js)|Easy|
 2707|[Extra Characters in a String](./solutions/2707-extra-characters-in-a-string.js)|Medium|
+2710|[Remove Trailing Zeros From a String](./solutions/2710-remove-trailing-zeros-from-a-string.js)|Easy|
 2715|[Timeout Cancellation](./solutions/2715-timeout-cancellation.js)|Easy|
 2721|[Execute Asynchronous Functions in Parallel](./solutions/2721-execute-asynchronous-functions-in-parallel.js)|Medium|
 2722|[Join Two Arrays by ID](./solutions/2722-join-two-arrays-by-id.js)|Medium|
diff --git a/solutions/2710-remove-trailing-zeros-from-a-string.js b/solutions/2710-remove-trailing-zeros-from-a-string.js
new file mode 100644
index 00000000..217d4552
--- /dev/null
+++ b/solutions/2710-remove-trailing-zeros-from-a-string.js
@@ -0,0 +1,16 @@
+/**
+ * 2710. Remove Trailing Zeros From a String
+ * https://leetcode.com/problems/remove-trailing-zeros-from-a-string/
+ * Difficulty: Easy
+ *
+ * Given a positive integer num represented as a string, return the integer num without
+ * trailing zeros as a string.
+ */
+
+/**
+ * @param {string} num
+ * @return {string}
+ */
+var removeTrailingZeros = function(num) {
+  return num.replace(/0+$/g, '');
+};

From 2826499845caad36b7018e0adc3dd78ce8f5c7b1 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 30 May 2025 00:00:25 -0500
Subject: [PATCH 348/571] Add solution #2716

---
 README.md                                |  1 +
 solutions/2716-minimize-string-length.js | 23 +++++++++++++++++++++++
 2 files changed, 24 insertions(+)
 create mode 100644 solutions/2716-minimize-string-length.js

diff --git a/README.md b/README.md
index 31807b6f..b63ed6c6 100644
--- a/README.md
+++ b/README.md
@@ -2001,6 +2001,7 @@
 2707|[Extra Characters in a String](./solutions/2707-extra-characters-in-a-string.js)|Medium|
 2710|[Remove Trailing Zeros From a String](./solutions/2710-remove-trailing-zeros-from-a-string.js)|Easy|
 2715|[Timeout Cancellation](./solutions/2715-timeout-cancellation.js)|Easy|
+2716|[Minimize String Length](./solutions/2716-minimize-string-length.js)|Easy|
 2721|[Execute Asynchronous Functions in Parallel](./solutions/2721-execute-asynchronous-functions-in-parallel.js)|Medium|
 2722|[Join Two Arrays by ID](./solutions/2722-join-two-arrays-by-id.js)|Medium|
 2723|[Add Two Promises](./solutions/2723-add-two-promises.js)|Easy|
diff --git a/solutions/2716-minimize-string-length.js b/solutions/2716-minimize-string-length.js
new file mode 100644
index 00000000..b16b102b
--- /dev/null
+++ b/solutions/2716-minimize-string-length.js
@@ -0,0 +1,23 @@
+/**
+ * 2716. Minimize String Length
+ * https://leetcode.com/problems/minimize-string-length/
+ * Difficulty: Easy
+ *
+ * Given a string s, you have two types of operation:
+ * 1. Choose an index i in the string, and let c be the character in position i. Delete the
+ *    closest occurrence of c to the left of i (if exists).
+ * 2. Choose an index i in the string, and let c be the character in position i. Delete the
+ *    closest occurrence of c to the right of i (if exists).
+ *
+ * Your task is to minimize the length of s by performing the above operations zero or more times.
+ *
+ * Return an integer denoting the length of the minimized string.
+ */
+
+/**
+ * @param {string} s
+ * @return {number}
+ */
+var minimizedStringLength = function(s) {
+  return new Set(s).size;
+};

From 2f9c25c39ec1ecd3e2cd8f26357878b83441de55 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 31 May 2025 09:39:30 -0500
Subject: [PATCH 349/571] Add solution #2711

---
 README.md                                     |  1 +
 ...-number-of-distinct-values-on-diagonals.js | 55 +++++++++++++++++++
 2 files changed, 56 insertions(+)
 create mode 100644 solutions/2711-difference-of-number-of-distinct-values-on-diagonals.js

diff --git a/README.md b/README.md
index b63ed6c6..3097933b 100644
--- a/README.md
+++ b/README.md
@@ -2000,6 +2000,7 @@
 2706|[Buy Two Chocolates](./solutions/2706-buy-two-chocolates.js)|Easy|
 2707|[Extra Characters in a String](./solutions/2707-extra-characters-in-a-string.js)|Medium|
 2710|[Remove Trailing Zeros From a String](./solutions/2710-remove-trailing-zeros-from-a-string.js)|Easy|
+2711|[Difference of Number of Distinct Values on Diagonals](./solutions/2711-difference-of-number-of-distinct-values-on-diagonals.js)|Medium|
 2715|[Timeout Cancellation](./solutions/2715-timeout-cancellation.js)|Easy|
 2716|[Minimize String Length](./solutions/2716-minimize-string-length.js)|Easy|
 2721|[Execute Asynchronous Functions in Parallel](./solutions/2721-execute-asynchronous-functions-in-parallel.js)|Medium|
diff --git a/solutions/2711-difference-of-number-of-distinct-values-on-diagonals.js b/solutions/2711-difference-of-number-of-distinct-values-on-diagonals.js
new file mode 100644
index 00000000..86d12ee8
--- /dev/null
+++ b/solutions/2711-difference-of-number-of-distinct-values-on-diagonals.js
@@ -0,0 +1,55 @@
+/**
+ * 2711. Difference of Number of Distinct Values on Diagonals
+ * https://leetcode.com/problems/difference-of-number-of-distinct-values-on-diagonals/
+ * Difficulty: Medium
+ *
+ * Given a 2D grid of size m x n, you should find the matrix answer of size m x n.
+ *
+ * The cell answer[r][c] is calculated by looking at the diagonal values of the cell grid[r][c]:
+ * - Let leftAbove[r][c] be the number of distinct values on the diagonal to the left and above
+ *   the cell grid[r][c] not including the cell grid[r][c] itself.
+ * - Let rightBelow[r][c] be the number of distinct values on the diagonal to the right and below
+ *   the cell grid[r][c], not including the cell grid[r][c] itself.
+ * - Then answer[r][c] = |leftAbove[r][c] - rightBelow[r][c]|.
+ *
+ * A matrix diagonal is a diagonal line of cells starting from some cell in either the topmost
+ * row or leftmost column and going in the bottom-right direction until the end of the matrix
+ * is reached.
+ *
+ * - For example, in the below diagram the diagonal is highlighted using the cell with indices
+ *   (2, 3) colored gray:
+ *   - Red-colored cells are left and above the cell.
+ *   - Blue-colored cells are right and below the cell.
+ */
+
+/**
+ * @param {number[][]} grid
+ * @return {number[][]}
+ */
+var differenceOfDistinctValues = function(grid) {
+  const rows = grid.length;
+  const cols = grid[0].length;
+  const result = Array.from({ length: rows }, () => new Array(cols).fill(0));
+
+  for (let r = 0; r < rows; r++) {
+    for (let c = 0; c < cols; c++) {
+      const leftAboveSet = new Set();
+      let i = r - 1;
+      let j = c - 1;
+      while (i >= 0 && j >= 0) {
+        leftAboveSet.add(grid[i--][j--]);
+      }
+
+      const rightBelowSet = new Set();
+      i = r + 1;
+      j = c + 1;
+      while (i < rows && j < cols) {
+        rightBelowSet.add(grid[i++][j++]);
+      }
+
+      result[r][c] = Math.abs(leftAboveSet.size - rightBelowSet.size);
+    }
+  }
+
+  return result;
+};

From 5885e51379e58c10f15ae5a6f951c809050b8462 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 31 May 2025 09:40:53 -0500
Subject: [PATCH 350/571] Add solution #2712

---
 README.md                                     |  1 +
 ...nimum-cost-to-make-all-characters-equal.js | 32 +++++++++++++++++++
 2 files changed, 33 insertions(+)
 create mode 100644 solutions/2712-minimum-cost-to-make-all-characters-equal.js

diff --git a/README.md b/README.md
index 3097933b..b676005c 100644
--- a/README.md
+++ b/README.md
@@ -2001,6 +2001,7 @@
 2707|[Extra Characters in a String](./solutions/2707-extra-characters-in-a-string.js)|Medium|
 2710|[Remove Trailing Zeros From a String](./solutions/2710-remove-trailing-zeros-from-a-string.js)|Easy|
 2711|[Difference of Number of Distinct Values on Diagonals](./solutions/2711-difference-of-number-of-distinct-values-on-diagonals.js)|Medium|
+2712|[Minimum Cost to Make All Characters Equal](./solutions/2712-minimum-cost-to-make-all-characters-equal.js)|Medium|
 2715|[Timeout Cancellation](./solutions/2715-timeout-cancellation.js)|Easy|
 2716|[Minimize String Length](./solutions/2716-minimize-string-length.js)|Easy|
 2721|[Execute Asynchronous Functions in Parallel](./solutions/2721-execute-asynchronous-functions-in-parallel.js)|Medium|
diff --git a/solutions/2712-minimum-cost-to-make-all-characters-equal.js b/solutions/2712-minimum-cost-to-make-all-characters-equal.js
new file mode 100644
index 00000000..bc70fa86
--- /dev/null
+++ b/solutions/2712-minimum-cost-to-make-all-characters-equal.js
@@ -0,0 +1,32 @@
+/**
+ * 2712. Minimum Cost to Make All Characters Equal
+ * https://leetcode.com/problems/minimum-cost-to-make-all-characters-equal/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed binary string s of length n on which you can apply two types
+ * of operations:
+ * - Choose an index i and invert all characters from index 0 to index i (both inclusive),
+ *   with a cost of i + 1
+ * - Choose an index i and invert all characters from index i to index n - 1 (both inclusive),
+ *   with a cost of n - i
+ *
+ * Return the minimum cost to make all characters of the string equal.
+ *
+ * Invert a character means if its value is '0' it becomes '1' and vice-versa.
+ */
+
+/**
+ * @param {string} s
+ * @return {number}
+ */
+var minimumCost = function(s) {
+  let result = 0;
+
+  for (let i = 1; i < s.length; i++) {
+    if (s[i] !== s[i - 1]) {
+      result += Math.min(i, s.length - i);
+    }
+  }
+
+  return result;
+};

From 6fac895dc5362953ce472d321d28a91c2e72ae25 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 31 May 2025 09:42:16 -0500
Subject: [PATCH 351/571] Add solution #2717

---
 README.md                                  |  1 +
 solutions/2717-semi-ordered-permutation.js | 33 ++++++++++++++++++++++
 2 files changed, 34 insertions(+)
 create mode 100644 solutions/2717-semi-ordered-permutation.js

diff --git a/README.md b/README.md
index b676005c..af73a983 100644
--- a/README.md
+++ b/README.md
@@ -2004,6 +2004,7 @@
 2712|[Minimum Cost to Make All Characters Equal](./solutions/2712-minimum-cost-to-make-all-characters-equal.js)|Medium|
 2715|[Timeout Cancellation](./solutions/2715-timeout-cancellation.js)|Easy|
 2716|[Minimize String Length](./solutions/2716-minimize-string-length.js)|Easy|
+2717|[Semi-Ordered Permutation](./solutions/2717-semi-ordered-permutation.js)|Easy|
 2721|[Execute Asynchronous Functions in Parallel](./solutions/2721-execute-asynchronous-functions-in-parallel.js)|Medium|
 2722|[Join Two Arrays by ID](./solutions/2722-join-two-arrays-by-id.js)|Medium|
 2723|[Add Two Promises](./solutions/2723-add-two-promises.js)|Easy|
diff --git a/solutions/2717-semi-ordered-permutation.js b/solutions/2717-semi-ordered-permutation.js
new file mode 100644
index 00000000..b1717e3c
--- /dev/null
+++ b/solutions/2717-semi-ordered-permutation.js
@@ -0,0 +1,33 @@
+/**
+ * 2717. Semi-Ordered Permutation
+ * https://leetcode.com/problems/semi-ordered-permutation/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed permutation of n integers nums.
+ *
+ * A permutation is called semi-ordered if the first number equals 1 and the last number equals n.
+ * You can perform the below operation as many times as you want until you make nums a semi-ordered
+ * permutation:
+ * - Pick two adjacent elements in nums, then swap them.
+ *
+ * Return the minimum number of operations to make nums a semi-ordered permutation.
+ *
+ * A permutation is a sequence of integers from 1 to n of length n containing each number exactly
+ * once.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var semiOrderedPermutation = function(nums) {
+  let oneIndex = 0;
+  let nIndex = 0;
+
+  for (let i = 0; i < nums.length; i++) {
+    if (nums[i] === 1) oneIndex = i;
+    if (nums[i] === nums.length) nIndex = i;
+  }
+
+  return oneIndex + (nums.length - 1 - nIndex) - (oneIndex > nIndex ? 1 : 0);
+};

From b0516147fabea7dd2a2e945ea7d42b0b23df36fc Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 31 May 2025 21:43:31 -0500
Subject: [PATCH 352/571] Add solution #2929

---
 README.md                                     |  1 +
 ...29-distribute-candies-among-children-ii.js | 30 +++++++++++++++++++
 2 files changed, 31 insertions(+)
 create mode 100644 solutions/2929-distribute-candies-among-children-ii.js

diff --git a/README.md b/README.md
index af73a983..41544340 100644
--- a/README.md
+++ b/README.md
@@ -2023,6 +2023,7 @@
 2900|[Longest Unequal Adjacent Groups Subsequence I](./solutions/2900-longest-unequal-adjacent-groups-subsequence-i.js)|Easy|
 2901|[Longest Unequal Adjacent Groups Subsequence II](./solutions/2901-longest-unequal-adjacent-groups-subsequence-ii.js)|Medium|
 2918|[Minimum Equal Sum of Two Arrays After Replacing Zeros](./solutions/2918-minimum-equal-sum-of-two-arrays-after-replacing-zeros.js)|Medium|
+2929|[Distribute Candies Among Children II](./solutions/2929-distribute-candies-among-children-ii.js)|Medium|
 2942|[Find Words Containing Character](./solutions/2942-find-words-containing-character.js)|Easy|
 2948|[Make Lexicographically Smallest Array by Swapping Elements](./solutions/2948-make-lexicographically-smallest-array-by-swapping-elements.js)|Medium|
 2962|[Count Subarrays Where Max Element Appears at Least K Times](./solutions/2962-count-subarrays-where-max-element-appears-at-least-k-times.js)|Medium|
diff --git a/solutions/2929-distribute-candies-among-children-ii.js b/solutions/2929-distribute-candies-among-children-ii.js
new file mode 100644
index 00000000..40e830ec
--- /dev/null
+++ b/solutions/2929-distribute-candies-among-children-ii.js
@@ -0,0 +1,30 @@
+/**
+ * 2929. Distribute Candies Among Children II
+ * https://leetcode.com/problems/distribute-candies-among-children-ii/
+ * Difficulty: Medium
+ *
+ * You are given two positive integers n and limit.
+ *
+ * Return the total number of ways to distribute n candies among 3 children such that no child
+ * gets more than limit candies.
+ */
+
+/**
+ * @param {number} n
+ * @param {number} limit
+ * @return {number}
+ */
+var distributeCandies = function(n, limit) {
+  const minCandies = Math.max(0, n - 2 * limit);
+  const maxCandies = Math.min(n, limit);
+  let result = 0;
+
+  for (let i = minCandies; i <= maxCandies; i++) {
+    const remaining = n - i;
+    const minSecond = Math.max(0, remaining - limit);
+    const maxSecond = Math.min(remaining, limit);
+    result += maxSecond - minSecond + 1;
+  }
+
+  return result;
+};

From b7f01aae91f2f7939faac19db321f20826c0d163 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 31 May 2025 21:48:20 -0500
Subject: [PATCH 353/571] Add solution #2709

---
 README.md                                     |  1 +
 .../2709-greatest-common-divisor-traversal.js | 79 +++++++++++++++++++
 2 files changed, 80 insertions(+)
 create mode 100644 solutions/2709-greatest-common-divisor-traversal.js

diff --git a/README.md b/README.md
index 41544340..bf4c8bc6 100644
--- a/README.md
+++ b/README.md
@@ -1999,6 +1999,7 @@
 2705|[Compact Object](./solutions/2705-compact-object.js)|Medium|
 2706|[Buy Two Chocolates](./solutions/2706-buy-two-chocolates.js)|Easy|
 2707|[Extra Characters in a String](./solutions/2707-extra-characters-in-a-string.js)|Medium|
+2709|[Greatest Common Divisor Traversal](./solutions/2709-greatest-common-divisor-traversal.js)|Hard|
 2710|[Remove Trailing Zeros From a String](./solutions/2710-remove-trailing-zeros-from-a-string.js)|Easy|
 2711|[Difference of Number of Distinct Values on Diagonals](./solutions/2711-difference-of-number-of-distinct-values-on-diagonals.js)|Medium|
 2712|[Minimum Cost to Make All Characters Equal](./solutions/2712-minimum-cost-to-make-all-characters-equal.js)|Medium|
diff --git a/solutions/2709-greatest-common-divisor-traversal.js b/solutions/2709-greatest-common-divisor-traversal.js
new file mode 100644
index 00000000..0db68ad2
--- /dev/null
+++ b/solutions/2709-greatest-common-divisor-traversal.js
@@ -0,0 +1,79 @@
+/**
+ * 2709. Greatest Common Divisor Traversal
+ * https://leetcode.com/problems/greatest-common-divisor-traversal/
+ * Difficulty: Hard
+ *
+ * You are given a 0-indexed integer array nums, and you are allowed to traverse between its
+ * indices. You can traverse between index i and index j, i != j, if and only if gcd(nums[i],
+ * nums[j]) > 1, where gcd is the greatest common divisor.
+ *
+ * Your task is to determine if for every pair of indices i and j in nums, where i < j, there
+ * exists a sequence of traversals that can take us from i to j.
+ *
+ * Return true if it is possible to traverse between all such pairs of indices, or false otherwise.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {boolean}
+ */
+var canTraverseAllPairs = function(nums) {
+  if (nums.length === 1) return true;
+  const n = nums.length;
+  const maxNum = Math.max(...nums);
+  const parent = new Array(maxNum + 1).fill().map((_, i) => i);
+  const rank = new Array(maxNum + 1).fill(0);
+
+  const primeToIndex = new Map();
+  for (let i = 0; i < n; i++) {
+    if (nums[i] === 1) return false;
+    const factors = getPrimeFactors(nums[i]);
+    for (const prime of factors) {
+      if (primeToIndex.has(prime)) {
+        union(primeToIndex.get(prime), i);
+      } else {
+        primeToIndex.set(prime, i);
+      }
+    }
+  }
+
+  const root = find(0);
+  for (let i = 1; i < n; i++) {
+    if (find(i) !== root) return false;
+  }
+
+  return true;
+
+  function find(x) {
+    if (parent[x] !== x) {
+      parent[x] = find(parent[x]);
+    }
+    return parent[x];
+  }
+
+  function union(x, y) {
+    const px = find(x);
+    const py = find(y);
+    if (px === py) return;
+    if (rank[px] < rank[py]) {
+      parent[px] = py;
+    } else if (rank[px] > rank[py]) {
+      parent[py] = px;
+    } else {
+      parent[py] = px;
+      rank[px]++;
+    }
+  }
+
+  function getPrimeFactors(num) {
+    const factors = [];
+    for (let i = 2; i * i <= num; i++) {
+      if (num % i === 0) {
+        factors.push(i);
+        while (num % i === 0) num /= i;
+      }
+    }
+    if (num > 1) factors.push(num);
+    return factors;
+  }
+};

From 385540f5b0c9b1b29d8e3abe7f2548b430914d90 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 31 May 2025 21:49:51 -0500
Subject: [PATCH 354/571] Add solution #2729

---
 README.md                                     |  1 +
 ...2729-check-if-the-number-is-fascinating.js | 26 +++++++++++++++++++
 2 files changed, 27 insertions(+)
 create mode 100644 solutions/2729-check-if-the-number-is-fascinating.js

diff --git a/README.md b/README.md
index bf4c8bc6..9f34e57a 100644
--- a/README.md
+++ b/README.md
@@ -2013,6 +2013,7 @@
 2725|[Interval Cancellation](./solutions/2725-interval-cancellation.js)|Easy|
 2726|[Calculator with Method Chaining](./solutions/2726-calculator-with-method-chaining.js)|Easy|
 2727|[Is Object Empty](./solutions/2727-is-object-empty.js)|Easy|
+2729|[Check if The Number is Fascinating](./solutions/2729-check-if-the-number-is-fascinating.js)|Easy|
 2780|[Minimum Index of a Valid Split](./solutions/2780-minimum-index-of-a-valid-split.js)|Medium|
 2799|[Count Complete Subarrays in an Array](./solutions/2799-count-complete-subarrays-in-an-array.js)|Medium|
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
diff --git a/solutions/2729-check-if-the-number-is-fascinating.js b/solutions/2729-check-if-the-number-is-fascinating.js
new file mode 100644
index 00000000..12537342
--- /dev/null
+++ b/solutions/2729-check-if-the-number-is-fascinating.js
@@ -0,0 +1,26 @@
+/**
+ * 2729. Check if The Number is Fascinating
+ * https://leetcode.com/problems/check-if-the-number-is-fascinating/
+ * Difficulty: Easy
+ *
+ * You are given an integer n that consists of exactly 3 digits.
+ *
+ * We call the number n fascinating if, after the following modification, the resulting number
+ * contains all the digits from 1 to 9 exactly once and does not contain any 0's:
+ * - Concatenate n with the numbers 2 * n and 3 * n.
+ *
+ * Return true if n is fascinating, or false otherwise.
+ *
+ * Concatenating two numbers means joining them together. For example, the concatenation of 121
+ * and 371 is 121371.
+ */
+
+/**
+ * @param {number} n
+ * @return {boolean}
+ */
+var isFascinating = function(n) {
+  const concatenated = `${n}${2 * n}${3 * n}`;
+  const digitSet = new Set(concatenated);
+  return concatenated.length === 9 && digitSet.size === 9 && !digitSet.has('0');
+};

From 7b39dcc4a0902c338d0feffbe443e314cdcc0f49 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 31 May 2025 21:50:59 -0500
Subject: [PATCH 355/571] Add solution #2732

---
 README.md                                     |  1 +
 .../2732-find-a-good-subset-of-the-matrix.js  | 48 +++++++++++++++++++
 2 files changed, 49 insertions(+)
 create mode 100644 solutions/2732-find-a-good-subset-of-the-matrix.js

diff --git a/README.md b/README.md
index 9f34e57a..a92406b8 100644
--- a/README.md
+++ b/README.md
@@ -2014,6 +2014,7 @@
 2726|[Calculator with Method Chaining](./solutions/2726-calculator-with-method-chaining.js)|Easy|
 2727|[Is Object Empty](./solutions/2727-is-object-empty.js)|Easy|
 2729|[Check if The Number is Fascinating](./solutions/2729-check-if-the-number-is-fascinating.js)|Easy|
+2732|[Find a Good Subset of the Matrix](./solutions/2732-find-a-good-subset-of-the-matrix.js)|Hard|
 2780|[Minimum Index of a Valid Split](./solutions/2780-minimum-index-of-a-valid-split.js)|Medium|
 2799|[Count Complete Subarrays in an Array](./solutions/2799-count-complete-subarrays-in-an-array.js)|Medium|
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
diff --git a/solutions/2732-find-a-good-subset-of-the-matrix.js b/solutions/2732-find-a-good-subset-of-the-matrix.js
new file mode 100644
index 00000000..1e13f830
--- /dev/null
+++ b/solutions/2732-find-a-good-subset-of-the-matrix.js
@@ -0,0 +1,48 @@
+/**
+ * 2732. Find a Good Subset of the Matrix
+ * https://leetcode.com/problems/find-a-good-subset-of-the-matrix/
+ * Difficulty: Hard
+ *
+ * You are given a 0-indexed m x n binary matrix grid.
+ *
+ * Let us call a non-empty subset of rows good if the sum of each column of the subset is at
+ * most half of the length of the subset.
+ *
+ * More formally, if the length of the chosen subset of rows is k, then the sum of each column
+ * should be at most floor(k / 2).
+ *
+ * Return an integer array that contains row indices of a good subset sorted in ascending order.
+ *
+ * If there are multiple good subsets, you can return any of them. If there are no good subsets,
+ * return an empty array.
+ *
+ * A subset of rows of the matrix grid is any matrix that can be obtained by deleting some (possibly
+ * none or all) rows from grid.
+ */
+
+/**
+ * @param {number[][]} grid
+ * @return {number[]}
+ */
+var goodSubsetofBinaryMatrix = function(grid) {
+  const rows = grid.length;
+  const cols = grid[0].length;
+  const rowMasks = new Map();
+
+  for (let i = 0; i < rows; i++) {
+    let mask = 0;
+    for (let j = 0; j < cols; j++) {
+      mask |= grid[i][j] << j;
+    }
+    if (mask === 0) return [i];
+    rowMasks.set(mask, i);
+  }
+
+  for (const [mask1, i] of rowMasks) {
+    for (const [mask2, j] of rowMasks) {
+      if ((mask1 & mask2) === 0) return [Math.min(i, j), Math.max(i, j)];
+    }
+  }
+
+  return [];
+};

From b6866c0e9e26def7aeea4f42278cdcb1e2f576b2 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 31 May 2025 21:51:51 -0500
Subject: [PATCH 356/571] Add solution #2733

---
 README.md                                     |  1 +
 solutions/2733-neither-minimum-nor-maximum.js | 27 +++++++++++++++++++
 2 files changed, 28 insertions(+)
 create mode 100644 solutions/2733-neither-minimum-nor-maximum.js

diff --git a/README.md b/README.md
index a92406b8..039fc61e 100644
--- a/README.md
+++ b/README.md
@@ -2015,6 +2015,7 @@
 2727|[Is Object Empty](./solutions/2727-is-object-empty.js)|Easy|
 2729|[Check if The Number is Fascinating](./solutions/2729-check-if-the-number-is-fascinating.js)|Easy|
 2732|[Find a Good Subset of the Matrix](./solutions/2732-find-a-good-subset-of-the-matrix.js)|Hard|
+2733|[Neither Minimum nor Maximum](./solutions/2733-neither-minimum-nor-maximum.js)|Easy|
 2780|[Minimum Index of a Valid Split](./solutions/2780-minimum-index-of-a-valid-split.js)|Medium|
 2799|[Count Complete Subarrays in an Array](./solutions/2799-count-complete-subarrays-in-an-array.js)|Medium|
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
diff --git a/solutions/2733-neither-minimum-nor-maximum.js b/solutions/2733-neither-minimum-nor-maximum.js
new file mode 100644
index 00000000..4dcc9150
--- /dev/null
+++ b/solutions/2733-neither-minimum-nor-maximum.js
@@ -0,0 +1,27 @@
+/**
+ * 2733. Neither Minimum nor Maximum
+ * https://leetcode.com/problems/neither-minimum-nor-maximum/
+ * Difficulty: Easy
+ *
+ * Given an integer array nums containing distinct positive integers, find and return any
+ * number from the array that is neither the minimum nor the maximum value in the array,
+ * or -1 if there is no such number.
+ *
+ * Return the selected integer.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var findNonMinOrMax = function(nums) {
+  if (nums.length < 3) return -1;
+  const minVal = Math.min(nums[0], nums[1], nums[2]);
+  const maxVal = Math.max(nums[0], nums[1], nums[2]);
+
+  for (const num of [nums[0], nums[1], nums[2]]) {
+    if (num !== minVal && num !== maxVal) return num;
+  }
+
+  return -1;
+};

From f289eb44e43c7ef9d9adbdcfe2337f163fdb885d Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 31 May 2025 21:54:45 -0500
Subject: [PATCH 357/571] Add solution #2739

---
 README.md                                 |  1 +
 solutions/2739-total-distance-traveled.js | 38 +++++++++++++++++++++++
 2 files changed, 39 insertions(+)
 create mode 100644 solutions/2739-total-distance-traveled.js

diff --git a/README.md b/README.md
index 039fc61e..3dc20ef4 100644
--- a/README.md
+++ b/README.md
@@ -2016,6 +2016,7 @@
 2729|[Check if The Number is Fascinating](./solutions/2729-check-if-the-number-is-fascinating.js)|Easy|
 2732|[Find a Good Subset of the Matrix](./solutions/2732-find-a-good-subset-of-the-matrix.js)|Hard|
 2733|[Neither Minimum nor Maximum](./solutions/2733-neither-minimum-nor-maximum.js)|Easy|
+2739|[Total Distance Traveled](./solutions/2739-total-distance-traveled.js)|Easy|
 2780|[Minimum Index of a Valid Split](./solutions/2780-minimum-index-of-a-valid-split.js)|Medium|
 2799|[Count Complete Subarrays in an Array](./solutions/2799-count-complete-subarrays-in-an-array.js)|Medium|
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
diff --git a/solutions/2739-total-distance-traveled.js b/solutions/2739-total-distance-traveled.js
new file mode 100644
index 00000000..2c2d593d
--- /dev/null
+++ b/solutions/2739-total-distance-traveled.js
@@ -0,0 +1,38 @@
+/**
+ * 2739. Total Distance Traveled
+ * https://leetcode.com/problems/total-distance-traveled/
+ * Difficulty: Easy
+ *
+ * A truck has two fuel tanks. You are given two integers, mainTank representing the fuel present
+ * in the main tank in liters and additionalTank representing the fuel present in the additional
+ * tank in liters.
+ *
+ * The truck has a mileage of 10 km per liter. Whenever 5 liters of fuel get used up in the main
+ * tank, if the additional tank has at least 1 liters of fuel, 1 liters of fuel will be transferred
+ * from the additional tank to the main tank.
+ *
+ * Return the maximum distance which can be traveled.
+ *
+ * Note: Injection from the additional tank is not continuous. It happens suddenly and immediately
+ * for every 5 liters consumed.
+ */
+
+/**
+ * @param {number} mainTank
+ * @param {number} additionalTank
+ * @return {number}
+ */
+var distanceTraveled = function(mainTank, additionalTank) {
+  let distance = 0;
+  let fuel = mainTank;
+
+  while (fuel >= 5 && additionalTank > 0) {
+    distance += 50;
+    fuel -= 5;
+    fuel += 1;
+    additionalTank -= 1;
+  }
+
+  distance += fuel * 10;
+  return distance;
+};

From 5d524686784a1b2ab3f83cbabfed18f95e9dba8d Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 31 May 2025 21:55:55 -0500
Subject: [PATCH 358/571] Add solution #2740

---
 README.md                                     |  1 +
 .../2740-find-the-value-of-the-partition.js   | 34 +++++++++++++++++++
 2 files changed, 35 insertions(+)
 create mode 100644 solutions/2740-find-the-value-of-the-partition.js

diff --git a/README.md b/README.md
index 3dc20ef4..1f13529c 100644
--- a/README.md
+++ b/README.md
@@ -2017,6 +2017,7 @@
 2732|[Find a Good Subset of the Matrix](./solutions/2732-find-a-good-subset-of-the-matrix.js)|Hard|
 2733|[Neither Minimum nor Maximum](./solutions/2733-neither-minimum-nor-maximum.js)|Easy|
 2739|[Total Distance Traveled](./solutions/2739-total-distance-traveled.js)|Easy|
+2740|[Find the Value of the Partition](./solutions/2740-find-the-value-of-the-partition.js)|Medium|
 2780|[Minimum Index of a Valid Split](./solutions/2780-minimum-index-of-a-valid-split.js)|Medium|
 2799|[Count Complete Subarrays in an Array](./solutions/2799-count-complete-subarrays-in-an-array.js)|Medium|
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
diff --git a/solutions/2740-find-the-value-of-the-partition.js b/solutions/2740-find-the-value-of-the-partition.js
new file mode 100644
index 00000000..8c1f661e
--- /dev/null
+++ b/solutions/2740-find-the-value-of-the-partition.js
@@ -0,0 +1,34 @@
+/**
+ * 2740. Find the Value of the Partition
+ * https://leetcode.com/problems/find-the-value-of-the-partition/
+ * Difficulty: Medium
+ *
+ * You are given a positive integer array nums.
+ *
+ * Partition nums into two arrays, nums1 and nums2, such that:
+ * - Each element of the array nums belongs to either the array nums1 or the array nums2.
+ * - Both arrays are non-empty.
+ * - The value of the partition is minimized.
+ *
+ * The value of the partition is |max(nums1) - min(nums2)|.
+ *
+ * Here, max(nums1) denotes the maximum element of the array nums1, and min(nums2) denotes the
+ * minimum element of the array nums2.
+ *
+ * Return the integer denoting the value of such partition.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var findValueOfPartition = function(nums) {
+  nums.sort((a, b) => a - b);
+  let result = Infinity;
+
+  for (let i = 1; i < nums.length; i++) {
+    result = Math.min(result, nums[i] - nums[i - 1]);
+  }
+
+  return result;
+};

From 68a19de593fe341fd1d9dd4f570dea8b0b6b7f81 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 31 May 2025 21:56:58 -0500
Subject: [PATCH 359/571] Add solution #2742

---
 README.md                            |  1 +
 solutions/2742-painting-the-walls.js | 38 ++++++++++++++++++++++++++++
 2 files changed, 39 insertions(+)
 create mode 100644 solutions/2742-painting-the-walls.js

diff --git a/README.md b/README.md
index 1f13529c..65a7b884 100644
--- a/README.md
+++ b/README.md
@@ -2018,6 +2018,7 @@
 2733|[Neither Minimum nor Maximum](./solutions/2733-neither-minimum-nor-maximum.js)|Easy|
 2739|[Total Distance Traveled](./solutions/2739-total-distance-traveled.js)|Easy|
 2740|[Find the Value of the Partition](./solutions/2740-find-the-value-of-the-partition.js)|Medium|
+2742|[Painting the Walls](./solutions/2742-painting-the-walls.js)|Hard|
 2780|[Minimum Index of a Valid Split](./solutions/2780-minimum-index-of-a-valid-split.js)|Medium|
 2799|[Count Complete Subarrays in an Array](./solutions/2799-count-complete-subarrays-in-an-array.js)|Medium|
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
diff --git a/solutions/2742-painting-the-walls.js b/solutions/2742-painting-the-walls.js
new file mode 100644
index 00000000..42275242
--- /dev/null
+++ b/solutions/2742-painting-the-walls.js
@@ -0,0 +1,38 @@
+/**
+ * 2742. Painting the Walls
+ * https://leetcode.com/problems/painting-the-walls/
+ * Difficulty: Hard
+ *
+ * You are given two 0-indexed integer arrays, cost and time, of size n representing the costs
+ * and the time taken to paint n different walls respectively. There are two painters available:
+ * - A paid painter that paints the ith wall in time[i] units of time and takes cost[i] units of
+ *   money.
+ * - A free painter that paints any wall in 1 unit of time at a cost of 0. But the free painter
+ *   can only be used if the paid painter is already occupied.
+ *
+ * Return the minimum amount of money required to paint the n walls.
+ */
+
+/**
+ * @param {number[]} cost
+ * @param {number[]} time
+ * @return {number}
+ */
+var paintWalls = function(cost, time) {
+  const n = cost.length;
+  const dp = new Array(n + 1).fill().map(() => new Array(n + 1).fill(Infinity));
+  dp[0][0] = 0;
+
+  for (let i = 0; i < n; i++) {
+    for (let j = 0; j <= n; j++) {
+      if (dp[i][j] === Infinity) continue;
+
+      dp[i + 1][j] = Math.min(dp[i + 1][j], dp[i][j]);
+
+      const walls = Math.min(n, j + time[i] + 1);
+      dp[i + 1][walls] = Math.min(dp[i + 1][walls], dp[i][j] + cost[i]);
+    }
+  }
+
+  return dp[n][n];
+};

From 86db404d3566ce27bbdc6f645d857634713a74d7 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 31 May 2025 21:58:11 -0500
Subject: [PATCH 360/571] Add solution #2744

---
 README.md                                     |  1 +
 ...744-find-maximum-number-of-string-pairs.js | 36 +++++++++++++++++++
 2 files changed, 37 insertions(+)
 create mode 100644 solutions/2744-find-maximum-number-of-string-pairs.js

diff --git a/README.md b/README.md
index 65a7b884..740d35cc 100644
--- a/README.md
+++ b/README.md
@@ -2019,6 +2019,7 @@
 2739|[Total Distance Traveled](./solutions/2739-total-distance-traveled.js)|Easy|
 2740|[Find the Value of the Partition](./solutions/2740-find-the-value-of-the-partition.js)|Medium|
 2742|[Painting the Walls](./solutions/2742-painting-the-walls.js)|Hard|
+2744|[Find Maximum Number of String Pairs](./solutions/2744-find-maximum-number-of-string-pairs.js)|Easy|
 2780|[Minimum Index of a Valid Split](./solutions/2780-minimum-index-of-a-valid-split.js)|Medium|
 2799|[Count Complete Subarrays in an Array](./solutions/2799-count-complete-subarrays-in-an-array.js)|Medium|
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
diff --git a/solutions/2744-find-maximum-number-of-string-pairs.js b/solutions/2744-find-maximum-number-of-string-pairs.js
new file mode 100644
index 00000000..b8e9a4ac
--- /dev/null
+++ b/solutions/2744-find-maximum-number-of-string-pairs.js
@@ -0,0 +1,36 @@
+/**
+ * 2744. Find Maximum Number of String Pairs
+ * https://leetcode.com/problems/find-maximum-number-of-string-pairs/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed array words consisting of distinct strings.
+ *
+ * The string words[i] can be paired with the string words[j] if:
+ * - The string words[i] is equal to the reversed string of words[j].
+ * - 0 <= i < j < words.length.
+ *
+ * Return the maximum number of pairs that can be formed from the array words.
+ *
+ * Note that each string can belong in at most one pair.
+ */
+
+/**
+ * @param {string[]} words
+ * @return {number}
+ */
+var maximumNumberOfStringPairs = function(words) {
+  const set = new Set();
+  let result = 0;
+
+  for (const word of words) {
+    const reversed = word[1] + word[0];
+    if (set.has(reversed)) {
+      result++;
+      set.delete(reversed);
+    } else {
+      set.add(word);
+    }
+  }
+
+  return result;
+};

From d0900be9c8aacef0a74b9da829c7d64edc3302d1 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 31 May 2025 21:59:07 -0500
Subject: [PATCH 361/571] Add solution #2745

---
 README.md                                     |  1 +
 .../2745-construct-the-longest-new-string.js  | 26 +++++++++++++++++++
 2 files changed, 27 insertions(+)
 create mode 100644 solutions/2745-construct-the-longest-new-string.js

diff --git a/README.md b/README.md
index 740d35cc..360b4e4f 100644
--- a/README.md
+++ b/README.md
@@ -2020,6 +2020,7 @@
 2740|[Find the Value of the Partition](./solutions/2740-find-the-value-of-the-partition.js)|Medium|
 2742|[Painting the Walls](./solutions/2742-painting-the-walls.js)|Hard|
 2744|[Find Maximum Number of String Pairs](./solutions/2744-find-maximum-number-of-string-pairs.js)|Easy|
+2745|[Construct the Longest New String](./solutions/2745-construct-the-longest-new-string.js)|Medium|
 2780|[Minimum Index of a Valid Split](./solutions/2780-minimum-index-of-a-valid-split.js)|Medium|
 2799|[Count Complete Subarrays in an Array](./solutions/2799-count-complete-subarrays-in-an-array.js)|Medium|
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
diff --git a/solutions/2745-construct-the-longest-new-string.js b/solutions/2745-construct-the-longest-new-string.js
new file mode 100644
index 00000000..c5014fa7
--- /dev/null
+++ b/solutions/2745-construct-the-longest-new-string.js
@@ -0,0 +1,26 @@
+/**
+ * 2745. Construct the Longest New String
+ * https://leetcode.com/problems/construct-the-longest-new-string/
+ * Difficulty: Medium
+ *
+ * You are given three integers x, y, and z.
+ *
+ * You have x strings equal to "AA", y strings equal to "BB", and z strings equal to "AB". You
+ * want to choose some (possibly all or none) of these strings and concatenate them in some order
+ * to form a new string. This new string must not contain "AAA" or "BBB" as a substring.
+ *
+ * Return the maximum possible length of the new string.
+ *
+ * A substring is a contiguous non-empty sequence of characters within a string.
+ */
+
+/**
+ * @param {number} x
+ * @param {number} y
+ * @param {number} z
+ * @return {number}
+ */
+var longestString = function(x, y, z) {
+  const minPairs = Math.min(x, y);
+  return 2 * (minPairs * 2 + (x > minPairs ? 1 : 0) + (y > minPairs ? 1 : 0) + z);
+};

From 7f9d5bbb6f5e421a8a972d866d5f3d367ef52552 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 31 May 2025 22:30:17 -0500
Subject: [PATCH 362/571] Add solution #2748

---
 README.md                                   |  1 +
 solutions/2748-number-of-beautiful-pairs.js | 53 +++++++++++++++++++++
 2 files changed, 54 insertions(+)
 create mode 100644 solutions/2748-number-of-beautiful-pairs.js

diff --git a/README.md b/README.md
index 360b4e4f..6c510f97 100644
--- a/README.md
+++ b/README.md
@@ -2021,6 +2021,7 @@
 2742|[Painting the Walls](./solutions/2742-painting-the-walls.js)|Hard|
 2744|[Find Maximum Number of String Pairs](./solutions/2744-find-maximum-number-of-string-pairs.js)|Easy|
 2745|[Construct the Longest New String](./solutions/2745-construct-the-longest-new-string.js)|Medium|
+2748|[Number of Beautiful Pairs](./solutions/2748-number-of-beautiful-pairs.js)|Easy|
 2780|[Minimum Index of a Valid Split](./solutions/2780-minimum-index-of-a-valid-split.js)|Medium|
 2799|[Count Complete Subarrays in an Array](./solutions/2799-count-complete-subarrays-in-an-array.js)|Medium|
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
diff --git a/solutions/2748-number-of-beautiful-pairs.js b/solutions/2748-number-of-beautiful-pairs.js
new file mode 100644
index 00000000..28e7a52f
--- /dev/null
+++ b/solutions/2748-number-of-beautiful-pairs.js
@@ -0,0 +1,53 @@
+/**
+ * 2748. Number of Beautiful Pairs
+ * https://leetcode.com/problems/number-of-beautiful-pairs/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed integer array nums. A pair of indices i, j where
+ * 0 <= i < j < nums.length is called beautiful if the first digit of nums[i] and
+ * the last digit of nums[j] are coprime.
+ *
+ * Return the total number of beautiful pairs in nums.
+ *
+ * Two integers x and y are coprime if there is no integer greater than 1 that divides
+ * both of them. In other words, x and y are coprime if gcd(x, y) == 1, where gcd(x, y)
+ * is the greatest common divisor of x and y.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var countBeautifulPairs = function(nums) {
+  let result = 0;
+  for (let i = 0; i < nums.length - 1; i++) {
+    for (let j = i + 1; j < nums.length; j++) {
+      const first = getFirstDigit(nums[i]);
+      const last = getLastDigit(nums[j]);
+      if (gcd(first, last) === 1) {
+        result++;
+      }
+    }
+  }
+
+  return result;
+
+  function gcd(a, b) {
+    while (b) {
+      a %= b;
+      [a, b] = [b, a];
+    }
+    return a;
+  }
+
+  function getFirstDigit(num) {
+    while (num >= 10) {
+      num = Math.floor(num / 10);
+    }
+    return num;
+  }
+
+  function getLastDigit(num) {
+    return num % 10;
+  }
+};

From 16f0e41480f4eb48e2b41d043c6f17e1a71109d0 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 31 May 2025 22:32:44 -0500
Subject: [PATCH 363/571] Add solution #2751

---
 README.md                          |  1 +
 solutions/2751-robot-collisions.js | 76 ++++++++++++++++++++++++++++++
 2 files changed, 77 insertions(+)
 create mode 100644 solutions/2751-robot-collisions.js

diff --git a/README.md b/README.md
index 6c510f97..6628b4cf 100644
--- a/README.md
+++ b/README.md
@@ -2022,6 +2022,7 @@
 2744|[Find Maximum Number of String Pairs](./solutions/2744-find-maximum-number-of-string-pairs.js)|Easy|
 2745|[Construct the Longest New String](./solutions/2745-construct-the-longest-new-string.js)|Medium|
 2748|[Number of Beautiful Pairs](./solutions/2748-number-of-beautiful-pairs.js)|Easy|
+2751|[Robot Collisions](./solutions/2751-robot-collisions.js)|Hard|
 2780|[Minimum Index of a Valid Split](./solutions/2780-minimum-index-of-a-valid-split.js)|Medium|
 2799|[Count Complete Subarrays in an Array](./solutions/2799-count-complete-subarrays-in-an-array.js)|Medium|
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
diff --git a/solutions/2751-robot-collisions.js b/solutions/2751-robot-collisions.js
new file mode 100644
index 00000000..53149178
--- /dev/null
+++ b/solutions/2751-robot-collisions.js
@@ -0,0 +1,76 @@
+/**
+ * 2751. Robot Collisions
+ * https://leetcode.com/problems/robot-collisions/
+ * Difficulty: Hard
+ *
+ * There are n 1-indexed robots, each having a position on a line, health, and movement direction.
+ *
+ * You are given 0-indexed integer arrays positions, healths, and a string directions (directions[i]
+ * is either 'L' for left or 'R' for right). All integers in positions are unique.
+ *
+ * All robots start moving on the line simultaneously at the same speed in their given directions.
+ * If two robots ever share the same position while moving, they will collide.
+ *
+ * If two robots collide, the robot with lower health is removed from the line, and the health of
+ * the other robot decreases by one. The surviving robot continues in the same direction it was
+ * going. If both robots have the same health, they are both removed from the line.
+ *
+ * Your task is to determine the health of the robots that survive the collisions, in the same
+ * order that the robots were given, i.e. final health of robot 1 (if survived), final health
+ * of robot 2 (if survived), and so on. If there are no survivors, return an empty array.
+ *
+ * Return an array containing the health of the remaining robots (in the order they were given
+ * in the input), after no further collisions can occur.
+ *
+ * Note: The positions may be unsorted.
+ */
+
+/**
+ * @param {number[]} positions
+ * @param {number[]} healths
+ * @param {string} directions
+ * @return {number[]}
+ */
+var survivedRobotsHealths = function(positions, healths, directions) {
+  const n = positions.length;
+  const robots = Array.from({ length: n }, (_, i) => ({
+    index: i,
+    position: positions[i],
+    health: healths[i],
+    direction: directions[i]
+  }));
+
+  robots.sort((a, b) => a.position - b.position);
+
+  const stack = [];
+  for (const robot of robots) {
+    if (robot.direction === 'R') {
+      stack.push(robot);
+      continue;
+    }
+
+    while (stack.length && stack[stack.length - 1].direction === 'R' && robot.health > 0) {
+      const last = stack[stack.length - 1];
+      if (last.health === robot.health) {
+        stack.pop();
+        robot.health = 0;
+      } else if (last.health > robot.health) {
+        last.health--;
+        robot.health = 0;
+      } else {
+        stack.pop();
+        robot.health--;
+      }
+    }
+    if (robot.health > 0) {
+      stack.push(robot);
+    }
+  }
+
+  const result = new Array(n).fill(0);
+  for (const robot of stack) {
+    result[robot.index] = robot.health;
+  }
+
+  return result.filter(health => health > 0);
+};

From e2f5b8da71bd8f05f7a4a114b452dfc816a3b38d Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 31 May 2025 22:35:31 -0500
Subject: [PATCH 364/571] Add solution #2763

---
 README.md                                     |  1 +
 ...m-of-imbalance-numbers-of-all-subarrays.js | 51 +++++++++++++++++++
 2 files changed, 52 insertions(+)
 create mode 100644 solutions/2763-sum-of-imbalance-numbers-of-all-subarrays.js

diff --git a/README.md b/README.md
index 6628b4cf..c54ae148 100644
--- a/README.md
+++ b/README.md
@@ -2023,6 +2023,7 @@
 2745|[Construct the Longest New String](./solutions/2745-construct-the-longest-new-string.js)|Medium|
 2748|[Number of Beautiful Pairs](./solutions/2748-number-of-beautiful-pairs.js)|Easy|
 2751|[Robot Collisions](./solutions/2751-robot-collisions.js)|Hard|
+2763|[Sum of Imbalance Numbers of All Subarrays](./solutions/2763-sum-of-imbalance-numbers-of-all-subarrays.js)|Hard|
 2780|[Minimum Index of a Valid Split](./solutions/2780-minimum-index-of-a-valid-split.js)|Medium|
 2799|[Count Complete Subarrays in an Array](./solutions/2799-count-complete-subarrays-in-an-array.js)|Medium|
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
diff --git a/solutions/2763-sum-of-imbalance-numbers-of-all-subarrays.js b/solutions/2763-sum-of-imbalance-numbers-of-all-subarrays.js
new file mode 100644
index 00000000..5d7ba4ed
--- /dev/null
+++ b/solutions/2763-sum-of-imbalance-numbers-of-all-subarrays.js
@@ -0,0 +1,51 @@
+/**
+ * 2763. Sum of Imbalance Numbers of All Subarrays
+ * https://leetcode.com/problems/sum-of-imbalance-numbers-of-all-subarrays/
+ * Difficulty: Hard
+ *
+ * The imbalance number of a 0-indexed integer array arr of length n is defined as the number
+ * of indices in sarr = sorted(arr) such that:
+ * - 0 <= i < n - 1, and
+ * - sarr[i+1] - sarr[i] > 1
+ *
+ * Here, sorted(arr) is the function that returns the sorted version of arr.
+ *
+ * Given a 0-indexed integer array nums, return the sum of imbalance numbers of all its subarrays.
+ *
+ * A subarray is a contiguous non-empty sequence of elements within an array.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var sumImbalanceNumbers = function(nums) {
+  const n = nums.length;
+  let result = 0;
+
+  for (let i = 0; i < n; i++) {
+    const seen = new Set();
+    let imbalance = 0;
+
+    for (let j = i; j < n; j++) {
+      const current = nums[j];
+
+      if (!seen.has(current)) {
+        const hasNext = seen.has(current + 1);
+        const hasPrev = seen.has(current - 1);
+
+        if (hasNext && hasPrev) {
+          imbalance--;
+        } else if (!hasNext && !hasPrev && seen.size > 0) {
+          imbalance++;
+        }
+
+        seen.add(current);
+      }
+
+      result += imbalance;
+    }
+  }
+
+  return result;
+};

From ac9aade558e714121ebba74dd0007d382d2b37ef Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 31 May 2025 22:36:38 -0500
Subject: [PATCH 365/571] Add solution #2766

---
 README.md                          |  1 +
 solutions/2766-relocate-marbles.js | 34 ++++++++++++++++++++++++++++++
 2 files changed, 35 insertions(+)
 create mode 100644 solutions/2766-relocate-marbles.js

diff --git a/README.md b/README.md
index c54ae148..4280e619 100644
--- a/README.md
+++ b/README.md
@@ -2024,6 +2024,7 @@
 2748|[Number of Beautiful Pairs](./solutions/2748-number-of-beautiful-pairs.js)|Easy|
 2751|[Robot Collisions](./solutions/2751-robot-collisions.js)|Hard|
 2763|[Sum of Imbalance Numbers of All Subarrays](./solutions/2763-sum-of-imbalance-numbers-of-all-subarrays.js)|Hard|
+2766|[Relocate Marbles](./solutions/2766-relocate-marbles.js)|Medium|
 2780|[Minimum Index of a Valid Split](./solutions/2780-minimum-index-of-a-valid-split.js)|Medium|
 2799|[Count Complete Subarrays in an Array](./solutions/2799-count-complete-subarrays-in-an-array.js)|Medium|
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
diff --git a/solutions/2766-relocate-marbles.js b/solutions/2766-relocate-marbles.js
new file mode 100644
index 00000000..08d51e6f
--- /dev/null
+++ b/solutions/2766-relocate-marbles.js
@@ -0,0 +1,34 @@
+/**
+ * 2766. Relocate Marbles
+ * https://leetcode.com/problems/relocate-marbles/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed integer array nums representing the initial positions of some
+ * marbles. You are also given two 0-indexed integer arrays moveFrom and moveTo of equal length.
+ *
+ * Throughout moveFrom.length steps, you will change the positions of the marbles. On the ith
+ * step, you will move all marbles at position moveFrom[i] to position moveTo[i].
+ *
+ * After completing all the steps, return the sorted list of occupied positions.
+ *
+ * Notes:
+ * - We call a position occupied if there is at least one marble in that position.
+ * - There may be multiple marbles in a single position.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number[]} moveFrom
+ * @param {number[]} moveTo
+ * @return {number[]}
+ */
+var relocateMarbles = function(nums, moveFrom, moveTo) {
+  const set = new Set(nums);
+
+  for (let i = 0; i < moveFrom.length; i++) {
+    set.delete(moveFrom[i]);
+    set.add(moveTo[i]);
+  }
+
+  return [...set].sort((a, b) => a - b);
+};

From c5e91924012e3b9bcbc71019c5932d41ec421daf Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 31 May 2025 22:38:05 -0500
Subject: [PATCH 366/571] Add solution #2767

---
 README.md                                     |  1 +
 ...tring-into-minimum-beautiful-substrings.js | 52 +++++++++++++++++++
 2 files changed, 53 insertions(+)
 create mode 100644 solutions/2767-partition-string-into-minimum-beautiful-substrings.js

diff --git a/README.md b/README.md
index 4280e619..ac7b056c 100644
--- a/README.md
+++ b/README.md
@@ -2025,6 +2025,7 @@
 2751|[Robot Collisions](./solutions/2751-robot-collisions.js)|Hard|
 2763|[Sum of Imbalance Numbers of All Subarrays](./solutions/2763-sum-of-imbalance-numbers-of-all-subarrays.js)|Hard|
 2766|[Relocate Marbles](./solutions/2766-relocate-marbles.js)|Medium|
+2767|[Partition String Into Minimum Beautiful Substrings](./solutions/2767-partition-string-into-minimum-beautiful-substrings.js)|Medium|
 2780|[Minimum Index of a Valid Split](./solutions/2780-minimum-index-of-a-valid-split.js)|Medium|
 2799|[Count Complete Subarrays in an Array](./solutions/2799-count-complete-subarrays-in-an-array.js)|Medium|
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
diff --git a/solutions/2767-partition-string-into-minimum-beautiful-substrings.js b/solutions/2767-partition-string-into-minimum-beautiful-substrings.js
new file mode 100644
index 00000000..45e5b024
--- /dev/null
+++ b/solutions/2767-partition-string-into-minimum-beautiful-substrings.js
@@ -0,0 +1,52 @@
+/**
+ * 2767. Partition String Into Minimum Beautiful Substrings
+ * https://leetcode.com/problems/partition-string-into-minimum-beautiful-substrings/
+ * Difficulty: Medium
+ *
+ * Given a binary string s, partition the string into one or more substrings such that each
+ * substring is beautiful.
+ *
+ * A string is beautiful if:
+ * - It doesn't contain leading zeros.
+ * - It's the binary representation of a number that is a power of 5.
+ *
+ * Return the minimum number of substrings in such partition. If it is impossible to partition
+ * the string s into beautiful substrings, return -1.
+ *
+ * A substring is a contiguous sequence of characters in a string.
+ */
+
+/**
+ * @param {string} s
+ * @return {number}
+ */
+var minimumBeautifulSubstrings = function(s) {
+  const n = s.length;
+  const powersOfFive = new Set();
+  let power = 1;
+  while (power.toString(2).length <= n) {
+    powersOfFive.add(power.toString(2));
+    power *= 5;
+  }
+
+  const result = findMinPartitions(0);
+  return result === Infinity ? -1 : result;
+
+  function findMinPartitions(index) {
+    if (index === n) return 0;
+    if (s[index] === '0') return Infinity;
+
+    let minPartitions = Infinity;
+    for (let end = index + 1; end <= n; end++) {
+      const substring = s.slice(index, end);
+      if (powersOfFive.has(substring)) {
+        const next = findMinPartitions(end);
+        if (next !== Infinity) {
+          minPartitions = Math.min(minPartitions, 1 + next);
+        }
+      }
+    }
+
+    return minPartitions;
+  }
+};

From 8c579779c2a397f7b587a9dd3b417843513b6e03 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 1 Jun 2025 17:31:43 -0500
Subject: [PATCH 367/571] Add solution #2511

---
 README.md                                     |  1 +
 ...aximum-enemy-forts-that-can-be-captured.js | 42 +++++++++++++++++++
 2 files changed, 43 insertions(+)
 create mode 100644 solutions/2511-maximum-enemy-forts-that-can-be-captured.js

diff --git a/README.md b/README.md
index ac7b056c..1cd18c1d 100644
--- a/README.md
+++ b/README.md
@@ -1889,6 +1889,7 @@
 2506|[Count Pairs Of Similar Strings](./solutions/2506-count-pairs-of-similar-strings.js)|Easy|
 2507|[Smallest Value After Replacing With Sum of Prime Factors](./solutions/2507-smallest-value-after-replacing-with-sum-of-prime-factors.js)|Medium|
 2509|[Cycle Length Queries in a Tree](./solutions/2509-cycle-length-queries-in-a-tree.js)|Hard|
+2511|[Maximum Enemy Forts That Can Be Captured](./solutions/2511-maximum-enemy-forts-that-can-be-captured.js)|Easy|
 2515|[Shortest Distance to Target String in a Circular Array](./solutions/2515-shortest-distance-to-target-string-in-a-circular-array.js)|Easy|
 2516|[Take K of Each Character From Left and Right](./solutions/2516-take-k-of-each-character-from-left-and-right.js)|Medium|
 2517|[Maximum Tastiness of Candy Basket](./solutions/2517-maximum-tastiness-of-candy-basket.js)|Medium|
diff --git a/solutions/2511-maximum-enemy-forts-that-can-be-captured.js b/solutions/2511-maximum-enemy-forts-that-can-be-captured.js
new file mode 100644
index 00000000..7a7b5045
--- /dev/null
+++ b/solutions/2511-maximum-enemy-forts-that-can-be-captured.js
@@ -0,0 +1,42 @@
+/**
+ * 2511. Maximum Enemy Forts That Can Be Captured
+ * https://leetcode.com/problems/maximum-enemy-forts-that-can-be-captured/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed integer array forts of length n representing the positions of
+ * several forts. forts[i] can be -1, 0, or 1 where:
+ * - -1 represents there is no fort at the ith position.
+ * - 0 indicates there is an enemy fort at the ith position.
+ * - 1 indicates the fort at the ith the position is under your command.
+ *
+ * Now you have decided to move your army from one of your forts at position i to an empty
+ * position j such that:
+ * - 0 <= i, j <= n - 1
+ * - The army travels over enemy forts only. Formally, for all k where min(i,j) < k < max(i,j),
+ *   forts[k] == 0.
+ *
+ * While moving the army, all the enemy forts that come in the way are captured.
+ *
+ * Return the maximum number of enemy forts that can be captured. In case it is impossible to
+ * move your army, or you do not have any fort under your command, return 0.
+ */
+
+/**
+ * @param {number[]} forts
+ * @return {number}
+ */
+var captureForts = function(forts) {
+  let result = 0;
+  let start = -1;
+
+  for (let i = 0; i < forts.length; i++) {
+    if (forts[i] === 1 || forts[i] === -1) {
+      if (start !== -1 && forts[start] !== forts[i]) {
+        result = Math.max(result, i - start - 1);
+      }
+      start = i;
+    }
+  }
+
+  return result;
+};

From 579aefc805ad00aad587e16decf314da6cceaafb Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 1 Jun 2025 17:38:36 -0500
Subject: [PATCH 368/571] Add solution #2646

---
 README.md                                     |  1 +
 ...6-minimize-the-total-price-of-the-trips.js | 81 +++++++++++++++++++
 2 files changed, 82 insertions(+)
 create mode 100644 solutions/2646-minimize-the-total-price-of-the-trips.js

diff --git a/README.md b/README.md
index 1cd18c1d..9f85c8b9 100644
--- a/README.md
+++ b/README.md
@@ -1967,6 +1967,7 @@
 2643|[Row With Maximum Ones](./solutions/2643-row-with-maximum-ones.js)|Easy|
 2644|[Find the Maximum Divisibility Score](./solutions/2644-find-the-maximum-divisibility-score.js)|Easy|
 2645|[Minimum Additions to Make Valid String](./solutions/2645-minimum-additions-to-make-valid-string.js)|Medium|
+2646|[Minimize the Total Price of the Trips](./solutions/2646-minimize-the-total-price-of-the-trips.js)|Hard|
 2648|[Generate Fibonacci Sequence](./solutions/2648-generate-fibonacci-sequence.js)|Easy|
 2649|[Nested Array Generator](./solutions/2649-nested-array-generator.js)|Medium|
 2650|[Design Cancellable Function](./solutions/2650-design-cancellable-function.js)|Hard|
diff --git a/solutions/2646-minimize-the-total-price-of-the-trips.js b/solutions/2646-minimize-the-total-price-of-the-trips.js
new file mode 100644
index 00000000..08bb9cfd
--- /dev/null
+++ b/solutions/2646-minimize-the-total-price-of-the-trips.js
@@ -0,0 +1,81 @@
+/**
+ * 2646. Minimize the Total Price of the Trips
+ * https://leetcode.com/problems/minimize-the-total-price-of-the-trips/
+ * Difficulty: Hard
+ *
+ * There exists an undirected and unrooted tree with n nodes indexed from 0 to n - 1. You are
+ * given the integer n and a 2D integer array edges of length n - 1, where edges[i] = [ai, bi]
+ * indicates that there is an edge between nodes ai and bi in the tree.
+ *
+ * Each node has an associated price. You are given an integer array price, where price[i] is
+ * the price of the ith node.
+ *
+ * The price sum of a given path is the sum of the prices of all nodes lying on that path.
+ *
+ * Additionally, you are given a 2D integer array trips, where trips[i] = [starti, endi]
+ * indicates that you start the ith trip from the node starti and travel to the node endi
+ * by any path you like.
+ *
+ * Before performing your first trip, you can choose some non-adjacent nodes and halve the
+ * prices.
+ *
+ * Return the minimum total price sum to perform all the given trips.
+ */
+
+/**
+ * @param {number} n
+ * @param {number[][]} edges
+ * @param {number[]} price
+ * @param {number[][]} trips
+ * @return {number}
+ */
+var minimumTotalPrice = function(n, edges, price, trips) {
+  const graph = Array.from({ length: n }, () => []);
+  for (const [u, v] of edges) {
+    graph[u].push(v);
+    graph[v].push(u);
+  }
+
+  const count = new Array(n).fill(0);
+
+  for (const [start, end] of trips) {
+    dfsPath(start, end, -1, []);
+  }
+
+  return dp(0, -1, true)[1];
+
+  function dp(node, parent, canHalve) {
+    const full = count[node] * price[node];
+    const half = full / 2;
+    let childrenFull = 0;
+    let childrenHalf = 0;
+
+    for (const child of graph[node]) {
+      if (child !== parent) {
+        const [childFull, childHalf] = dp(child, node, canHalve && node !== -1);
+        childrenFull += childFull;
+        childrenHalf += childHalf;
+      }
+    }
+
+    if (canHalve) {
+      return [full + childrenHalf, Math.min(full + childrenHalf, half + childrenFull)];
+    }
+    return [full + childrenHalf, full + childrenHalf];
+  }
+
+  function dfsPath(start, end, parent, path) {
+    path.push(start);
+    if (start === end) {
+      for (const node of path) count[node]++;
+      return true;
+    }
+    for (const next of graph[start]) {
+      if (next !== parent && dfsPath(next, end, start, path)) {
+        return true;
+      }
+    }
+    path.pop();
+    return false;
+  }
+};

From 7a9b15c6df430b1ddf2527b72235ba2fcc9dcc65 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 1 Jun 2025 17:39:44 -0500
Subject: [PATCH 369/571] Add solution #2769

---
 README.md                                     |  1 +
 ...2769-find-the-maximum-achievable-number.js | 20 +++++++++++++++++++
 2 files changed, 21 insertions(+)
 create mode 100644 solutions/2769-find-the-maximum-achievable-number.js

diff --git a/README.md b/README.md
index 9f85c8b9..1da6a1a4 100644
--- a/README.md
+++ b/README.md
@@ -2028,6 +2028,7 @@
 2763|[Sum of Imbalance Numbers of All Subarrays](./solutions/2763-sum-of-imbalance-numbers-of-all-subarrays.js)|Hard|
 2766|[Relocate Marbles](./solutions/2766-relocate-marbles.js)|Medium|
 2767|[Partition String Into Minimum Beautiful Substrings](./solutions/2767-partition-string-into-minimum-beautiful-substrings.js)|Medium|
+2769|[Find the Maximum Achievable Number](./solutions/2769-find-the-maximum-achievable-number.js)|Easy|
 2780|[Minimum Index of a Valid Split](./solutions/2780-minimum-index-of-a-valid-split.js)|Medium|
 2799|[Count Complete Subarrays in an Array](./solutions/2799-count-complete-subarrays-in-an-array.js)|Medium|
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
diff --git a/solutions/2769-find-the-maximum-achievable-number.js b/solutions/2769-find-the-maximum-achievable-number.js
new file mode 100644
index 00000000..cfd60aeb
--- /dev/null
+++ b/solutions/2769-find-the-maximum-achievable-number.js
@@ -0,0 +1,20 @@
+/**
+ * 2769. Find the Maximum Achievable Number
+ * https://leetcode.com/problems/find-the-maximum-achievable-number/
+ * Difficulty: Easy
+ *
+ * Given two integers, num and t. A number x is achievable if it can become equal to num
+ * after applying the following operation at most t times:
+ * - Increase or decrease x by 1, and simultaneously increase or decrease num by 1.
+ *
+ * Return the maximum possible value of x.
+ */
+
+/**
+ * @param {number} num
+ * @param {number} t
+ * @return {number}
+ */
+var theMaximumAchievableX = function(num, t) {
+  return num + 2 * t;
+};

From 5f1ea45a9f3a26e5972e5b7e6b9a76fdd03ff8d8 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 1 Jun 2025 17:41:02 -0500
Subject: [PATCH 370/571] Add solution #2778

---
 README.md                                     |  1 +
 ...2778-sum-of-squares-of-special-elements.js | 28 +++++++++++++++++++
 2 files changed, 29 insertions(+)
 create mode 100644 solutions/2778-sum-of-squares-of-special-elements.js

diff --git a/README.md b/README.md
index 1da6a1a4..1f80891a 100644
--- a/README.md
+++ b/README.md
@@ -2029,6 +2029,7 @@
 2766|[Relocate Marbles](./solutions/2766-relocate-marbles.js)|Medium|
 2767|[Partition String Into Minimum Beautiful Substrings](./solutions/2767-partition-string-into-minimum-beautiful-substrings.js)|Medium|
 2769|[Find the Maximum Achievable Number](./solutions/2769-find-the-maximum-achievable-number.js)|Easy|
+2778|[Sum of Squares of Special Elements](./solutions/2778-sum-of-squares-of-special-elements.js)|Easy|
 2780|[Minimum Index of a Valid Split](./solutions/2780-minimum-index-of-a-valid-split.js)|Medium|
 2799|[Count Complete Subarrays in an Array](./solutions/2799-count-complete-subarrays-in-an-array.js)|Medium|
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
diff --git a/solutions/2778-sum-of-squares-of-special-elements.js b/solutions/2778-sum-of-squares-of-special-elements.js
new file mode 100644
index 00000000..fbac7766
--- /dev/null
+++ b/solutions/2778-sum-of-squares-of-special-elements.js
@@ -0,0 +1,28 @@
+/**
+ * 2778. Sum of Squares of Special Elements
+ * https://leetcode.com/problems/sum-of-squares-of-special-elements/
+ * Difficulty: Easy
+ *
+ * You are given a 1-indexed integer array nums of length n.
+ *
+ * An element nums[i] of nums is called special if i divides n, i.e. n % i == 0.
+ *
+ * Return the sum of the squares of all special elements of nums.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var sumOfSquares = function(nums) {
+  const n = nums.length;
+  let total = 0;
+
+  for (let i = 1; i <= n; i++) {
+    if (n % i === 0) {
+      total += nums[i - 1] * nums[i - 1];
+    }
+  }
+
+  return total;
+};

From a49d3f66e3021c37648dc424f51e9b9174703b13 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 1 Jun 2025 17:42:17 -0500
Subject: [PATCH 371/571] Add solution #2779

---
 README.md                                     |  1 +
 ...ty-of-an-array-after-applying-operation.js | 41 +++++++++++++++++++
 2 files changed, 42 insertions(+)
 create mode 100644 solutions/2779-maximum-beauty-of-an-array-after-applying-operation.js

diff --git a/README.md b/README.md
index 1f80891a..cff29355 100644
--- a/README.md
+++ b/README.md
@@ -2030,6 +2030,7 @@
 2767|[Partition String Into Minimum Beautiful Substrings](./solutions/2767-partition-string-into-minimum-beautiful-substrings.js)|Medium|
 2769|[Find the Maximum Achievable Number](./solutions/2769-find-the-maximum-achievable-number.js)|Easy|
 2778|[Sum of Squares of Special Elements](./solutions/2778-sum-of-squares-of-special-elements.js)|Easy|
+2779|[Maximum Beauty of an Array After Applying Operation](./solutions/2779-maximum-beauty-of-an-array-after-applying-operation.js)|Medium|
 2780|[Minimum Index of a Valid Split](./solutions/2780-minimum-index-of-a-valid-split.js)|Medium|
 2799|[Count Complete Subarrays in an Array](./solutions/2799-count-complete-subarrays-in-an-array.js)|Medium|
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
diff --git a/solutions/2779-maximum-beauty-of-an-array-after-applying-operation.js b/solutions/2779-maximum-beauty-of-an-array-after-applying-operation.js
new file mode 100644
index 00000000..1015482b
--- /dev/null
+++ b/solutions/2779-maximum-beauty-of-an-array-after-applying-operation.js
@@ -0,0 +1,41 @@
+/**
+ * 2779. Maximum Beauty of an Array After Applying Operation
+ * https://leetcode.com/problems/maximum-beauty-of-an-array-after-applying-operation/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed array nums and a non-negative integer k.
+ *
+ * In one operation, you can do the following:
+ * - Choose an index i that hasn't been chosen before from the range [0, nums.length - 1].
+ * - Replace nums[i] with any integer from the range [nums[i] - k, nums[i] + k].
+ *
+ * The beauty of the array is the length of the longest subsequence consisting of equal elements.
+ *
+ * Return the maximum possible beauty of the array nums after applying the operation any number
+ * of times.
+ *
+ * Note that you can apply the operation to each index only once.
+ *
+ * A subsequence of an array is a new array generated from the original array by deleting some
+ * elements (possibly none) without changing the order of the remaining elements.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} k
+ * @return {number}
+ */
+var maximumBeauty = function(nums, k) {
+  nums.sort((a, b) => a - b);
+  let result = 0;
+  let left = 0;
+
+  for (let right = 0; right < nums.length; right++) {
+    while (nums[right] - nums[left] > 2 * k) {
+      left++;
+    }
+    result = Math.max(result, right - left + 1);
+  }
+
+  return result;
+};

From 619803c9be494402109fe1e38390bd307ca6965e Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 1 Jun 2025 17:46:43 -0500
Subject: [PATCH 372/571] Add solution #2784

---
 README.md                                |  1 +
 solutions/2784-check-if-array-is-good.js | 36 ++++++++++++++++++++++++
 2 files changed, 37 insertions(+)
 create mode 100644 solutions/2784-check-if-array-is-good.js

diff --git a/README.md b/README.md
index cff29355..cc6cc769 100644
--- a/README.md
+++ b/README.md
@@ -2032,6 +2032,7 @@
 2778|[Sum of Squares of Special Elements](./solutions/2778-sum-of-squares-of-special-elements.js)|Easy|
 2779|[Maximum Beauty of an Array After Applying Operation](./solutions/2779-maximum-beauty-of-an-array-after-applying-operation.js)|Medium|
 2780|[Minimum Index of a Valid Split](./solutions/2780-minimum-index-of-a-valid-split.js)|Medium|
+2784|[Check if Array is Good](./solutions/2784-check-if-array-is-good.js)|Easy|
 2799|[Count Complete Subarrays in an Array](./solutions/2799-count-complete-subarrays-in-an-array.js)|Medium|
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
 2843|[Count Symmetric Integers](./solutions/2843-count-symmetric-integers.js)|Easy|
diff --git a/solutions/2784-check-if-array-is-good.js b/solutions/2784-check-if-array-is-good.js
new file mode 100644
index 00000000..289edd0d
--- /dev/null
+++ b/solutions/2784-check-if-array-is-good.js
@@ -0,0 +1,36 @@
+/**
+ * 2784. Check if Array is Good
+ * https://leetcode.com/problems/check-if-array-is-good/
+ * Difficulty: Easy
+ *
+ * You are given an integer array nums. We consider an array good if it is a permutation of
+ * an array base[n].
+ *
+ * base[n] = [1, 2, ..., n - 1, n, n] (in other words, it is an array of length n + 1 which
+ * contains 1 to n - 1 exactly once, plus two occurrences of n). For example, base[1] = [1, 1]
+ * and base[3] = [1, 2, 3, 3].
+ *
+ * Return true if the given array is good, otherwise return false.
+ *
+ * Note: A permutation of integers represents an arrangement of these numbers.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {boolean}
+ */
+var isGood = function(nums) {
+  const n = Math.max(...nums);
+  if (nums.length !== n + 1) return false;
+
+  const frequency = new Array(n + 1).fill(0);
+  for (const num of nums) {
+    if (num > n) return false;
+    frequency[num]++;
+  }
+
+  for (let i = 1; i < n; i++) {
+    if (frequency[i] !== 1) return false;
+  }
+  return frequency[n] === 2;
+};

From ec3c0b5bb3dbde5c2ee707c0762585f24ba7887c Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 1 Jun 2025 17:48:38 -0500
Subject: [PATCH 373/571] Add solution #2785

---
 README.md                                 |  1 +
 solutions/2785-sort-vowels-in-a-string.js | 45 +++++++++++++++++++++++
 2 files changed, 46 insertions(+)
 create mode 100644 solutions/2785-sort-vowels-in-a-string.js

diff --git a/README.md b/README.md
index cc6cc769..1c27cb70 100644
--- a/README.md
+++ b/README.md
@@ -2033,6 +2033,7 @@
 2779|[Maximum Beauty of an Array After Applying Operation](./solutions/2779-maximum-beauty-of-an-array-after-applying-operation.js)|Medium|
 2780|[Minimum Index of a Valid Split](./solutions/2780-minimum-index-of-a-valid-split.js)|Medium|
 2784|[Check if Array is Good](./solutions/2784-check-if-array-is-good.js)|Easy|
+2785|[Sort Vowels in a String](./solutions/2785-sort-vowels-in-a-string.js)|Medium|
 2799|[Count Complete Subarrays in an Array](./solutions/2799-count-complete-subarrays-in-an-array.js)|Medium|
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
 2843|[Count Symmetric Integers](./solutions/2843-count-symmetric-integers.js)|Easy|
diff --git a/solutions/2785-sort-vowels-in-a-string.js b/solutions/2785-sort-vowels-in-a-string.js
new file mode 100644
index 00000000..d4a25c7e
--- /dev/null
+++ b/solutions/2785-sort-vowels-in-a-string.js
@@ -0,0 +1,45 @@
+/**
+ * 2785. Sort Vowels in a String
+ * https://leetcode.com/problems/sort-vowels-in-a-string/
+ * Difficulty: Medium
+ *
+ * Given a 0-indexed string s, permute s to get a new string t such that:
+ * - All consonants remain in their original places. More formally, if there is an index i
+ *   with 0 <= i < s.length such that s[i] is a consonant, then t[i] = s[i].
+ * - The vowels must be sorted in the nondecreasing order of their ASCII values. More formally,
+ *   for pairs of indices i, j with 0 <= i < j < s.length such that s[i] and s[j] are vowels,
+ *   then t[i] must not have a higher ASCII value than t[j].
+ *
+ * Return the resulting string.
+ *
+ * The vowels are 'a', 'e', 'i', 'o', and 'u', and they can appear in lowercase or uppercase.
+ * Consonants comprise all letters that are not vowels.
+ */
+
+/**
+ * @param {string} s
+ * @return {string}
+ */
+var sortVowels = function(s) {
+  const vowels = new Set(['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']);
+  const vowelChars = [];
+
+  for (const char of s) {
+    if (vowels.has(char)) {
+      vowelChars.push(char);
+    }
+  }
+
+  vowelChars.sort();
+
+  const result = [...s];
+  let vowelIndex = 0;
+
+  for (let i = 0; i < s.length; i++) {
+    if (vowels.has(s[i])) {
+      result[i] = vowelChars[vowelIndex++];
+    }
+  }
+
+  return result.join('');
+};

From e3ea156a24ccf3e62740b5a741fbf118376117a6 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 1 Jun 2025 17:50:02 -0500
Subject: [PATCH 374/571] Add solution #2788

---
 README.md                                    |  1 +
 solutions/2788-split-strings-by-separator.js | 31 ++++++++++++++++++++
 2 files changed, 32 insertions(+)
 create mode 100644 solutions/2788-split-strings-by-separator.js

diff --git a/README.md b/README.md
index 1c27cb70..a2acdd43 100644
--- a/README.md
+++ b/README.md
@@ -2034,6 +2034,7 @@
 2780|[Minimum Index of a Valid Split](./solutions/2780-minimum-index-of-a-valid-split.js)|Medium|
 2784|[Check if Array is Good](./solutions/2784-check-if-array-is-good.js)|Easy|
 2785|[Sort Vowels in a String](./solutions/2785-sort-vowels-in-a-string.js)|Medium|
+2788|[Split Strings by Separator](./solutions/2788-split-strings-by-separator.js)|Easy|
 2799|[Count Complete Subarrays in an Array](./solutions/2799-count-complete-subarrays-in-an-array.js)|Medium|
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
 2843|[Count Symmetric Integers](./solutions/2843-count-symmetric-integers.js)|Easy|
diff --git a/solutions/2788-split-strings-by-separator.js b/solutions/2788-split-strings-by-separator.js
new file mode 100644
index 00000000..6681bef2
--- /dev/null
+++ b/solutions/2788-split-strings-by-separator.js
@@ -0,0 +1,31 @@
+/**
+ * 2788. Split Strings by Separator
+ * https://leetcode.com/problems/split-strings-by-separator/
+ * Difficulty: Easy
+ *
+ * Given an array of strings words and a character separator, split each string in words by
+ * separator.
+ *
+ * Return an array of strings containing the new strings formed after the splits, excluding
+ * empty strings.
+ *
+ * Notes
+ * - separator is used to determine where the split should occur, but it is not included as
+ *   part of the resulting strings.
+ * - A split may result in more than two strings.
+ * - The resulting strings must maintain the same order as they were initially given.
+ */
+
+/**
+ * @param {string[]} words
+ * @param {character} separator
+ * @return {string[]}
+ */
+var splitWordsBySeparator = function(words, separator) {
+  const result = [];
+  for (const word of words) {
+    const splitWords = word.split(separator).filter(part => part !== '');
+    result.push(...splitWords);
+  }
+  return result;
+};

From d3755ebc3f1c5179ec0ac86028996a156ff7ea44 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 1 Jun 2025 17:51:18 -0500
Subject: [PATCH 375/571] Add solution #2789

---
 README.md                                     |  1 +
 ...ment-in-an-array-after-merge-operations.js | 34 +++++++++++++++++++
 2 files changed, 35 insertions(+)
 create mode 100644 solutions/2789-largest-element-in-an-array-after-merge-operations.js

diff --git a/README.md b/README.md
index a2acdd43..eea3ab4a 100644
--- a/README.md
+++ b/README.md
@@ -2035,6 +2035,7 @@
 2784|[Check if Array is Good](./solutions/2784-check-if-array-is-good.js)|Easy|
 2785|[Sort Vowels in a String](./solutions/2785-sort-vowels-in-a-string.js)|Medium|
 2788|[Split Strings by Separator](./solutions/2788-split-strings-by-separator.js)|Easy|
+2789|[Largest Element in an Array after Merge Operations](./solutions/2789-largest-element-in-an-array-after-merge-operations.js)|Medium|
 2799|[Count Complete Subarrays in an Array](./solutions/2799-count-complete-subarrays-in-an-array.js)|Medium|
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
 2843|[Count Symmetric Integers](./solutions/2843-count-symmetric-integers.js)|Easy|
diff --git a/solutions/2789-largest-element-in-an-array-after-merge-operations.js b/solutions/2789-largest-element-in-an-array-after-merge-operations.js
new file mode 100644
index 00000000..3de874a6
--- /dev/null
+++ b/solutions/2789-largest-element-in-an-array-after-merge-operations.js
@@ -0,0 +1,34 @@
+/**
+ * 2789. Largest Element in an Array after Merge Operations
+ * https://leetcode.com/problems/largest-element-in-an-array-after-merge-operations/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed array nums consisting of positive integers.
+ *
+ * You can do the following operation on the array any number of times:
+ * - Choose an integer i such that 0 <= i < nums.length - 1 and nums[i] <= nums[i + 1].
+ *   Replace the element nums[i + 1] with nums[i] + nums[i + 1] and delete the element
+ *   nums[i] from the array.
+ *
+ * Return the value of the largest element that you can possibly obtain in the final array.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var maxArrayValue = function(nums) {
+  let result = nums[nums.length - 1];
+  let currentSum = result;
+
+  for (let i = nums.length - 2; i >= 0; i--) {
+    if (nums[i] <= currentSum) {
+      currentSum += nums[i];
+    } else {
+      currentSum = nums[i];
+    }
+    result = Math.max(result, currentSum);
+  }
+
+  return result;
+};

From 37b4c923a5eacfea1de58227a5f4041b1837dbf3 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 1 Jun 2025 17:53:08 -0500
Subject: [PATCH 376/571] Add solution #2791

---
 README.md                                     |  1 +
 ...hs-that-can-form-a-palindrome-in-a-tree.js | 49 +++++++++++++++++++
 2 files changed, 50 insertions(+)
 create mode 100644 solutions/2791-count-paths-that-can-form-a-palindrome-in-a-tree.js

diff --git a/README.md b/README.md
index eea3ab4a..748f1003 100644
--- a/README.md
+++ b/README.md
@@ -2036,6 +2036,7 @@
 2785|[Sort Vowels in a String](./solutions/2785-sort-vowels-in-a-string.js)|Medium|
 2788|[Split Strings by Separator](./solutions/2788-split-strings-by-separator.js)|Easy|
 2789|[Largest Element in an Array after Merge Operations](./solutions/2789-largest-element-in-an-array-after-merge-operations.js)|Medium|
+2791|[Count Paths That Can Form a Palindrome in a Tree](./solutions/2791-count-paths-that-can-form-a-palindrome-in-a-tree.js)|Hard|
 2799|[Count Complete Subarrays in an Array](./solutions/2799-count-complete-subarrays-in-an-array.js)|Medium|
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
 2843|[Count Symmetric Integers](./solutions/2843-count-symmetric-integers.js)|Easy|
diff --git a/solutions/2791-count-paths-that-can-form-a-palindrome-in-a-tree.js b/solutions/2791-count-paths-that-can-form-a-palindrome-in-a-tree.js
new file mode 100644
index 00000000..195def8e
--- /dev/null
+++ b/solutions/2791-count-paths-that-can-form-a-palindrome-in-a-tree.js
@@ -0,0 +1,49 @@
+/**
+ * 2791. Count Paths That Can Form a Palindrome in a Tree
+ * https://leetcode.com/problems/count-paths-that-can-form-a-palindrome-in-a-tree/
+ * Difficulty: Hard
+ *
+ * You are given a tree (i.e. a connected, undirected graph that has no cycles) rooted at node
+ * 0 consisting of n nodes numbered from 0 to n - 1. The tree is represented by a 0-indexed
+ * array parent of size n, where parent[i] is the parent of node i. Since node 0 is the root,
+ * parent[0] == -1.
+ *
+ * You are also given a string s of length n, where s[i] is the character assigned to the edge
+ * between i and parent[i]. s[0] can be ignored.
+ *
+ * Return the number of pairs of nodes (u, v) such that u < v and the characters assigned to edges
+ * on the path from u to v can be rearranged to form a palindrome.
+ *
+ * A string is a palindrome when it reads the same backwards as forwards.
+ */
+
+/**
+ * @param {number[]} parent
+ * @param {string} s
+ * @return {number}
+ */
+var countPalindromePaths = function(parent, s) {
+  const n = parent.length;
+  const graph = Array.from({ length: n }, () => []);
+  for (let i = 1; i < n; i++) {
+    graph[parent[i]].push(i);
+  }
+
+  const freq = new Map([[0, 1]]);
+  let result = 0;
+
+  dfs(0, 0);
+  return result;
+
+  function dfs(node, mask) {
+    for (const child of graph[node]) {
+      const newMask = mask ^ (1 << (s[child].charCodeAt(0) - 97));
+      result += freq.get(newMask) || 0;
+      for (let i = 0; i < 26; i++) {
+        result += freq.get(newMask ^ (1 << i)) || 0;
+      }
+      freq.set(newMask, (freq.get(newMask) || 0) + 1);
+      dfs(child, newMask);
+    }
+  }
+};

From 95dd22a1014fde0f445a2ab6353578582df0e076 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 1 Jun 2025 22:26:11 -0500
Subject: [PATCH 377/571] Add solution #2470

---
 README.md                                     |  1 +
 ...number-of-subarrays-with-lcm-equal-to-k.js | 45 +++++++++++++++++++
 2 files changed, 46 insertions(+)
 create mode 100644 solutions/2470-number-of-subarrays-with-lcm-equal-to-k.js

diff --git a/README.md b/README.md
index 748f1003..a779b8d6 100644
--- a/README.md
+++ b/README.md
@@ -1864,6 +1864,7 @@
 2467|[Most Profitable Path in a Tree](./solutions/2467-most-profitable-path-in-a-tree.js)|Medium|
 2468|[Split Message Based on Limit](./solutions/2468-split-message-based-on-limit.js)|Hard|
 2469|[Convert the Temperature](./solutions/2469-convert-the-temperature.js)|Easy|
+2470|[Number of Subarrays With LCM Equal to K](./solutions/2470-number-of-subarrays-with-lcm-equal-to-k.js)|Medium|
 2471|[Minimum Number of Operations to Sort a Binary Tree by Level](./solutions/2471-minimum-number-of-operations-to-sort-a-binary-tree-by-level.js)|Medium|
 2472|[Maximum Number of Non-overlapping Palindrome Substrings](./solutions/2472-maximum-number-of-non-overlapping-palindrome-substrings.js)|Hard|
 2475|[Number of Unequal Triplets in Array](./solutions/2475-number-of-unequal-triplets-in-array.js)|Easy|
diff --git a/solutions/2470-number-of-subarrays-with-lcm-equal-to-k.js b/solutions/2470-number-of-subarrays-with-lcm-equal-to-k.js
new file mode 100644
index 00000000..41edda1d
--- /dev/null
+++ b/solutions/2470-number-of-subarrays-with-lcm-equal-to-k.js
@@ -0,0 +1,45 @@
+/**
+ * 2470. Number of Subarrays With LCM Equal to K
+ * https://leetcode.com/problems/number-of-subarrays-with-lcm-equal-to-k/
+ * Difficulty: Medium
+ *
+ * Given an integer array nums and an integer k, return the number of subarrays of nums
+ * where the least common multiple of the subarray's elements is k.
+ *
+ * A subarray is a contiguous non-empty sequence of elements within an array.
+ *
+ * The least common multiple of an array is the smallest positive integer that is divisible
+ * by all the array elements.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} k
+ * @return {number}
+ */
+var subarrayLCM = function(nums, k) {
+  let count = 0;
+
+  for (let start = 0; start < nums.length; start++) {
+    let currentLCM = nums[start];
+    for (let end = start; end < nums.length; end++) {
+      currentLCM = lcm(currentLCM, nums[end]);
+      if (currentLCM > k) break;
+      if (currentLCM === k) count++;
+    }
+  }
+
+  return count;
+
+  function gcd(a, b) {
+    while (b) {
+      a %= b;
+      [a, b] = [b, a];
+    }
+    return a;
+  }
+
+  function lcm(a, b) {
+    return (a * b) / gcd(a, b);
+  }
+};

From 40d745a7c973848ce89841a00bac24aa0374406a Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 1 Jun 2025 22:27:17 -0500
Subject: [PATCH 378/571] Add solution #2798

---
 README.md                                     |  1 +
 ...-number-of-employees-who-met-the-target.js | 30 +++++++++++++++++++
 2 files changed, 31 insertions(+)
 create mode 100644 solutions/2798-number-of-employees-who-met-the-target.js

diff --git a/README.md b/README.md
index a779b8d6..f452229e 100644
--- a/README.md
+++ b/README.md
@@ -2038,6 +2038,7 @@
 2788|[Split Strings by Separator](./solutions/2788-split-strings-by-separator.js)|Easy|
 2789|[Largest Element in an Array after Merge Operations](./solutions/2789-largest-element-in-an-array-after-merge-operations.js)|Medium|
 2791|[Count Paths That Can Form a Palindrome in a Tree](./solutions/2791-count-paths-that-can-form-a-palindrome-in-a-tree.js)|Hard|
+2798|[Number of Employees Who Met the Target](./solutions/2798-number-of-employees-who-met-the-target.js)|Easy|
 2799|[Count Complete Subarrays in an Array](./solutions/2799-count-complete-subarrays-in-an-array.js)|Medium|
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
 2843|[Count Symmetric Integers](./solutions/2843-count-symmetric-integers.js)|Easy|
diff --git a/solutions/2798-number-of-employees-who-met-the-target.js b/solutions/2798-number-of-employees-who-met-the-target.js
new file mode 100644
index 00000000..b3c1f4ac
--- /dev/null
+++ b/solutions/2798-number-of-employees-who-met-the-target.js
@@ -0,0 +1,30 @@
+/**
+ * 2798. Number of Employees Who Met the Target
+ * https://leetcode.com/problems/number-of-employees-who-met-the-target/
+ * Difficulty: Easy
+ *
+ * There are n employees in a company, numbered from 0 to n - 1. Each employee i has worked
+ * for hours[i] hours in the company.
+ *
+ * The company requires each employee to work for at least target hours.
+ *
+ * You are given a 0-indexed array of non-negative integers hours of length n and a non-negative
+ * integer target.
+ *
+ * Return the integer denoting the number of employees who worked at least target hours.
+ */
+
+/**
+ * @param {number[]} hours
+ * @param {number} target
+ * @return {number}
+ */
+var numberOfEmployeesWhoMetTarget = function(hours, target) {
+  let count = 0;
+
+  for (const hoursWorked of hours) {
+    if (hoursWorked >= target) count++;
+  }
+
+  return count;
+};

From 868f4d2c76d202d0bf29d2039735679938c828fc Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 1 Jun 2025 22:28:28 -0500
Subject: [PATCH 379/571] Add solution #2806

---
 README.md                                     |  1 +
 ...-account-balance-after-rounded-purchase.js | 29 +++++++++++++++++++
 2 files changed, 30 insertions(+)
 create mode 100644 solutions/2806-account-balance-after-rounded-purchase.js

diff --git a/README.md b/README.md
index f452229e..cea362b0 100644
--- a/README.md
+++ b/README.md
@@ -2040,6 +2040,7 @@
 2791|[Count Paths That Can Form a Palindrome in a Tree](./solutions/2791-count-paths-that-can-form-a-palindrome-in-a-tree.js)|Hard|
 2798|[Number of Employees Who Met the Target](./solutions/2798-number-of-employees-who-met-the-target.js)|Easy|
 2799|[Count Complete Subarrays in an Array](./solutions/2799-count-complete-subarrays-in-an-array.js)|Medium|
+2806|[Account Balance After Rounded Purchase](./solutions/2806-account-balance-after-rounded-purchase.js)|Easy|
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
 2843|[Count Symmetric Integers](./solutions/2843-count-symmetric-integers.js)|Easy|
 2845|[Count of Interesting Subarrays](./solutions/2845-count-of-interesting-subarrays.js)|Medium|
diff --git a/solutions/2806-account-balance-after-rounded-purchase.js b/solutions/2806-account-balance-after-rounded-purchase.js
new file mode 100644
index 00000000..0862ed28
--- /dev/null
+++ b/solutions/2806-account-balance-after-rounded-purchase.js
@@ -0,0 +1,29 @@
+/**
+ * 2806. Account Balance After Rounded Purchase
+ * https://leetcode.com/problems/account-balance-after-rounded-purchase/
+ * Difficulty: Easy
+ *
+ * Initially, you have a bank account balance of 100 dollars.
+ *
+ * You are given an integer purchaseAmount representing the amount you will spend on a purchase
+ * in dollars, in other words, its price.
+ *
+ * When making the purchase, first the purchaseAmount is rounded to the nearest multiple of 10.
+ * Let us call this value roundedAmount. Then, roundedAmount dollars are removed from your bank
+ * account.
+ *
+ * Return an integer denoting your final bank account balance after this purchase.
+ *
+ * Notes:
+ * - 0 is considered to be a multiple of 10 in this problem.
+ * - When rounding, 5 is rounded upward (5 is rounded to 10, 15 is rounded to 20, 25 to 30, and
+ *   so on).
+ */
+
+/**
+ * @param {number} purchaseAmount
+ * @return {number}
+ */
+var accountBalanceAfterPurchase = function(purchaseAmount) {
+  return 100 - (Math.round(purchaseAmount / 10) * 10);
+};

From 839106c6c333a81b2060287c43f65a36c3897819 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 1 Jun 2025 22:29:37 -0500
Subject: [PATCH 380/571] Add solution #2807

---
 README.md                                     |  1 +
 ...greatest-common-divisors-in-linked-list.js | 45 +++++++++++++++++++
 2 files changed, 46 insertions(+)
 create mode 100644 solutions/2807-insert-greatest-common-divisors-in-linked-list.js

diff --git a/README.md b/README.md
index cea362b0..7244948d 100644
--- a/README.md
+++ b/README.md
@@ -2041,6 +2041,7 @@
 2798|[Number of Employees Who Met the Target](./solutions/2798-number-of-employees-who-met-the-target.js)|Easy|
 2799|[Count Complete Subarrays in an Array](./solutions/2799-count-complete-subarrays-in-an-array.js)|Medium|
 2806|[Account Balance After Rounded Purchase](./solutions/2806-account-balance-after-rounded-purchase.js)|Easy|
+2807|[Insert Greatest Common Divisors in Linked List](./solutions/2807-insert-greatest-common-divisors-in-linked-list.js)|Medium|
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
 2843|[Count Symmetric Integers](./solutions/2843-count-symmetric-integers.js)|Easy|
 2845|[Count of Interesting Subarrays](./solutions/2845-count-of-interesting-subarrays.js)|Medium|
diff --git a/solutions/2807-insert-greatest-common-divisors-in-linked-list.js b/solutions/2807-insert-greatest-common-divisors-in-linked-list.js
new file mode 100644
index 00000000..ee1b2f8e
--- /dev/null
+++ b/solutions/2807-insert-greatest-common-divisors-in-linked-list.js
@@ -0,0 +1,45 @@
+/**
+ * 2807. Insert Greatest Common Divisors in Linked List
+ * https://leetcode.com/problems/insert-greatest-common-divisors-in-linked-list/
+ * Difficulty: Medium
+ *
+ * Given the head of a linked list head, in which each node contains an integer value.
+ *
+ * Between every pair of adjacent nodes, insert a new node with a value equal to the greatest
+ * common divisor of them.
+ *
+ * Return the linked list after insertion.
+ *
+ * The greatest common divisor of two numbers is the largest positive integer that evenly
+ * divides both numbers.
+ */
+
+/**
+ * Definition for singly-linked list.
+ * function ListNode(val, next) {
+ *     this.val = (val===undefined ? 0 : val)
+ *     this.next = (next===undefined ? null : next)
+ * }
+ */
+/**
+ * @param {ListNode} head
+ * @return {ListNode}
+ */
+var insertGreatestCommonDivisors = function(head) {
+  let current = head;
+  while (current && current.next) {
+    const nextNode = current.next;
+    const divisor = gcd(current.val, nextNode.val);
+    current.next = new ListNode(divisor, nextNode);
+    current = nextNode;
+  }
+  return head;
+
+  function gcd(a, b) {
+    while (b) {
+      a %= b;
+      [a, b] = [b, a];
+    }
+    return a;
+  }
+};

From 05c9c87efe1225935709f1f5843806435bfccbb6 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 1 Jun 2025 22:30:44 -0500
Subject: [PATCH 381/571] Add solution #2810

---
 README.md                         |  1 +
 solutions/2810-faulty-keyboard.js | 30 ++++++++++++++++++++++++++++++
 2 files changed, 31 insertions(+)
 create mode 100644 solutions/2810-faulty-keyboard.js

diff --git a/README.md b/README.md
index 7244948d..86beb2cf 100644
--- a/README.md
+++ b/README.md
@@ -2042,6 +2042,7 @@
 2799|[Count Complete Subarrays in an Array](./solutions/2799-count-complete-subarrays-in-an-array.js)|Medium|
 2806|[Account Balance After Rounded Purchase](./solutions/2806-account-balance-after-rounded-purchase.js)|Easy|
 2807|[Insert Greatest Common Divisors in Linked List](./solutions/2807-insert-greatest-common-divisors-in-linked-list.js)|Medium|
+2810|[Faulty Keyboard](./solutions/2810-faulty-keyboard.js)|Easy|
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
 2843|[Count Symmetric Integers](./solutions/2843-count-symmetric-integers.js)|Easy|
 2845|[Count of Interesting Subarrays](./solutions/2845-count-of-interesting-subarrays.js)|Medium|
diff --git a/solutions/2810-faulty-keyboard.js b/solutions/2810-faulty-keyboard.js
new file mode 100644
index 00000000..47cb30e8
--- /dev/null
+++ b/solutions/2810-faulty-keyboard.js
@@ -0,0 +1,30 @@
+/**
+ * 2810. Faulty Keyboard
+ * https://leetcode.com/problems/faulty-keyboard/
+ * Difficulty: Easy
+ *
+ * Your laptop keyboard is faulty, and whenever you type a character 'i' on it, it reverses the
+ * string that you have written. Typing other characters works as expected.
+ *
+ * You are given a 0-indexed string s, and you type each character of s using your faulty keyboard.
+ *
+ * Return the final string that will be present on your laptop screen.
+ */
+
+/**
+ * @param {string} s
+ * @return {string}
+ */
+var finalString = function(s) {
+  const result = [];
+
+  for (const char of s) {
+    if (char === 'i') {
+      result.reverse();
+    } else {
+      result.push(char);
+    }
+  }
+
+  return result.join('');
+};

From efd487b32f132886e89975d29709306f8e47a0ec Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Mon, 2 Jun 2025 22:57:37 -0500
Subject: [PATCH 382/571] Add solution #2815

---
 README.md                                  |  1 +
 solutions/2815-max-pair-sum-in-an-array.js | 48 ++++++++++++++++++++++
 2 files changed, 49 insertions(+)
 create mode 100644 solutions/2815-max-pair-sum-in-an-array.js

diff --git a/README.md b/README.md
index 86beb2cf..997f5dad 100644
--- a/README.md
+++ b/README.md
@@ -2043,6 +2043,7 @@
 2806|[Account Balance After Rounded Purchase](./solutions/2806-account-balance-after-rounded-purchase.js)|Easy|
 2807|[Insert Greatest Common Divisors in Linked List](./solutions/2807-insert-greatest-common-divisors-in-linked-list.js)|Medium|
 2810|[Faulty Keyboard](./solutions/2810-faulty-keyboard.js)|Easy|
+2815|[Max Pair Sum in an Array](./solutions/2815-max-pair-sum-in-an-array.js)|Easy|
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
 2843|[Count Symmetric Integers](./solutions/2843-count-symmetric-integers.js)|Easy|
 2845|[Count of Interesting Subarrays](./solutions/2845-count-of-interesting-subarrays.js)|Medium|
diff --git a/solutions/2815-max-pair-sum-in-an-array.js b/solutions/2815-max-pair-sum-in-an-array.js
new file mode 100644
index 00000000..d6a41368
--- /dev/null
+++ b/solutions/2815-max-pair-sum-in-an-array.js
@@ -0,0 +1,48 @@
+/**
+ * 2815. Max Pair Sum in an Array
+ * https://leetcode.com/problems/max-pair-sum-in-an-array/
+ * Difficulty: Easy
+ *
+ * You are given an integer array nums. You have to find the maximum sum of a pair of numbers from
+ * nums such that the largest digit in both numbers is equal.
+ *
+ * For example, 2373 is made up of three distinct digits: 2, 3, and 7, where 7 is the largest among
+ * them.
+ *
+ * Return the maximum sum or -1 if no such pair exists.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var maxSum = function(nums) {
+  let result = -1;
+  const map = new Map();
+
+  for (const num of nums) {
+    const maxDigit = getMaxDigit(num);
+    if (!map.has(maxDigit)) {
+      map.set(maxDigit, []);
+    }
+    map.get(maxDigit).push(num);
+  }
+
+  for (const numbers of map.values()) {
+    if (numbers.length >= 2) {
+      numbers.sort((a, b) => b - a);
+      result = Math.max(result, numbers[0] + numbers[1]);
+    }
+  }
+
+  return result;
+
+  function getMaxDigit(num) {
+    let max = 0;
+    while (num > 0) {
+      max = Math.max(max, num % 10);
+      num = Math.floor(num / 10);
+    }
+    return max;
+  }
+};

From 17bff2dcc12ad5cf4d793015bb63224b18d66f2e Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Mon, 2 Jun 2025 22:58:41 -0500
Subject: [PATCH 383/571] Add solution #2816

---
 README.md                                     |  1 +
 ...e-a-number-represented-as-a-linked-list.js | 54 +++++++++++++++++++
 2 files changed, 55 insertions(+)
 create mode 100644 solutions/2816-double-a-number-represented-as-a-linked-list.js

diff --git a/README.md b/README.md
index 997f5dad..592e14d3 100644
--- a/README.md
+++ b/README.md
@@ -2044,6 +2044,7 @@
 2807|[Insert Greatest Common Divisors in Linked List](./solutions/2807-insert-greatest-common-divisors-in-linked-list.js)|Medium|
 2810|[Faulty Keyboard](./solutions/2810-faulty-keyboard.js)|Easy|
 2815|[Max Pair Sum in an Array](./solutions/2815-max-pair-sum-in-an-array.js)|Easy|
+2816|[Double a Number Represented as a Linked List](./solutions/2816-double-a-number-represented-as-a-linked-list.js)|Medium|
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
 2843|[Count Symmetric Integers](./solutions/2843-count-symmetric-integers.js)|Easy|
 2845|[Count of Interesting Subarrays](./solutions/2845-count-of-interesting-subarrays.js)|Medium|
diff --git a/solutions/2816-double-a-number-represented-as-a-linked-list.js b/solutions/2816-double-a-number-represented-as-a-linked-list.js
new file mode 100644
index 00000000..d6ef8c24
--- /dev/null
+++ b/solutions/2816-double-a-number-represented-as-a-linked-list.js
@@ -0,0 +1,54 @@
+/**
+ * 2816. Double a Number Represented as a Linked List
+ * https://leetcode.com/problems/double-a-number-represented-as-a-linked-list/
+ * Difficulty: Medium
+ *
+ * You are given the head of a non-empty linked list representing a non-negative integer without
+ * leading zeroes.
+ *
+ * Return the head of the linked list after doubling it.
+ */
+
+/**
+ * Definition for singly-linked list.
+ * function ListNode(val, next) {
+ *     this.val = (val===undefined ? 0 : val)
+ *     this.next = (next===undefined ? null : next)
+ * }
+ */
+/**
+ * @param {ListNode} head
+ * @return {ListNode}
+ */
+var doubleIt = function(head) {
+  const reversed = reverseList(head);
+  let carry = 0;
+  let current = reversed;
+  let prev = null;
+
+  while (current) {
+    const doubled = current.val * 2 + carry;
+    current.val = doubled % 10;
+    carry = Math.floor(doubled / 10);
+    prev = current;
+    current = current.next;
+  }
+
+  if (carry) {
+    prev.next = new ListNode(carry);
+  }
+
+  return reverseList(reversed);
+
+  function reverseList(node) {
+    let prev = null;
+    let current = node;
+    while (current) {
+      const next = current.next;
+      current.next = prev;
+      prev = current;
+      current = next;
+    }
+    return prev;
+  }
+};

From b50edf07b922dc3c6780ccce0eaabf5a5e158054 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Mon, 2 Jun 2025 22:59:44 -0500
Subject: [PATCH 384/571] Add solution #2824

---
 README.md                                     |  1 +
 ...unt-pairs-whose-sum-is-less-than-target.js | 32 +++++++++++++++++++
 2 files changed, 33 insertions(+)
 create mode 100644 solutions/2824-count-pairs-whose-sum-is-less-than-target.js

diff --git a/README.md b/README.md
index 592e14d3..9c0edf51 100644
--- a/README.md
+++ b/README.md
@@ -2046,6 +2046,7 @@
 2815|[Max Pair Sum in an Array](./solutions/2815-max-pair-sum-in-an-array.js)|Easy|
 2816|[Double a Number Represented as a Linked List](./solutions/2816-double-a-number-represented-as-a-linked-list.js)|Medium|
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
+2824|[Count Pairs Whose Sum is Less than Target](./solutions/2824-count-pairs-whose-sum-is-less-than-target.js)|Easy|
 2843|[Count Symmetric Integers](./solutions/2843-count-symmetric-integers.js)|Easy|
 2845|[Count of Interesting Subarrays](./solutions/2845-count-of-interesting-subarrays.js)|Medium|
 2873|[Maximum Value of an Ordered Triplet I](./solutions/2873-maximum-value-of-an-ordered-triplet-i.js)|Easy|
diff --git a/solutions/2824-count-pairs-whose-sum-is-less-than-target.js b/solutions/2824-count-pairs-whose-sum-is-less-than-target.js
new file mode 100644
index 00000000..cdf97867
--- /dev/null
+++ b/solutions/2824-count-pairs-whose-sum-is-less-than-target.js
@@ -0,0 +1,32 @@
+/**
+ * 2824. Count Pairs Whose Sum is Less than Target
+ * https://leetcode.com/problems/count-pairs-whose-sum-is-less-than-target/
+ * Difficulty: Easy
+ *
+ * Given a 0-indexed integer array nums of length n and an integer target, return the number
+ * of pairs (i, j) where 0 <= i < j < n and nums[i] + nums[j] < target.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} target
+ * @return {number}
+ */
+var countPairs = function(nums, target) {
+  let result = 0;
+  let left = 0;
+  let right = nums.length - 1;
+
+  nums.sort((a, b) => a - b);
+
+  while (left < right) {
+    if (nums[left] + nums[right] < target) {
+      result += right - left;
+      left++;
+    } else {
+      right--;
+    }
+  }
+
+  return result;
+};

From eea7b0518c3ce571a67d9269da5e4691fa9683b1 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Mon, 2 Jun 2025 23:00:45 -0500
Subject: [PATCH 385/571] Add solution #2825

---
 README.md                                     |  1 +
 ...g-a-subsequence-using-cyclic-increments.js | 39 +++++++++++++++++++
 2 files changed, 40 insertions(+)
 create mode 100644 solutions/2825-make-string-a-subsequence-using-cyclic-increments.js

diff --git a/README.md b/README.md
index 9c0edf51..f6cf5380 100644
--- a/README.md
+++ b/README.md
@@ -2047,6 +2047,7 @@
 2816|[Double a Number Represented as a Linked List](./solutions/2816-double-a-number-represented-as-a-linked-list.js)|Medium|
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
 2824|[Count Pairs Whose Sum is Less than Target](./solutions/2824-count-pairs-whose-sum-is-less-than-target.js)|Easy|
+2825|[Make String a Subsequence Using Cyclic Increments](./solutions/2825-make-string-a-subsequence-using-cyclic-increments.js)|Medium|
 2843|[Count Symmetric Integers](./solutions/2843-count-symmetric-integers.js)|Easy|
 2845|[Count of Interesting Subarrays](./solutions/2845-count-of-interesting-subarrays.js)|Medium|
 2873|[Maximum Value of an Ordered Triplet I](./solutions/2873-maximum-value-of-an-ordered-triplet-i.js)|Easy|
diff --git a/solutions/2825-make-string-a-subsequence-using-cyclic-increments.js b/solutions/2825-make-string-a-subsequence-using-cyclic-increments.js
new file mode 100644
index 00000000..b6b96b8f
--- /dev/null
+++ b/solutions/2825-make-string-a-subsequence-using-cyclic-increments.js
@@ -0,0 +1,39 @@
+/**
+ * 2825. Make String a Subsequence Using Cyclic Increments
+ * https://leetcode.com/problems/make-string-a-subsequence-using-cyclic-increments/
+ * Difficulty: Medium
+ *
+ * You are given two 0-indexed strings str1 and str2.
+ *
+ * In an operation, you select a set of indices in str1, and for each index i in the set,
+ * increment str1[i] to the next character cyclically. That is 'a' becomes 'b', 'b' becomes
+ * 'c', and so on, and 'z' becomes 'a'.
+ *
+ * Return true if it is possible to make str2 a subsequence of str1 by performing the operation
+ * at most once, and false otherwise.
+ *
+ * Note: A subsequence of a string is a new string that is formed from the original string by
+ * deleting some (possibly none) of the characters without disturbing the relative positions
+ * of the remaining characters.
+ */
+
+/**
+ * @param {string} str1
+ * @param {string} str2
+ * @return {boolean}
+ */
+var canMakeSubsequence = function(str1, str2) {
+  let i = 0;
+  let j = 0;
+
+  while (i < str1.length && j < str2.length) {
+    const curr = str1[i].charCodeAt(0);
+    const next = curr === 122 ? 97 : curr + 1;
+    if (str1[i] === str2[j] || String.fromCharCode(next) === str2[j]) {
+      j++;
+    }
+    i++;
+  }
+
+  return j === str2.length;
+};

From 2182403a62c88f888765023b67fa94f9e2b50f09 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Mon, 2 Jun 2025 23:01:52 -0500
Subject: [PATCH 386/571] Add solution #2826

---
 README.md                              |  1 +
 solutions/2826-sorting-three-groups.js | 34 ++++++++++++++++++++++++++
 2 files changed, 35 insertions(+)
 create mode 100644 solutions/2826-sorting-three-groups.js

diff --git a/README.md b/README.md
index f6cf5380..380e4b77 100644
--- a/README.md
+++ b/README.md
@@ -2048,6 +2048,7 @@
 2818|[Apply Operations to Maximize Score](./solutions/2818-apply-operations-to-maximize-score.js)|Hard|
 2824|[Count Pairs Whose Sum is Less than Target](./solutions/2824-count-pairs-whose-sum-is-less-than-target.js)|Easy|
 2825|[Make String a Subsequence Using Cyclic Increments](./solutions/2825-make-string-a-subsequence-using-cyclic-increments.js)|Medium|
+2826|[Sorting Three Groups](./solutions/2826-sorting-three-groups.js)|Medium|
 2843|[Count Symmetric Integers](./solutions/2843-count-symmetric-integers.js)|Easy|
 2845|[Count of Interesting Subarrays](./solutions/2845-count-of-interesting-subarrays.js)|Medium|
 2873|[Maximum Value of an Ordered Triplet I](./solutions/2873-maximum-value-of-an-ordered-triplet-i.js)|Easy|
diff --git a/solutions/2826-sorting-three-groups.js b/solutions/2826-sorting-three-groups.js
new file mode 100644
index 00000000..0153b199
--- /dev/null
+++ b/solutions/2826-sorting-three-groups.js
@@ -0,0 +1,34 @@
+/**
+ * 2826. Sorting Three Groups
+ * https://leetcode.com/problems/sorting-three-groups/
+ * Difficulty: Medium
+ *
+ * You are given an integer array nums. Each element in nums is 1, 2 or 3. In each operation,
+ * you can remove an element from nums. Return the minimum number of operations to make nums
+ * non-decreasing.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var minimumOperations = function(nums) {
+  const n = nums.length;
+  const dp = new Array(n + 1).fill(0).map(() => new Array(4).fill(Infinity));
+  dp[0][0] = 0;
+
+  for (let i = 0; i < n; i++) {
+    for (let prev = 0; prev <= 3; prev++) {
+      for (let curr = 1; curr <= 3; curr++) {
+        if (curr >= prev) {
+          dp[i + 1][curr] = Math.min(
+            dp[i + 1][curr],
+            dp[i][prev] + (nums[i] === curr ? 0 : 1)
+          );
+        }
+      }
+    }
+  }
+
+  return Math.min(...dp[n].slice(1));
+};

From 76477ff191df170d905b32bb917d7ed8d10df4cb Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 3 Jun 2025 22:27:32 -0500
Subject: [PATCH 387/571] Add solution #3403

---
 README.md                                     |  1 +
 ...aphically-largest-string-from-the-box-i.js | 39 +++++++++++++++++++
 2 files changed, 40 insertions(+)
 create mode 100644 solutions/3403-find-the-lexicographically-largest-string-from-the-box-i.js

diff --git a/README.md b/README.md
index 380e4b77..61b2169a 100644
--- a/README.md
+++ b/README.md
@@ -2096,6 +2096,7 @@
 3396|[Minimum Number of Operations to Make Elements in Array Distinct](./solutions/3396-minimum-number-of-operations-to-make-elements-in-array-distinct.js)|Easy|
 3397|[Maximum Number of Distinct Elements After Operations](./solutions/3397-maximum-number-of-distinct-elements-after-operations.js)|Medium|
 3402|[Minimum Operations to Make Columns Strictly Increasing](./solutions/3402-minimum-operations-to-make-columns-strictly-increasing.js)|Easy|
+3403|[Find the Lexicographically Largest String From the Box I](./solutions/3403-find-the-lexicographically-largest-string-from-the-box-i.js)|Medium|
 3452|[Sum of Good Numbers](./solutions/3452-sum-of-good-numbers.js)|Easy|
 3461|[Check If Digits Are Equal in String After Operations I](./solutions/3461-check-if-digits-are-equal-in-string-after-operations-i.js)|Easy|
 3462|[Maximum Sum With at Most K Elements](./solutions/3462-maximum-sum-with-at-most-k-elements.js)|Medium|
diff --git a/solutions/3403-find-the-lexicographically-largest-string-from-the-box-i.js b/solutions/3403-find-the-lexicographically-largest-string-from-the-box-i.js
new file mode 100644
index 00000000..313bc4c7
--- /dev/null
+++ b/solutions/3403-find-the-lexicographically-largest-string-from-the-box-i.js
@@ -0,0 +1,39 @@
+/**
+ * 3403. Find the Lexicographically Largest String From the Box I
+ * https://leetcode.com/problems/find-the-lexicographically-largest-string-from-the-box-i/
+ * Difficulty: Medium
+ *
+ * You are given a string word, and an integer numFriends.
+ *
+ * Alice is organizing a game for her numFriends friends. There are multiple rounds in the game,
+ * where in each round:
+ * - word is split into numFriends non-empty strings, such that no previous round has had the
+ *   exact same split.
+ * - All the split words are put into a box.
+ *
+ * Find the lexicographically largest string from the box after all the rounds are finished.
+ */
+
+/**
+ * @param {string} word
+ * @param {number} numFriends
+ * @return {string}
+ */
+var answerString = function(word, numFriends) {
+  if (numFriends === 1) return word;
+
+  let result = '';
+  const wordLength = word.length;
+
+  for (let startIndex = 0; startIndex < wordLength; startIndex++) {
+    const maxLength = wordLength - numFriends + 1;
+    const endIndex = Math.min(startIndex + maxLength, wordLength);
+    const substring = word.slice(startIndex, endIndex);
+
+    if (substring > result) {
+      result = substring;
+    }
+  }
+
+  return result;
+};

From 56525e804d5f3614c4b0ec4456c5d3ffe05f45e5 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 3 Jun 2025 22:29:08 -0500
Subject: [PATCH 388/571] Add solution #2828

---
 README.md                                     |  1 +
 ...heck-if-a-string-is-an-acronym-of-words.js | 23 +++++++++++++++++++
 2 files changed, 24 insertions(+)
 create mode 100644 solutions/2828-check-if-a-string-is-an-acronym-of-words.js

diff --git a/README.md b/README.md
index 61b2169a..bc76bd68 100644
--- a/README.md
+++ b/README.md
@@ -2049,6 +2049,7 @@
 2824|[Count Pairs Whose Sum is Less than Target](./solutions/2824-count-pairs-whose-sum-is-less-than-target.js)|Easy|
 2825|[Make String a Subsequence Using Cyclic Increments](./solutions/2825-make-string-a-subsequence-using-cyclic-increments.js)|Medium|
 2826|[Sorting Three Groups](./solutions/2826-sorting-three-groups.js)|Medium|
+2828|[Check if a String Is an Acronym of Words](./solutions/2828-check-if-a-string-is-an-acronym-of-words.js)|Easy|
 2843|[Count Symmetric Integers](./solutions/2843-count-symmetric-integers.js)|Easy|
 2845|[Count of Interesting Subarrays](./solutions/2845-count-of-interesting-subarrays.js)|Medium|
 2873|[Maximum Value of an Ordered Triplet I](./solutions/2873-maximum-value-of-an-ordered-triplet-i.js)|Easy|
diff --git a/solutions/2828-check-if-a-string-is-an-acronym-of-words.js b/solutions/2828-check-if-a-string-is-an-acronym-of-words.js
new file mode 100644
index 00000000..c0b34517
--- /dev/null
+++ b/solutions/2828-check-if-a-string-is-an-acronym-of-words.js
@@ -0,0 +1,23 @@
+/**
+ * 2828. Check if a String Is an Acronym of Words
+ * https://leetcode.com/problems/check-if-a-string-is-an-acronym-of-words/
+ * Difficulty: Easy
+ *
+ * Given an array of strings words and a string s, determine if s is an acronym of words.
+ *
+ * The string s is considered an acronym of words if it can be formed by concatenating the
+ * first character of each string in words in order. For example, "ab" can be formed from
+ * ["apple", "banana"], but it can't be formed from ["bear", "aardvark"].
+ *
+ * Return true if s is an acronym of words, and false otherwise.
+ */
+
+/**
+ * @param {string[]} words
+ * @param {string} s
+ * @return {boolean}
+ */
+var isAcronym = function(words, s) {
+  if (words.length !== s.length) return false;
+  return words.every((word, index) => word[0] === s[index]);
+};

From fe97e998f15f83a05516fe1e113ff03123ae25fb Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 3 Jun 2025 22:30:37 -0500
Subject: [PATCH 389/571] Add solution #2829

---
 README.md                                     |  1 +
 ...e-the-minimum-sum-of-a-k-avoiding-array.js | 34 +++++++++++++++++++
 2 files changed, 35 insertions(+)
 create mode 100644 solutions/2829-determine-the-minimum-sum-of-a-k-avoiding-array.js

diff --git a/README.md b/README.md
index bc76bd68..0cfbb2e9 100644
--- a/README.md
+++ b/README.md
@@ -2050,6 +2050,7 @@
 2825|[Make String a Subsequence Using Cyclic Increments](./solutions/2825-make-string-a-subsequence-using-cyclic-increments.js)|Medium|
 2826|[Sorting Three Groups](./solutions/2826-sorting-three-groups.js)|Medium|
 2828|[Check if a String Is an Acronym of Words](./solutions/2828-check-if-a-string-is-an-acronym-of-words.js)|Easy|
+2829|[Determine the Minimum Sum of a k-avoiding Array](./solutions/2829-determine-the-minimum-sum-of-a-k-avoiding-array.js)|Medium|
 2843|[Count Symmetric Integers](./solutions/2843-count-symmetric-integers.js)|Easy|
 2845|[Count of Interesting Subarrays](./solutions/2845-count-of-interesting-subarrays.js)|Medium|
 2873|[Maximum Value of an Ordered Triplet I](./solutions/2873-maximum-value-of-an-ordered-triplet-i.js)|Easy|
diff --git a/solutions/2829-determine-the-minimum-sum-of-a-k-avoiding-array.js b/solutions/2829-determine-the-minimum-sum-of-a-k-avoiding-array.js
new file mode 100644
index 00000000..540df710
--- /dev/null
+++ b/solutions/2829-determine-the-minimum-sum-of-a-k-avoiding-array.js
@@ -0,0 +1,34 @@
+/**
+ * 2829. Determine the Minimum Sum of a k-avoiding Array
+ * https://leetcode.com/problems/determine-the-minimum-sum-of-a-k-avoiding-array/
+ * Difficulty: Medium
+ *
+ * You are given two integers, n and k.
+ *
+ * An array of distinct positive integers is called a k-avoiding array if there does not exist
+ * any pair of distinct elements that sum to k.
+ *
+ * Return the minimum possible sum of a k-avoiding array of length n.
+ */
+
+/**
+ * @param {number} n
+ * @param {number} k
+ * @return {number}
+ */
+var minimumSum = function(n, k) {
+  const set = new Set();
+  let result = 0;
+  let num = 1;
+
+  for (let i = 0; i < n; i++) {
+    while (set.has(k - num)) {
+      num++;
+    }
+    result += num;
+    set.add(num);
+    num++;
+  }
+
+  return result;
+};

From 30ebd04632c332ceabe04ce5b5d7ef1d9fae3104 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 3 Jun 2025 22:31:46 -0500
Subject: [PATCH 390/571] Add solution #2833

---
 README.md                                    |  1 +
 solutions/2833-furthest-point-from-origin.js | 32 ++++++++++++++++++++
 2 files changed, 33 insertions(+)
 create mode 100644 solutions/2833-furthest-point-from-origin.js

diff --git a/README.md b/README.md
index 0cfbb2e9..7f17a029 100644
--- a/README.md
+++ b/README.md
@@ -2051,6 +2051,7 @@
 2826|[Sorting Three Groups](./solutions/2826-sorting-three-groups.js)|Medium|
 2828|[Check if a String Is an Acronym of Words](./solutions/2828-check-if-a-string-is-an-acronym-of-words.js)|Easy|
 2829|[Determine the Minimum Sum of a k-avoiding Array](./solutions/2829-determine-the-minimum-sum-of-a-k-avoiding-array.js)|Medium|
+2833|[Furthest Point From Origin](./solutions/2833-furthest-point-from-origin.js)|Easy|
 2843|[Count Symmetric Integers](./solutions/2843-count-symmetric-integers.js)|Easy|
 2845|[Count of Interesting Subarrays](./solutions/2845-count-of-interesting-subarrays.js)|Medium|
 2873|[Maximum Value of an Ordered Triplet I](./solutions/2873-maximum-value-of-an-ordered-triplet-i.js)|Easy|
diff --git a/solutions/2833-furthest-point-from-origin.js b/solutions/2833-furthest-point-from-origin.js
new file mode 100644
index 00000000..0428216f
--- /dev/null
+++ b/solutions/2833-furthest-point-from-origin.js
@@ -0,0 +1,32 @@
+/**
+ * 2833. Furthest Point From Origin
+ * https://leetcode.com/problems/furthest-point-from-origin/
+ * Difficulty: Easy
+ *
+ * You are given a string moves of length n consisting only of characters 'L', 'R', and '_'.
+ * The string represents your movement on a number line starting from the origin 0.
+ *
+ * In the ith move, you can choose one of the following directions:
+ * - move to the left if moves[i] = 'L' or moves[i] = '_'
+ * - move to the right if moves[i] = 'R' or moves[i] = '_'
+ *
+ * Return the distance from the origin of the furthest point you can get to after n moves.
+ */
+
+/**
+ * @param {string} moves
+ * @return {number}
+ */
+var furthestDistanceFromOrigin = function(moves) {
+  let leftCount = 0;
+  let rightCount = 0;
+  let wildCount = 0;
+
+  for (const move of moves) {
+    if (move === 'L') leftCount++;
+    else if (move === 'R') rightCount++;
+    else wildCount++;
+  }
+
+  return Math.abs(leftCount - rightCount) + wildCount;
+};

From 8f31a0f5460ece01eae771730da7ef062564ef28 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 3 Jun 2025 22:34:11 -0500
Subject: [PATCH 391/571] Add solution #2839

---
 README.md                                     |  1 +
 ...ngs-can-be-made-equal-with-operations-i.js | 25 +++++++++++++++++++
 2 files changed, 26 insertions(+)
 create mode 100644 solutions/2839-check-if-strings-can-be-made-equal-with-operations-i.js

diff --git a/README.md b/README.md
index 7f17a029..ea66a521 100644
--- a/README.md
+++ b/README.md
@@ -2052,6 +2052,7 @@
 2828|[Check if a String Is an Acronym of Words](./solutions/2828-check-if-a-string-is-an-acronym-of-words.js)|Easy|
 2829|[Determine the Minimum Sum of a k-avoiding Array](./solutions/2829-determine-the-minimum-sum-of-a-k-avoiding-array.js)|Medium|
 2833|[Furthest Point From Origin](./solutions/2833-furthest-point-from-origin.js)|Easy|
+2839|[Check if Strings Can be Made Equal With Operations I](./solutions/2839-check-if-strings-can-be-made-equal-with-operations-i.js)|Easy|
 2843|[Count Symmetric Integers](./solutions/2843-count-symmetric-integers.js)|Easy|
 2845|[Count of Interesting Subarrays](./solutions/2845-count-of-interesting-subarrays.js)|Medium|
 2873|[Maximum Value of an Ordered Triplet I](./solutions/2873-maximum-value-of-an-ordered-triplet-i.js)|Easy|
diff --git a/solutions/2839-check-if-strings-can-be-made-equal-with-operations-i.js b/solutions/2839-check-if-strings-can-be-made-equal-with-operations-i.js
new file mode 100644
index 00000000..3eb6dfcb
--- /dev/null
+++ b/solutions/2839-check-if-strings-can-be-made-equal-with-operations-i.js
@@ -0,0 +1,25 @@
+/**
+ * 2839. Check if Strings Can be Made Equal With Operations I
+ * https://leetcode.com/problems/check-if-strings-can-be-made-equal-with-operations-i/
+ * Difficulty: Easy
+ *
+ * You are given two strings s1 and s2, both of length 4, consisting of lowercase English
+ * letters.
+ *
+ * You can apply the following operation on any of the two strings any number of times:
+ * - Choose any two indices i and j such that j - i = 2, then swap the two characters at those
+ *   indices in the string.
+ *
+ * Return true if you can make the strings s1 and s2 equal, and false otherwise.
+ */
+
+/**
+ * @param {string} s1
+ * @param {string} s2
+ * @return {boolean}
+ */
+var canBeEqual = function(s1, s2) {
+  const firstPair = [s1[0], s1[2]].sort().join() === [s2[0], s2[2]].sort().join();
+  const secondPair = [s1[1], s1[3]].sort().join() === [s2[1], s2[3]].sort().join();
+  return firstPair && secondPair;
+};

From ba5f8ff3b9dc0f12b9e183007670118ba2eae7d3 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 3 Jun 2025 22:37:44 -0500
Subject: [PATCH 392/571] Add solution #2840

---
 README.md                                     |  1 +
 ...gs-can-be-made-equal-with-operations-ii.js | 38 +++++++++++++++++++
 2 files changed, 39 insertions(+)
 create mode 100644 solutions/2840-check-if-strings-can-be-made-equal-with-operations-ii.js

diff --git a/README.md b/README.md
index ea66a521..a139cad0 100644
--- a/README.md
+++ b/README.md
@@ -2053,6 +2053,7 @@
 2829|[Determine the Minimum Sum of a k-avoiding Array](./solutions/2829-determine-the-minimum-sum-of-a-k-avoiding-array.js)|Medium|
 2833|[Furthest Point From Origin](./solutions/2833-furthest-point-from-origin.js)|Easy|
 2839|[Check if Strings Can be Made Equal With Operations I](./solutions/2839-check-if-strings-can-be-made-equal-with-operations-i.js)|Easy|
+2840|[Check if Strings Can be Made Equal With Operations II](./solutions/2840-check-if-strings-can-be-made-equal-with-operations-ii.js)|Medium|
 2843|[Count Symmetric Integers](./solutions/2843-count-symmetric-integers.js)|Easy|
 2845|[Count of Interesting Subarrays](./solutions/2845-count-of-interesting-subarrays.js)|Medium|
 2873|[Maximum Value of an Ordered Triplet I](./solutions/2873-maximum-value-of-an-ordered-triplet-i.js)|Easy|
diff --git a/solutions/2840-check-if-strings-can-be-made-equal-with-operations-ii.js b/solutions/2840-check-if-strings-can-be-made-equal-with-operations-ii.js
new file mode 100644
index 00000000..28a8805e
--- /dev/null
+++ b/solutions/2840-check-if-strings-can-be-made-equal-with-operations-ii.js
@@ -0,0 +1,38 @@
+/**
+ * 2840. Check if Strings Can be Made Equal With Operations II
+ * https://leetcode.com/problems/check-if-strings-can-be-made-equal-with-operations-ii/
+ * Difficulty: Medium
+ *
+ * You are given two strings s1 and s2, both of length n, consisting of lowercase English letters.
+ *
+ * You can apply the following operation on any of the two strings any number of times:
+ * - Choose any two indices i and j such that i < j and the difference j - i is even, then swap the
+ *   two characters at those indices in the string.
+ *
+ * Return true if you can make the strings s1 and s2 equal, and false otherwise.
+ */
+
+/**
+ * @param {string} s1
+ * @param {string} s2
+ * @return {boolean}
+ */
+var checkStrings = function(s1, s2) {
+  const evenChars1 = [];
+  const oddChars1 = [];
+  const evenChars2 = [];
+  const oddChars2 = [];
+
+  for (let i = 0; i < s1.length; i++) {
+    if (i % 2 === 0) {
+      evenChars1.push(s1[i]);
+      evenChars2.push(s2[i]);
+    } else {
+      oddChars1.push(s1[i]);
+      oddChars2.push(s2[i]);
+    }
+  }
+
+  return evenChars1.sort().join('') === evenChars2.sort().join('')
+    && oddChars1.sort().join('') === oddChars2.sort().join('');
+};

From f0060e7d874e30d06125474de3ffc18b8d5af05d Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 3 Jun 2025 22:40:31 -0500
Subject: [PATCH 393/571] Add solution #2846

---
 README.md                                     |  1 +
 ...ge-weight-equilibrium-queries-in-a-tree.js | 77 +++++++++++++++++++
 2 files changed, 78 insertions(+)
 create mode 100644 solutions/2846-minimum-edge-weight-equilibrium-queries-in-a-tree.js

diff --git a/README.md b/README.md
index a139cad0..3df9ef47 100644
--- a/README.md
+++ b/README.md
@@ -2056,6 +2056,7 @@
 2840|[Check if Strings Can be Made Equal With Operations II](./solutions/2840-check-if-strings-can-be-made-equal-with-operations-ii.js)|Medium|
 2843|[Count Symmetric Integers](./solutions/2843-count-symmetric-integers.js)|Easy|
 2845|[Count of Interesting Subarrays](./solutions/2845-count-of-interesting-subarrays.js)|Medium|
+2846|[Minimum Edge Weight Equilibrium Queries in a Tree](./solutions/2846-minimum-edge-weight-equilibrium-queries-in-a-tree.js)|Hard|
 2873|[Maximum Value of an Ordered Triplet I](./solutions/2873-maximum-value-of-an-ordered-triplet-i.js)|Easy|
 2874|[Maximum Value of an Ordered Triplet II](./solutions/2874-maximum-value-of-an-ordered-triplet-ii.js)|Medium|
 2894|[Divisible and Non-divisible Sums Difference](./solutions/2894-divisible-and-non-divisible-sums-difference.js)|Easy|
diff --git a/solutions/2846-minimum-edge-weight-equilibrium-queries-in-a-tree.js b/solutions/2846-minimum-edge-weight-equilibrium-queries-in-a-tree.js
new file mode 100644
index 00000000..87c0f17c
--- /dev/null
+++ b/solutions/2846-minimum-edge-weight-equilibrium-queries-in-a-tree.js
@@ -0,0 +1,77 @@
+/**
+ * 2846. Minimum Edge Weight Equilibrium Queries in a Tree
+ * https://leetcode.com/problems/minimum-edge-weight-equilibrium-queries-in-a-tree/
+ * Difficulty: Hard
+ *
+ * There is an undirected tree with n nodes labeled from 0 to n - 1. You are given the integer n and
+ * a 2D integer array edges of length n - 1, where edges[i] = [ui, vi, wi] indicates that there is
+ * an edge between nodes ui and vi with weight wi in the tree.
+ *
+ * You are also given a 2D integer array queries of length m, where queries[i] = [ai, bi]. For each
+ * query, find the minimum number of operations required to make the weight of every edge on the
+ * path from ai to bi equal. In one operation, you can choose any edge of the tree and change its
+ * weight to any value.
+ *
+ * Note that:
+ * - Queries are independent of each other, meaning that the tree returns to its initial state on
+ *   each new query.
+ * - The path from ai to bi is a sequence of distinct nodes starting with node ai and ending with
+ *   node bi such that every two adjacent nodes in the sequence share an edge in the tree.
+ *
+ * Return an array answer of length m where answer[i] is the answer to the ith query.
+ */
+
+/**
+ * @param {number} n
+ * @param {number[][]} edges
+ * @param {number[][]} queries
+ * @return {number[]}
+ */
+var minOperationsQueries = function(n, edges, queries) {
+  const graph = Array.from({ length: n }, () => []);
+  for (const [u, v, w] of edges) {
+    graph[u].push([v, w]);
+    graph[v].push([u, w]);
+  }
+
+  const parent = new Array(n).fill(-1);
+  const weightCount = new Array(n).fill().map(() => new Array(27).fill(0));
+  const depth = new Array(n).fill(0);
+
+  dfs(0, -1, 0);
+
+  const result = [];
+  for (const [u, v] of queries) {
+    const ancestor = lca(u, v);
+    const counts = Array(27).fill(0);
+    for (let i = 1; i <= 26; i++) {
+      counts[i] = weightCount[u][i] + weightCount[v][i] - 2 * weightCount[ancestor][i];
+    }
+    const total = depth[u] + depth[v] - 2 * depth[ancestor];
+    const maxCount = Math.max(...counts);
+    result.push(total - maxCount);
+  }
+
+  return result;
+
+  function dfs(node, par, dep) {
+    parent[node] = par;
+    depth[node] = dep;
+    for (const [next, w] of graph[node]) {
+      if (next !== par) {
+        weightCount[next] = [...weightCount[node]];
+        weightCount[next][w]++;
+        dfs(next, node, dep + 1);
+      }
+    }
+  }
+  function lca(u, v) {
+    if (depth[u] < depth[v]) [u, v] = [v, u];
+    while (depth[u] > depth[v]) u = parent[u];
+    while (u !== v) {
+      u = parent[u];
+      v = parent[v];
+    }
+    return u;
+  }
+};

From e771f7b9eb401ad00a2ccade4a178c2de0c4a7f0 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 3 Jun 2025 22:41:25 -0500
Subject: [PATCH 394/571] Add solution #2848

---
 README.md                                     |  1 +
 .../2848-points-that-intersect-with-cars.js   | 27 +++++++++++++++++++
 2 files changed, 28 insertions(+)
 create mode 100644 solutions/2848-points-that-intersect-with-cars.js

diff --git a/README.md b/README.md
index 3df9ef47..a42458bc 100644
--- a/README.md
+++ b/README.md
@@ -2057,6 +2057,7 @@
 2843|[Count Symmetric Integers](./solutions/2843-count-symmetric-integers.js)|Easy|
 2845|[Count of Interesting Subarrays](./solutions/2845-count-of-interesting-subarrays.js)|Medium|
 2846|[Minimum Edge Weight Equilibrium Queries in a Tree](./solutions/2846-minimum-edge-weight-equilibrium-queries-in-a-tree.js)|Hard|
+2848|[Points That Intersect With Cars](./solutions/2848-points-that-intersect-with-cars.js)|Easy|
 2873|[Maximum Value of an Ordered Triplet I](./solutions/2873-maximum-value-of-an-ordered-triplet-i.js)|Easy|
 2874|[Maximum Value of an Ordered Triplet II](./solutions/2874-maximum-value-of-an-ordered-triplet-ii.js)|Medium|
 2894|[Divisible and Non-divisible Sums Difference](./solutions/2894-divisible-and-non-divisible-sums-difference.js)|Easy|
diff --git a/solutions/2848-points-that-intersect-with-cars.js b/solutions/2848-points-that-intersect-with-cars.js
new file mode 100644
index 00000000..fc4f58de
--- /dev/null
+++ b/solutions/2848-points-that-intersect-with-cars.js
@@ -0,0 +1,27 @@
+/**
+ * 2848. Points That Intersect With Cars
+ * https://leetcode.com/problems/points-that-intersect-with-cars/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed 2D integer array nums representing the coordinates of the cars
+ * parking on a number line. For any index i, nums[i] = [starti, endi] where starti is the
+ * starting point of the ith car and endi is the ending point of the ith car.
+ *
+ * Return the number of integer points on the line that are covered with any part of a car.
+ */
+
+/**
+ * @param {number[][]} nums
+ * @return {number}
+ */
+var numberOfPoints = function(nums) {
+  const set = new Set();
+
+  for (const [start, end] of nums) {
+    for (let i = start; i <= end; i++) {
+      set.add(i);
+    }
+  }
+
+  return set.size;
+};

From 014542ebf7a0cda334dab65517187159cbe16704 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 3 Jun 2025 22:43:18 -0500
Subject: [PATCH 395/571] Add solution #2850

---
 README.md                                     |  1 +
 ...inimum-moves-to-spread-stones-over-grid.js | 59 +++++++++++++++++++
 2 files changed, 60 insertions(+)
 create mode 100644 solutions/2850-minimum-moves-to-spread-stones-over-grid.js

diff --git a/README.md b/README.md
index a42458bc..97b24c98 100644
--- a/README.md
+++ b/README.md
@@ -2058,6 +2058,7 @@
 2845|[Count of Interesting Subarrays](./solutions/2845-count-of-interesting-subarrays.js)|Medium|
 2846|[Minimum Edge Weight Equilibrium Queries in a Tree](./solutions/2846-minimum-edge-weight-equilibrium-queries-in-a-tree.js)|Hard|
 2848|[Points That Intersect With Cars](./solutions/2848-points-that-intersect-with-cars.js)|Easy|
+2850|[Minimum Moves to Spread Stones Over Grid](./solutions/2850-minimum-moves-to-spread-stones-over-grid.js)|Medium|
 2873|[Maximum Value of an Ordered Triplet I](./solutions/2873-maximum-value-of-an-ordered-triplet-i.js)|Easy|
 2874|[Maximum Value of an Ordered Triplet II](./solutions/2874-maximum-value-of-an-ordered-triplet-ii.js)|Medium|
 2894|[Divisible and Non-divisible Sums Difference](./solutions/2894-divisible-and-non-divisible-sums-difference.js)|Easy|
diff --git a/solutions/2850-minimum-moves-to-spread-stones-over-grid.js b/solutions/2850-minimum-moves-to-spread-stones-over-grid.js
new file mode 100644
index 00000000..b56e1393
--- /dev/null
+++ b/solutions/2850-minimum-moves-to-spread-stones-over-grid.js
@@ -0,0 +1,59 @@
+/**
+ * 2850. Minimum Moves to Spread Stones Over Grid
+ * https://leetcode.com/problems/minimum-moves-to-spread-stones-over-grid/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed 2D integer matrix grid of size 3 * 3, representing the number of
+ * stones in each cell. The grid contains exactly 9 stones, and there can be multiple stones
+ * in a single cell.
+ *
+ * In one move, you can move a single stone from its current cell to any other cell if the two
+ * cells share a side.
+ *
+ * Return the minimum number of moves required to place one stone in each cell.
+ */
+
+/**
+ * @param {number[][]} grid
+ * @return {number}
+ */
+var minimumMoves = function(grid) {
+  const sources = [];
+  const targets = [];
+
+  for (let i = 0; i < 3; i++) {
+    for (let j = 0; j < 3; j++) {
+      if (grid[i][j] > 1) {
+        for (let k = 1; k < grid[i][j]; k++) {
+          sources.push([i, j]);
+        }
+      } else if (grid[i][j] === 0) {
+        targets.push([i, j]);
+      }
+    }
+  }
+
+  let minMoves = Infinity;
+
+  permute(0, 0);
+  return minMoves;
+
+  function permute(index, moves) {
+    if (index === sources.length) {
+      minMoves = Math.min(minMoves, moves);
+      return;
+    }
+
+    for (let i = 0; i < targets.length; i++) {
+      if (targets[i]) {
+        const [si, sj] = sources[index];
+        const [ti, tj] = targets[i];
+        const dist = Math.abs(si - ti) + Math.abs(sj - tj);
+        const temp = targets[i];
+        targets[i] = null;
+        permute(index + 1, moves + dist);
+        targets[i] = temp;
+      }
+    }
+  }
+};

From dc63ca29ffd0410ce9b893bc6adf95e803be7c2a Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 3 Jun 2025 22:44:31 -0500
Subject: [PATCH 396/571] Add solution #2855

---
 README.md                                     |  1 +
 ...-minimum-right-shifts-to-sort-the-array.js | 33 +++++++++++++++++++
 2 files changed, 34 insertions(+)
 create mode 100644 solutions/2855-minimum-right-shifts-to-sort-the-array.js

diff --git a/README.md b/README.md
index 97b24c98..2bbf7f90 100644
--- a/README.md
+++ b/README.md
@@ -2059,6 +2059,7 @@
 2846|[Minimum Edge Weight Equilibrium Queries in a Tree](./solutions/2846-minimum-edge-weight-equilibrium-queries-in-a-tree.js)|Hard|
 2848|[Points That Intersect With Cars](./solutions/2848-points-that-intersect-with-cars.js)|Easy|
 2850|[Minimum Moves to Spread Stones Over Grid](./solutions/2850-minimum-moves-to-spread-stones-over-grid.js)|Medium|
+2855|[Minimum Right Shifts to Sort the Array](./solutions/2855-minimum-right-shifts-to-sort-the-array.js)|Easy|
 2873|[Maximum Value of an Ordered Triplet I](./solutions/2873-maximum-value-of-an-ordered-triplet-i.js)|Easy|
 2874|[Maximum Value of an Ordered Triplet II](./solutions/2874-maximum-value-of-an-ordered-triplet-ii.js)|Medium|
 2894|[Divisible and Non-divisible Sums Difference](./solutions/2894-divisible-and-non-divisible-sums-difference.js)|Easy|
diff --git a/solutions/2855-minimum-right-shifts-to-sort-the-array.js b/solutions/2855-minimum-right-shifts-to-sort-the-array.js
new file mode 100644
index 00000000..9bf69806
--- /dev/null
+++ b/solutions/2855-minimum-right-shifts-to-sort-the-array.js
@@ -0,0 +1,33 @@
+/**
+ * 2855. Minimum Right Shifts to Sort the Array
+ * https://leetcode.com/problems/minimum-right-shifts-to-sort-the-array/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed array nums of length n containing distinct positive integers.
+ * Return the minimum number of right shifts required to sort nums and -1 if this is not
+ * possible.
+ *
+ * A right shift is defined as shifting the element at index i to index (i + 1) % n, for
+ * all indices.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var minimumRightShifts = function(nums) {
+  const n = nums.length;
+  let breakPoint = 0;
+
+  for (let i = 1; i < n; i++) {
+    if (nums[i] < nums[i - 1]) {
+      breakPoint++;
+      if (breakPoint > 1) return -1;
+    }
+  }
+
+  if (breakPoint === 0) return 0;
+  if (nums[n - 1] > nums[0]) return -1;
+
+  return n - (nums.indexOf(Math.min(...nums)));
+};

From 5c5c0c039fea0d14333afc99cc8fcf39e6362e9f Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 3 Jun 2025 23:02:48 -0500
Subject: [PATCH 397/571] Add solution #2858

---
 README.md                                     |  1 +
 ...ge-reversals-so-every-node-is-reachable.js | 62 +++++++++++++++++++
 2 files changed, 63 insertions(+)
 create mode 100644 solutions/2858-minimum-edge-reversals-so-every-node-is-reachable.js

diff --git a/README.md b/README.md
index 2bbf7f90..5a3b10ab 100644
--- a/README.md
+++ b/README.md
@@ -2060,6 +2060,7 @@
 2848|[Points That Intersect With Cars](./solutions/2848-points-that-intersect-with-cars.js)|Easy|
 2850|[Minimum Moves to Spread Stones Over Grid](./solutions/2850-minimum-moves-to-spread-stones-over-grid.js)|Medium|
 2855|[Minimum Right Shifts to Sort the Array](./solutions/2855-minimum-right-shifts-to-sort-the-array.js)|Easy|
+2858|[Minimum Edge Reversals So Every Node Is Reachable](./solutions/2858-minimum-edge-reversals-so-every-node-is-reachable.js)|Hard|
 2873|[Maximum Value of an Ordered Triplet I](./solutions/2873-maximum-value-of-an-ordered-triplet-i.js)|Easy|
 2874|[Maximum Value of an Ordered Triplet II](./solutions/2874-maximum-value-of-an-ordered-triplet-ii.js)|Medium|
 2894|[Divisible and Non-divisible Sums Difference](./solutions/2894-divisible-and-non-divisible-sums-difference.js)|Easy|
diff --git a/solutions/2858-minimum-edge-reversals-so-every-node-is-reachable.js b/solutions/2858-minimum-edge-reversals-so-every-node-is-reachable.js
new file mode 100644
index 00000000..dc7b451a
--- /dev/null
+++ b/solutions/2858-minimum-edge-reversals-so-every-node-is-reachable.js
@@ -0,0 +1,62 @@
+/**
+ * 2858. Minimum Edge Reversals So Every Node Is Reachable
+ * https://leetcode.com/problems/minimum-edge-reversals-so-every-node-is-reachable/
+ * Difficulty: Hard
+ *
+ * There is a simple directed graph with n nodes labeled from 0 to n - 1. The graph would form
+ * a tree if its edges were bi-directional.
+ *
+ * You are given an integer n and a 2D integer array edges, where edges[i] = [ui, vi] represents
+ * a directed edge going from node ui to node vi.
+ *
+ * An edge reversal changes the direction of an edge, i.e., a directed edge going from node ui to
+ * node vi becomes a directed edge going from node vi to node ui.
+ *
+ * For every node i in the range [0, n - 1], your task is to independently calculate the minimum
+ * number of edge reversals required so it is possible to reach any other node starting from node
+ * i through a sequence of directed edges.
+ *
+ * Return an integer array answer, where answer[i] is the minimum number of edge reversals required
+ * so it is possible to reach any other node starting from node i through a sequence of directed
+ * edges.
+ */
+
+/**
+ * @param {number} n
+ * @param {number[][]} edges
+ * @return {number[]}
+ */
+var minEdgeReversals = function(n, edges) {
+  const graph = Array.from({ length: n }, () => []);
+
+  for (const [u, v] of edges) {
+    graph[u].push([v, 0]);
+    graph[v].push([u, 1]);
+  }
+
+  const result = new Array(n);
+  const rootReversals = dfs(0, -1);
+
+  reroot(0, -1, rootReversals);
+
+  return result;
+  function dfs(node, parent) {
+    let reversals = 0;
+    for (const [neighbor, cost] of graph[node]) {
+      if (neighbor !== parent) {
+        reversals += cost + dfs(neighbor, node);
+      }
+    }
+    return reversals;
+  }
+
+  function reroot(node, parent, parentReversals) {
+    result[node] = parentReversals;
+    for (const [neighbor, cost] of graph[node]) {
+      if (neighbor !== parent) {
+        const childReversals = result[node] - cost + (1 - cost);
+        reroot(neighbor, node, childReversals);
+      }
+    }
+  }
+};

From 14de16569690e78238aeb72b867b08560b676376 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 3 Jun 2025 23:04:02 -0500
Subject: [PATCH 398/571] Add solution #2859

---
 README.md                                     |  1 +
 ...um-of-values-at-indices-with-k-set-bits.js | 31 +++++++++++++++++++
 2 files changed, 32 insertions(+)
 create mode 100644 solutions/2859-sum-of-values-at-indices-with-k-set-bits.js

diff --git a/README.md b/README.md
index 5a3b10ab..24d4eeb3 100644
--- a/README.md
+++ b/README.md
@@ -2061,6 +2061,7 @@
 2850|[Minimum Moves to Spread Stones Over Grid](./solutions/2850-minimum-moves-to-spread-stones-over-grid.js)|Medium|
 2855|[Minimum Right Shifts to Sort the Array](./solutions/2855-minimum-right-shifts-to-sort-the-array.js)|Easy|
 2858|[Minimum Edge Reversals So Every Node Is Reachable](./solutions/2858-minimum-edge-reversals-so-every-node-is-reachable.js)|Hard|
+2859|[Sum of Values at Indices With K Set Bits](./solutions/2859-sum-of-values-at-indices-with-k-set-bits.js)|Easy|
 2873|[Maximum Value of an Ordered Triplet I](./solutions/2873-maximum-value-of-an-ordered-triplet-i.js)|Easy|
 2874|[Maximum Value of an Ordered Triplet II](./solutions/2874-maximum-value-of-an-ordered-triplet-ii.js)|Medium|
 2894|[Divisible and Non-divisible Sums Difference](./solutions/2894-divisible-and-non-divisible-sums-difference.js)|Easy|
diff --git a/solutions/2859-sum-of-values-at-indices-with-k-set-bits.js b/solutions/2859-sum-of-values-at-indices-with-k-set-bits.js
new file mode 100644
index 00000000..c14b88d3
--- /dev/null
+++ b/solutions/2859-sum-of-values-at-indices-with-k-set-bits.js
@@ -0,0 +1,31 @@
+/**
+ * 2859. Sum of Values at Indices With K Set Bits
+ * https://leetcode.com/problems/sum-of-values-at-indices-with-k-set-bits/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed integer array nums and an integer k.
+ *
+ * Return an integer that denotes the sum of elements in nums whose corresponding indices have
+ * exactly k set bits in their binary representation.
+ *
+ * The set bits in an integer are the 1's present when it is written in binary.
+ *
+ * For example, the binary representation of 21 is 10101, which has 3 set bits.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} k
+ * @return {number}
+ */
+var sumIndicesWithKSetBits = function(nums, k) {
+  let result = 0;
+
+  for (let i = 0; i < nums.length; i++) {
+    if (i.toString(2).split('1').length - 1 === k) {
+      result += nums[i];
+    }
+  }
+
+  return result;
+};

From 1298166f30473b14c0aaa8ba85d3299440f2ded5 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 3 Jun 2025 23:05:27 -0500
Subject: [PATCH 399/571] Add solution #2860

---
 README.md                        |  1 +
 solutions/2860-happy-students.js | 38 ++++++++++++++++++++++++++++++++
 2 files changed, 39 insertions(+)
 create mode 100644 solutions/2860-happy-students.js

diff --git a/README.md b/README.md
index 24d4eeb3..7822099b 100644
--- a/README.md
+++ b/README.md
@@ -2062,6 +2062,7 @@
 2855|[Minimum Right Shifts to Sort the Array](./solutions/2855-minimum-right-shifts-to-sort-the-array.js)|Easy|
 2858|[Minimum Edge Reversals So Every Node Is Reachable](./solutions/2858-minimum-edge-reversals-so-every-node-is-reachable.js)|Hard|
 2859|[Sum of Values at Indices With K Set Bits](./solutions/2859-sum-of-values-at-indices-with-k-set-bits.js)|Easy|
+2860|[Happy Students](./solutions/2860-happy-students.js)|Medium|
 2873|[Maximum Value of an Ordered Triplet I](./solutions/2873-maximum-value-of-an-ordered-triplet-i.js)|Easy|
 2874|[Maximum Value of an Ordered Triplet II](./solutions/2874-maximum-value-of-an-ordered-triplet-ii.js)|Medium|
 2894|[Divisible and Non-divisible Sums Difference](./solutions/2894-divisible-and-non-divisible-sums-difference.js)|Easy|
diff --git a/solutions/2860-happy-students.js b/solutions/2860-happy-students.js
new file mode 100644
index 00000000..460015b2
--- /dev/null
+++ b/solutions/2860-happy-students.js
@@ -0,0 +1,38 @@
+/**
+ * 2860. Happy Students
+ * https://leetcode.com/problems/happy-students/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed integer array nums of length n where n is the total number of
+ * students in the class. The class teacher tries to select a group of students so that
+ * all the students remain happy.
+ *
+ * The ith student will become happy if one of these two conditions is met:
+ * - The student is selected and the total number of selected students is strictly greater
+ *   than nums[i].
+ * - The student is not selected and the total number of selected students is strictly less
+ *   than nums[i].
+ *
+ * Return the number of ways to select a group of students so that everyone remains happy.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var countWays = function(nums) {
+  nums.sort((a, b) => a - b);
+  let result = 0;
+  let selected = 0;
+
+  if (0 < nums[0]) result++;
+
+  for (let i = 0; i < nums.length; i++) {
+    selected++;
+    if (selected > nums[i] && (i + 1 === nums.length || selected < nums[i + 1])) {
+      result++;
+    }
+  }
+
+  return result;
+};

From 6f1d2a364dfd66b073d9e5ea84a3d3d27c86b7f4 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 3 Jun 2025 23:06:38 -0500
Subject: [PATCH 400/571] Add solution #2862

---
 README.md                                     |  1 +
 ...ent-sum-of-a-complete-subset-of-indices.js | 46 +++++++++++++++++++
 2 files changed, 47 insertions(+)
 create mode 100644 solutions/2862-maximum-element-sum-of-a-complete-subset-of-indices.js

diff --git a/README.md b/README.md
index 7822099b..23f94888 100644
--- a/README.md
+++ b/README.md
@@ -2063,6 +2063,7 @@
 2858|[Minimum Edge Reversals So Every Node Is Reachable](./solutions/2858-minimum-edge-reversals-so-every-node-is-reachable.js)|Hard|
 2859|[Sum of Values at Indices With K Set Bits](./solutions/2859-sum-of-values-at-indices-with-k-set-bits.js)|Easy|
 2860|[Happy Students](./solutions/2860-happy-students.js)|Medium|
+2862|[Maximum Element-Sum of a Complete Subset of Indices](./solutions/2862-maximum-element-sum-of-a-complete-subset-of-indices.js)|Hard|
 2873|[Maximum Value of an Ordered Triplet I](./solutions/2873-maximum-value-of-an-ordered-triplet-i.js)|Easy|
 2874|[Maximum Value of an Ordered Triplet II](./solutions/2874-maximum-value-of-an-ordered-triplet-ii.js)|Medium|
 2894|[Divisible and Non-divisible Sums Difference](./solutions/2894-divisible-and-non-divisible-sums-difference.js)|Easy|
diff --git a/solutions/2862-maximum-element-sum-of-a-complete-subset-of-indices.js b/solutions/2862-maximum-element-sum-of-a-complete-subset-of-indices.js
new file mode 100644
index 00000000..33a8aa2d
--- /dev/null
+++ b/solutions/2862-maximum-element-sum-of-a-complete-subset-of-indices.js
@@ -0,0 +1,46 @@
+/**
+ * 2862. Maximum Element-Sum of a Complete Subset of Indices
+ * https://leetcode.com/problems/maximum-element-sum-of-a-complete-subset-of-indices/
+ * Difficulty: Hard
+ *
+ * You are given a 1-indexed array nums. Your task is to select a complete subset from nums where
+ * every pair of selected indices multiplied is a perfect square,. i. e. if you select ai and aj,
+ * i * j must be a perfect square.
+ *
+ * Return the sum of the complete subset with the maximum sum.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var maximumSum = function(nums) {
+  const n = nums.length;
+  const map = new Map();
+
+  for (let i = 1; i <= n; i++) {
+    let factors = 1;
+    let num = i;
+
+    for (let p = 2; p * p <= num; p++) {
+      let count = 0;
+      while (num % p === 0) {
+        count++;
+        num /= p;
+      }
+      if (count % 2 === 1) factors *= p;
+    }
+    if (num > 1) factors *= num;
+
+    if (!map.has(factors)) map.set(factors, []);
+    map.get(factors).push(nums[i - 1]);
+  }
+
+  let result = 0;
+  for (const group of map.values()) {
+    const sum = group.reduce((a, b) => a + b, 0);
+    result = Math.max(result, sum);
+  }
+
+  return result;
+};

From 1e3c8f6ac4aedec67efe3d6448e536460cd3e542 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 3 Jun 2025 23:08:45 -0500
Subject: [PATCH 401/571] Add solution #2864

---
 README.md                                   |  1 +
 solutions/2864-maximum-odd-binary-number.js | 27 +++++++++++++++++++++
 2 files changed, 28 insertions(+)
 create mode 100644 solutions/2864-maximum-odd-binary-number.js

diff --git a/README.md b/README.md
index 23f94888..fcb4a12d 100644
--- a/README.md
+++ b/README.md
@@ -2064,6 +2064,7 @@
 2859|[Sum of Values at Indices With K Set Bits](./solutions/2859-sum-of-values-at-indices-with-k-set-bits.js)|Easy|
 2860|[Happy Students](./solutions/2860-happy-students.js)|Medium|
 2862|[Maximum Element-Sum of a Complete Subset of Indices](./solutions/2862-maximum-element-sum-of-a-complete-subset-of-indices.js)|Hard|
+2864|[Maximum Odd Binary Number](./solutions/2864-maximum-odd-binary-number.js)|Easy|
 2873|[Maximum Value of an Ordered Triplet I](./solutions/2873-maximum-value-of-an-ordered-triplet-i.js)|Easy|
 2874|[Maximum Value of an Ordered Triplet II](./solutions/2874-maximum-value-of-an-ordered-triplet-ii.js)|Medium|
 2894|[Divisible and Non-divisible Sums Difference](./solutions/2894-divisible-and-non-divisible-sums-difference.js)|Easy|
diff --git a/solutions/2864-maximum-odd-binary-number.js b/solutions/2864-maximum-odd-binary-number.js
new file mode 100644
index 00000000..82fd37bc
--- /dev/null
+++ b/solutions/2864-maximum-odd-binary-number.js
@@ -0,0 +1,27 @@
+/**
+ * 2864. Maximum Odd Binary Number
+ * https://leetcode.com/problems/maximum-odd-binary-number/
+ * Difficulty: Easy
+ *
+ * You are given a binary string s that contains at least one '1'.
+ *
+ * You have to rearrange the bits in such a way that the resulting binary number is the maximum
+ * odd binary number that can be created from this combination.
+ *
+ * Return a string representing the maximum odd binary number that can be created from the given
+ * combination.
+ *
+ * Note that the resulting string can have leading zeros.
+ */
+
+/**
+ * @param {string} s
+ * @return {string}
+ */
+var maximumOddBinaryNumber = function(s) {
+  let ones = 0;
+  for (const bit of s) {
+    if (bit === '1') ones++;
+  }
+  return '1'.padStart(ones, '1').padEnd(s.length, '0').slice(1) + '1';
+};

From c3d1534a119b12bd5cff56c822e4e1f8b2c780a2 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 3 Jun 2025 23:47:16 -0500
Subject: [PATCH 402/571] Add solution #2865

---
 README.md                            |  1 +
 solutions/2865-beautiful-towers-i.js | 44 ++++++++++++++++++++++++++++
 2 files changed, 45 insertions(+)
 create mode 100644 solutions/2865-beautiful-towers-i.js

diff --git a/README.md b/README.md
index fcb4a12d..e7305b1d 100644
--- a/README.md
+++ b/README.md
@@ -2065,6 +2065,7 @@
 2860|[Happy Students](./solutions/2860-happy-students.js)|Medium|
 2862|[Maximum Element-Sum of a Complete Subset of Indices](./solutions/2862-maximum-element-sum-of-a-complete-subset-of-indices.js)|Hard|
 2864|[Maximum Odd Binary Number](./solutions/2864-maximum-odd-binary-number.js)|Easy|
+2865|[Beautiful Towers I](./solutions/2865-beautiful-towers-i.js)|Medium|
 2873|[Maximum Value of an Ordered Triplet I](./solutions/2873-maximum-value-of-an-ordered-triplet-i.js)|Easy|
 2874|[Maximum Value of an Ordered Triplet II](./solutions/2874-maximum-value-of-an-ordered-triplet-ii.js)|Medium|
 2894|[Divisible and Non-divisible Sums Difference](./solutions/2894-divisible-and-non-divisible-sums-difference.js)|Easy|
diff --git a/solutions/2865-beautiful-towers-i.js b/solutions/2865-beautiful-towers-i.js
new file mode 100644
index 00000000..f0fa8c07
--- /dev/null
+++ b/solutions/2865-beautiful-towers-i.js
@@ -0,0 +1,44 @@
+/**
+ * 2865. Beautiful Towers I
+ * https://leetcode.com/problems/beautiful-towers-i/
+ * Difficulty: Medium
+ *
+ * You are given an array heights of n integers representing the number of bricks in n
+ * consecutive towers. Your task is to remove some bricks to form a mountain-shaped tower
+ * arrangement. In this arrangement, the tower heights are non-decreasing, reaching a
+ * maximum peak value with one or multiple consecutive towers and then non-increasing.
+ *
+ * Return the maximum possible sum of heights of a mountain-shaped tower arrangement.
+ */
+
+/**
+ * @param {number[]} heights
+ * @return {number}
+ */
+var maximumSumOfHeights = function(heights) {
+  const n = heights.length;
+  let result = 0;
+
+  for (let peak = 0; peak < n; peak++) {
+    let currentSum = heights[peak];
+    let prevHeight = heights[peak];
+
+    for (let i = peak - 1; i >= 0; i--) {
+      const currentHeight = Math.min(heights[i], prevHeight);
+      currentSum += currentHeight;
+      prevHeight = currentHeight;
+    }
+
+    prevHeight = heights[peak];
+
+    for (let i = peak + 1; i < n; i++) {
+      const currentHeight = Math.min(heights[i], prevHeight);
+      currentSum += currentHeight;
+      prevHeight = currentHeight;
+    }
+
+    result = Math.max(result, currentSum);
+  }
+
+  return result;
+};

From c7188bb4998e386fdfd00b1081b030ba769008b6 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 3 Jun 2025 23:48:22 -0500
Subject: [PATCH 403/571] Add solution #2869

---
 README.md                                     |  1 +
 ...-minimum-operations-to-collect-elements.js | 29 +++++++++++++++++++
 2 files changed, 30 insertions(+)
 create mode 100644 solutions/2869-minimum-operations-to-collect-elements.js

diff --git a/README.md b/README.md
index e7305b1d..42d2bef8 100644
--- a/README.md
+++ b/README.md
@@ -2066,6 +2066,7 @@
 2862|[Maximum Element-Sum of a Complete Subset of Indices](./solutions/2862-maximum-element-sum-of-a-complete-subset-of-indices.js)|Hard|
 2864|[Maximum Odd Binary Number](./solutions/2864-maximum-odd-binary-number.js)|Easy|
 2865|[Beautiful Towers I](./solutions/2865-beautiful-towers-i.js)|Medium|
+2869|[Minimum Operations to Collect Elements](./solutions/2869-minimum-operations-to-collect-elements.js)|Easy|
 2873|[Maximum Value of an Ordered Triplet I](./solutions/2873-maximum-value-of-an-ordered-triplet-i.js)|Easy|
 2874|[Maximum Value of an Ordered Triplet II](./solutions/2874-maximum-value-of-an-ordered-triplet-ii.js)|Medium|
 2894|[Divisible and Non-divisible Sums Difference](./solutions/2894-divisible-and-non-divisible-sums-difference.js)|Easy|
diff --git a/solutions/2869-minimum-operations-to-collect-elements.js b/solutions/2869-minimum-operations-to-collect-elements.js
new file mode 100644
index 00000000..4f52b704
--- /dev/null
+++ b/solutions/2869-minimum-operations-to-collect-elements.js
@@ -0,0 +1,29 @@
+/**
+ * 2869. Minimum Operations to Collect Elements
+ * https://leetcode.com/problems/minimum-operations-to-collect-elements/
+ * Difficulty: Easy
+ *
+ * You are given an array nums of positive integers and an integer k.
+ *
+ * In one operation, you can remove the last element of the array and add it to your collection.
+ *
+ * Return the minimum number of operations needed to collect elements 1, 2, ..., k.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} k
+ * @return {number}
+ */
+var minOperations = function(nums, k) {
+  const set = new Set();
+  let result = 0;
+
+  for (let i = nums.length - 1; i >= 0; i--) {
+    result++;
+    if (nums[i] <= k) set.add(nums[i]);
+    if (set.size === k) return result;
+  }
+
+  return result;
+};

From edab83864c5ef7720b9302c12138eb48ab0f7ffb Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 3 Jun 2025 23:50:02 -0500
Subject: [PATCH 404/571] Add solution #2870

---
 README.md                                     |  1 +
 ...umber-of-operations-to-make-array-empty.js | 33 +++++++++++++++++++
 2 files changed, 34 insertions(+)
 create mode 100644 solutions/2870-minimum-number-of-operations-to-make-array-empty.js

diff --git a/README.md b/README.md
index 42d2bef8..ce513391 100644
--- a/README.md
+++ b/README.md
@@ -2067,6 +2067,7 @@
 2864|[Maximum Odd Binary Number](./solutions/2864-maximum-odd-binary-number.js)|Easy|
 2865|[Beautiful Towers I](./solutions/2865-beautiful-towers-i.js)|Medium|
 2869|[Minimum Operations to Collect Elements](./solutions/2869-minimum-operations-to-collect-elements.js)|Easy|
+2870|[Minimum Number of Operations to Make Array Empty](./solutions/2870-minimum-number-of-operations-to-make-array-empty.js)|Medium|
 2873|[Maximum Value of an Ordered Triplet I](./solutions/2873-maximum-value-of-an-ordered-triplet-i.js)|Easy|
 2874|[Maximum Value of an Ordered Triplet II](./solutions/2874-maximum-value-of-an-ordered-triplet-ii.js)|Medium|
 2894|[Divisible and Non-divisible Sums Difference](./solutions/2894-divisible-and-non-divisible-sums-difference.js)|Easy|
diff --git a/solutions/2870-minimum-number-of-operations-to-make-array-empty.js b/solutions/2870-minimum-number-of-operations-to-make-array-empty.js
new file mode 100644
index 00000000..c6376c70
--- /dev/null
+++ b/solutions/2870-minimum-number-of-operations-to-make-array-empty.js
@@ -0,0 +1,33 @@
+/**
+ * 2870. Minimum Number of Operations to Make Array Empty
+ * https://leetcode.com/problems/minimum-number-of-operations-to-make-array-empty/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed array nums consisting of positive integers.
+ *
+ * There are two types of operations that you can apply on the array any number of times:
+ * - Choose two elements with equal values and delete them from the array.
+ * - Choose three elements with equal values and delete them from the array.
+ *
+ * Return the minimum number of operations required to make the array empty, or -1 if it is
+ * not possible.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var minOperations = function(nums) {
+  const map = new Map();
+  for (const num of nums) {
+    map.set(num, (map.get(num) || 0) + 1);
+  }
+
+  let result = 0;
+  for (const count of map.values()) {
+    if (count === 1) return -1;
+    result += Math.ceil(count / 3);
+  }
+
+  return result;
+};

From 25276ec6d5d4155a2151abf117f8e33b1a70a92b Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 3 Jun 2025 23:51:44 -0500
Subject: [PATCH 405/571] Add solution #2871

---
 README.md                                     |  1 +
 ...-array-into-maximum-number-of-subarrays.js | 41 +++++++++++++++++++
 2 files changed, 42 insertions(+)
 create mode 100644 solutions/2871-split-array-into-maximum-number-of-subarrays.js

diff --git a/README.md b/README.md
index ce513391..387fcc63 100644
--- a/README.md
+++ b/README.md
@@ -2068,6 +2068,7 @@
 2865|[Beautiful Towers I](./solutions/2865-beautiful-towers-i.js)|Medium|
 2869|[Minimum Operations to Collect Elements](./solutions/2869-minimum-operations-to-collect-elements.js)|Easy|
 2870|[Minimum Number of Operations to Make Array Empty](./solutions/2870-minimum-number-of-operations-to-make-array-empty.js)|Medium|
+2871|[Split Array Into Maximum Number of Subarrays](./solutions/2871-split-array-into-maximum-number-of-subarrays.js)|Medium|
 2873|[Maximum Value of an Ordered Triplet I](./solutions/2873-maximum-value-of-an-ordered-triplet-i.js)|Easy|
 2874|[Maximum Value of an Ordered Triplet II](./solutions/2874-maximum-value-of-an-ordered-triplet-ii.js)|Medium|
 2894|[Divisible and Non-divisible Sums Difference](./solutions/2894-divisible-and-non-divisible-sums-difference.js)|Easy|
diff --git a/solutions/2871-split-array-into-maximum-number-of-subarrays.js b/solutions/2871-split-array-into-maximum-number-of-subarrays.js
new file mode 100644
index 00000000..ff3141ce
--- /dev/null
+++ b/solutions/2871-split-array-into-maximum-number-of-subarrays.js
@@ -0,0 +1,41 @@
+/**
+ * 2871. Split Array Into Maximum Number of Subarrays
+ * https://leetcode.com/problems/split-array-into-maximum-number-of-subarrays/
+ * Difficulty: Medium
+ *
+ * You are given an array nums consisting of non-negative integers.
+ *
+ * We define the score of subarray nums[l..r] such that l <= r as nums[l] AND nums[l + 1]
+ * AND ... AND nums[r] where AND is the bitwise AND operation.
+ *
+ * Consider splitting the array into one or more subarrays such that the following conditions
+ * are satisfied:
+ * - Each element of the array belongs to exactly one subarray.
+ * - The sum of scores of the subarrays is the minimum possible.
+ *
+ * Return the maximum number of subarrays in a split that satisfies the conditions above.
+ *
+ * A subarray is a contiguous part of an array.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var maxSubarrays = function(nums) {
+  const total = nums.reduce((acc, num) => acc & num, nums[0]);
+  if (total !== 0) return 1;
+
+  let result = 0;
+  let current = -1;
+
+  for (const num of nums) {
+    current = current === -1 ? num : current & num;
+    if (current === 0) {
+      result++;
+      current = -1;
+    }
+  }
+
+  return result;
+};

From 7fd1c2294f8fd0a0d66942132c5aa6cfbf21db57 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 3 Jun 2025 23:53:40 -0500
Subject: [PATCH 406/571] Add solution #2872

---
 README.md                                     |  1 +
 ...aximum-number-of-k-divisible-components.js | 51 +++++++++++++++++++
 2 files changed, 52 insertions(+)
 create mode 100644 solutions/2872-maximum-number-of-k-divisible-components.js

diff --git a/README.md b/README.md
index 387fcc63..ffab6e42 100644
--- a/README.md
+++ b/README.md
@@ -2069,6 +2069,7 @@
 2869|[Minimum Operations to Collect Elements](./solutions/2869-minimum-operations-to-collect-elements.js)|Easy|
 2870|[Minimum Number of Operations to Make Array Empty](./solutions/2870-minimum-number-of-operations-to-make-array-empty.js)|Medium|
 2871|[Split Array Into Maximum Number of Subarrays](./solutions/2871-split-array-into-maximum-number-of-subarrays.js)|Medium|
+2872|[Maximum Number of K-Divisible Components](./solutions/2872-maximum-number-of-k-divisible-components.js)|Hard|
 2873|[Maximum Value of an Ordered Triplet I](./solutions/2873-maximum-value-of-an-ordered-triplet-i.js)|Easy|
 2874|[Maximum Value of an Ordered Triplet II](./solutions/2874-maximum-value-of-an-ordered-triplet-ii.js)|Medium|
 2894|[Divisible and Non-divisible Sums Difference](./solutions/2894-divisible-and-non-divisible-sums-difference.js)|Easy|
diff --git a/solutions/2872-maximum-number-of-k-divisible-components.js b/solutions/2872-maximum-number-of-k-divisible-components.js
new file mode 100644
index 00000000..6ff1fdcd
--- /dev/null
+++ b/solutions/2872-maximum-number-of-k-divisible-components.js
@@ -0,0 +1,51 @@
+/**
+ * 2872. Maximum Number of K-Divisible Components
+ * https://leetcode.com/problems/maximum-number-of-k-divisible-components/
+ * Difficulty: Hard
+ *
+ * There is an undirected tree with n nodes labeled from 0 to n - 1. You are given the integer
+ * n and a 2D integer array edges of length n - 1, where edges[i] = [ai, bi] indicates that
+ * there is an edge between nodes ai and bi in the tree.
+ *
+ * You are also given a 0-indexed integer array values of length n, where values[i] is the value
+ * associated with the ith node, and an integer k.
+ *
+ * A valid split of the tree is obtained by removing any set of edges, possibly empty, from the
+ * tree such that the resulting components all have values that are divisible by k, where the
+ * value of a connected component is the sum of the values of its nodes.
+ *
+ * Return the maximum number of components in any valid split.
+ */
+
+/**
+ * @param {number} n
+ * @param {number[][]} edges
+ * @param {number[]} values
+ * @param {number} k
+ * @return {number}
+ */
+var maxKDivisibleComponents = function(n, edges, values, k) {
+  const graph = Array.from({ length: n }, () => []);
+  for (const [u, v] of edges) {
+    graph[u].push(v);
+    graph[v].push(u);
+  }
+
+  let result = 0;
+  dfs(0, -1);
+  return result;
+
+  function dfs(node, parent) {
+    let total = values[node];
+    for (const neighbor of graph[node]) {
+      if (neighbor !== parent) {
+        total += dfs(neighbor, node);
+      }
+    }
+    if (total % k === 0) {
+      result++;
+      return 0;
+    }
+    return total;
+  }
+};

From 0e262d36ad22be90ec7bdcdc4df7b969ed75bc94 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 4 Jun 2025 18:18:34 -0500
Subject: [PATCH 407/571] Add solution #2895

---
 README.md                                 |  1 +
 solutions/2895-minimum-processing-time.js | 33 +++++++++++++++++++++++
 2 files changed, 34 insertions(+)
 create mode 100644 solutions/2895-minimum-processing-time.js

diff --git a/README.md b/README.md
index ffab6e42..0ec9f1fa 100644
--- a/README.md
+++ b/README.md
@@ -2073,6 +2073,7 @@
 2873|[Maximum Value of an Ordered Triplet I](./solutions/2873-maximum-value-of-an-ordered-triplet-i.js)|Easy|
 2874|[Maximum Value of an Ordered Triplet II](./solutions/2874-maximum-value-of-an-ordered-triplet-ii.js)|Medium|
 2894|[Divisible and Non-divisible Sums Difference](./solutions/2894-divisible-and-non-divisible-sums-difference.js)|Easy|
+2895|[Minimum Processing Time](./solutions/2895-minimum-processing-time.js)|Medium|
 2900|[Longest Unequal Adjacent Groups Subsequence I](./solutions/2900-longest-unequal-adjacent-groups-subsequence-i.js)|Easy|
 2901|[Longest Unequal Adjacent Groups Subsequence II](./solutions/2901-longest-unequal-adjacent-groups-subsequence-ii.js)|Medium|
 2918|[Minimum Equal Sum of Two Arrays After Replacing Zeros](./solutions/2918-minimum-equal-sum-of-two-arrays-after-replacing-zeros.js)|Medium|
diff --git a/solutions/2895-minimum-processing-time.js b/solutions/2895-minimum-processing-time.js
new file mode 100644
index 00000000..c9ce8504
--- /dev/null
+++ b/solutions/2895-minimum-processing-time.js
@@ -0,0 +1,33 @@
+/**
+ * 2895. Minimum Processing Time
+ * https://leetcode.com/problems/minimum-processing-time/
+ * Difficulty: Medium
+ *
+ * You have a certain number of processors, each having 4 cores. The number of tasks to be executed
+ * is four times the number of processors. Each task must be assigned to a unique core, and each
+ * core can only be used once.
+ *
+ * You are given an array processorTime representing the time each processor becomes available and
+ * an array tasks representing how long each task takes to complete. Return the minimum time needed
+ * to complete all tasks.
+ */
+
+/**
+ * @param {number[]} processorTime
+ * @param {number[]} tasks
+ * @return {number}
+ */
+var minProcessingTime = function(processorTime, tasks) {
+  tasks.sort((a, b) => b - a);
+  processorTime.sort((a, b) => a - b);
+  let result = 0;
+
+  for (let i = 0; i < processorTime.length; i++) {
+    for (let j = 0; j < 4; j++) {
+      const taskIndex = i * 4 + j;
+      result = Math.max(result, processorTime[i] + tasks[taskIndex]);
+    }
+  }
+
+  return result;
+};

From 4a4bfbfebe824c4e92563f61ac67f030dda07485 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 4 Jun 2025 18:21:28 -0500
Subject: [PATCH 408/571] Add solution #2897

---
 README.md                                     |  1 +
 ...ons-on-array-to-maximize-sum-of-squares.js | 48 +++++++++++++++++++
 2 files changed, 49 insertions(+)
 create mode 100644 solutions/2897-apply-operations-on-array-to-maximize-sum-of-squares.js

diff --git a/README.md b/README.md
index 0ec9f1fa..af557e07 100644
--- a/README.md
+++ b/README.md
@@ -2074,6 +2074,7 @@
 2874|[Maximum Value of an Ordered Triplet II](./solutions/2874-maximum-value-of-an-ordered-triplet-ii.js)|Medium|
 2894|[Divisible and Non-divisible Sums Difference](./solutions/2894-divisible-and-non-divisible-sums-difference.js)|Easy|
 2895|[Minimum Processing Time](./solutions/2895-minimum-processing-time.js)|Medium|
+2897|[Apply Operations on Array to Maximize Sum of Squares](./solutions/2897-apply-operations-on-array-to-maximize-sum-of-squares.js)|Hard|
 2900|[Longest Unequal Adjacent Groups Subsequence I](./solutions/2900-longest-unequal-adjacent-groups-subsequence-i.js)|Easy|
 2901|[Longest Unequal Adjacent Groups Subsequence II](./solutions/2901-longest-unequal-adjacent-groups-subsequence-ii.js)|Medium|
 2918|[Minimum Equal Sum of Two Arrays After Replacing Zeros](./solutions/2918-minimum-equal-sum-of-two-arrays-after-replacing-zeros.js)|Medium|
diff --git a/solutions/2897-apply-operations-on-array-to-maximize-sum-of-squares.js b/solutions/2897-apply-operations-on-array-to-maximize-sum-of-squares.js
new file mode 100644
index 00000000..eab93b10
--- /dev/null
+++ b/solutions/2897-apply-operations-on-array-to-maximize-sum-of-squares.js
@@ -0,0 +1,48 @@
+/**
+ * 2897. Apply Operations on Array to Maximize Sum of Squares
+ * https://leetcode.com/problems/apply-operations-on-array-to-maximize-sum-of-squares/
+ * Difficulty: Hard
+ *
+ * You are given a 0-indexed integer array nums and a positive integer k.
+ *
+ * You can do the following operation on the array any number of times:
+ * - Choose any two distinct indices i and j and simultaneously update the values of nums[i]
+ *   to (nums[i] AND nums[j]) and nums[j] to (nums[i] OR nums[j]). Here, OR denotes the bitwise
+ *   OR operation, and AND denotes the bitwise AND operation.
+ *
+ * You have to choose k elements from the final array and calculate the sum of their squares.
+ *
+ * Return the maximum sum of squares you can achieve.
+ *
+ * Since the answer can be very large, return it modulo 109 + 7.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} k
+ * @return {number}
+ */
+var maxSum = function(nums, k) {
+  const MOD = 1e9 + 7;
+  const bitCounts = new Array(30).fill(0);
+
+  for (const num of nums) {
+    for (let i = 0; i < 30; i++) {
+      if (num & (1 << i)) bitCounts[i]++;
+    }
+  }
+
+  let result = 0;
+  for (let i = 0; i < k; i++) {
+    let current = 0;
+    for (let j = 29; j >= 0; j--) {
+      if (bitCounts[j] > 0) {
+        current |= (1 << j);
+        bitCounts[j]--;
+      }
+    }
+    result = (result + Number((BigInt(current) * BigInt(current)) % BigInt(MOD))) % MOD;
+  }
+
+  return result;
+};

From 20efb1b8c86d03cfa5c6228d23b6f31b9e878bd2 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 4 Jun 2025 18:22:47 -0500
Subject: [PATCH 409/571] Add solution #2899

---
 README.md                               |  1 +
 solutions/2899-last-visited-integers.js | 41 +++++++++++++++++++++++++
 2 files changed, 42 insertions(+)
 create mode 100644 solutions/2899-last-visited-integers.js

diff --git a/README.md b/README.md
index af557e07..1e04967e 100644
--- a/README.md
+++ b/README.md
@@ -2075,6 +2075,7 @@
 2894|[Divisible and Non-divisible Sums Difference](./solutions/2894-divisible-and-non-divisible-sums-difference.js)|Easy|
 2895|[Minimum Processing Time](./solutions/2895-minimum-processing-time.js)|Medium|
 2897|[Apply Operations on Array to Maximize Sum of Squares](./solutions/2897-apply-operations-on-array-to-maximize-sum-of-squares.js)|Hard|
+2899|[Last Visited Integers](./solutions/2899-last-visited-integers.js)|Easy|
 2900|[Longest Unequal Adjacent Groups Subsequence I](./solutions/2900-longest-unequal-adjacent-groups-subsequence-i.js)|Easy|
 2901|[Longest Unequal Adjacent Groups Subsequence II](./solutions/2901-longest-unequal-adjacent-groups-subsequence-ii.js)|Medium|
 2918|[Minimum Equal Sum of Two Arrays After Replacing Zeros](./solutions/2918-minimum-equal-sum-of-two-arrays-after-replacing-zeros.js)|Medium|
diff --git a/solutions/2899-last-visited-integers.js b/solutions/2899-last-visited-integers.js
new file mode 100644
index 00000000..0adcb661
--- /dev/null
+++ b/solutions/2899-last-visited-integers.js
@@ -0,0 +1,41 @@
+/**
+ * 2899. Last Visited Integers
+ * https://leetcode.com/problems/last-visited-integers/
+ * Difficulty: Easy
+ *
+ * Given an integer array nums where nums[i] is either a positive integer or -1. We need to find
+ * for each -1 the respective positive integer, which we call the last visited integer.
+ *
+ * To achieve this goal, let's define two empty arrays: seen and ans.
+ *
+ * Start iterating from the beginning of the array nums.
+ * - If a positive integer is encountered, prepend it to the front of seen.
+ * - If -1 is encountered, let k be the number of consecutive -1s seen so far (including the
+ *   current -1),
+ *   - If k is less than or equal to the length of seen, append the k-th element of seen to ans.
+ *   - If k is strictly greater than the length of seen, append -1 to ans.
+ *
+ * Return the array ans.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number[]}
+ */
+var lastVisitedIntegers = function(nums) {
+  const seen = [];
+  const result = [];
+  let consecutiveNegatives = 0;
+
+  for (const num of nums) {
+    if (num > 0) {
+      seen.unshift(num);
+      consecutiveNegatives = 0;
+    } else {
+      consecutiveNegatives++;
+      result.push(consecutiveNegatives <= seen.length ? seen[consecutiveNegatives - 1] : -1);
+    }
+  }
+
+  return result;
+};

From 0fd595f0ba7762dca406a6b6eb66725339260c55 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 4 Jun 2025 18:23:55 -0500
Subject: [PATCH 410/571] Add solution #2903

---
 README.md                                     |  1 +
 ...dices-with-index-and-value-difference-i.js | 36 +++++++++++++++++++
 2 files changed, 37 insertions(+)
 create mode 100644 solutions/2903-find-indices-with-index-and-value-difference-i.js

diff --git a/README.md b/README.md
index 1e04967e..8ee8a52e 100644
--- a/README.md
+++ b/README.md
@@ -2078,6 +2078,7 @@
 2899|[Last Visited Integers](./solutions/2899-last-visited-integers.js)|Easy|
 2900|[Longest Unequal Adjacent Groups Subsequence I](./solutions/2900-longest-unequal-adjacent-groups-subsequence-i.js)|Easy|
 2901|[Longest Unequal Adjacent Groups Subsequence II](./solutions/2901-longest-unequal-adjacent-groups-subsequence-ii.js)|Medium|
+2903|[Find Indices With Index and Value Difference I](./solutions/2903-find-indices-with-index-and-value-difference-i.js)|Easy|
 2918|[Minimum Equal Sum of Two Arrays After Replacing Zeros](./solutions/2918-minimum-equal-sum-of-two-arrays-after-replacing-zeros.js)|Medium|
 2929|[Distribute Candies Among Children II](./solutions/2929-distribute-candies-among-children-ii.js)|Medium|
 2942|[Find Words Containing Character](./solutions/2942-find-words-containing-character.js)|Easy|
diff --git a/solutions/2903-find-indices-with-index-and-value-difference-i.js b/solutions/2903-find-indices-with-index-and-value-difference-i.js
new file mode 100644
index 00000000..2ef70aeb
--- /dev/null
+++ b/solutions/2903-find-indices-with-index-and-value-difference-i.js
@@ -0,0 +1,36 @@
+/**
+ * 2903. Find Indices With Index and Value Difference I
+ * https://leetcode.com/problems/find-indices-with-index-and-value-difference-i/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed integer array nums having length n, an integer indexDifference,
+ * and an integer valueDifference.
+ *
+ * Your task is to find two indices i and j, both in the range [0, n - 1], that satisfy the
+ * following conditions:
+ * - abs(i - j) >= indexDifference, and
+ * - abs(nums[i] - nums[j]) >= valueDifference
+ *
+ * Return an integer array answer, where answer = [i, j] if there are two such indices, and
+ * answer = [-1, -1] otherwise. If there are multiple choices for the two indices, return
+ * any of them.
+ *
+ * Note: i and j may be equal.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} indexDifference
+ * @param {number} valueDifference
+ * @return {number[]}
+ */
+var findIndices = function(nums, indexDifference, valueDifference) {
+  for (let i = 0; i < nums.length; i++) {
+    for (let j = i; j < nums.length; j++) {
+      if (Math.abs(i - j) >= indexDifference && Math.abs(nums[i] - nums[j]) >= valueDifference) {
+        return [i, j];
+      }
+    }
+  }
+  return [-1, -1];
+};

From e2ecf35dfb3e2ffafb9eef589a1eb04d5ce95b9c Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 4 Jun 2025 18:25:04 -0500
Subject: [PATCH 411/571] Add solution #2908

---
 README.md                                     |  1 +
 ...2908-minimum-sum-of-mountain-triplets-i.js | 34 +++++++++++++++++++
 2 files changed, 35 insertions(+)
 create mode 100644 solutions/2908-minimum-sum-of-mountain-triplets-i.js

diff --git a/README.md b/README.md
index 8ee8a52e..e0e21bfe 100644
--- a/README.md
+++ b/README.md
@@ -2079,6 +2079,7 @@
 2900|[Longest Unequal Adjacent Groups Subsequence I](./solutions/2900-longest-unequal-adjacent-groups-subsequence-i.js)|Easy|
 2901|[Longest Unequal Adjacent Groups Subsequence II](./solutions/2901-longest-unequal-adjacent-groups-subsequence-ii.js)|Medium|
 2903|[Find Indices With Index and Value Difference I](./solutions/2903-find-indices-with-index-and-value-difference-i.js)|Easy|
+2908|[Minimum Sum of Mountain Triplets I](./solutions/2908-minimum-sum-of-mountain-triplets-i.js)|Easy|
 2918|[Minimum Equal Sum of Two Arrays After Replacing Zeros](./solutions/2918-minimum-equal-sum-of-two-arrays-after-replacing-zeros.js)|Medium|
 2929|[Distribute Candies Among Children II](./solutions/2929-distribute-candies-among-children-ii.js)|Medium|
 2942|[Find Words Containing Character](./solutions/2942-find-words-containing-character.js)|Easy|
diff --git a/solutions/2908-minimum-sum-of-mountain-triplets-i.js b/solutions/2908-minimum-sum-of-mountain-triplets-i.js
new file mode 100644
index 00000000..31f04c6a
--- /dev/null
+++ b/solutions/2908-minimum-sum-of-mountain-triplets-i.js
@@ -0,0 +1,34 @@
+/**
+ * 2908. Minimum Sum of Mountain Triplets I
+ * https://leetcode.com/problems/minimum-sum-of-mountain-triplets-i/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed array nums of integers.
+ *
+ * A triplet of indices (i, j, k) is a mountain if:
+ * - i < j < k
+ * - nums[i] < nums[j] and nums[k] < nums[j]
+ *
+ * Return the minimum possible sum of a mountain triplet of nums. If no such triplet exists,
+ * return -1.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var minimumSum = function(nums) {
+  let minSum = Infinity;
+
+  for (let i = 0; i < nums.length - 2; i++) {
+    for (let j = i + 1; j < nums.length - 1; j++) {
+      for (let k = j + 1; k < nums.length; k++) {
+        if (nums[i] < nums[j] && nums[k] < nums[j]) {
+          minSum = Math.min(minSum, nums[i] + nums[j] + nums[k]);
+        }
+      }
+    }
+  }
+
+  return minSum === Infinity ? -1 : minSum;
+};

From f9dc17e7bf01dfcc9f9f804cbecd5f433c314499 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 4 Jun 2025 21:34:45 -0500
Subject: [PATCH 412/571] Add solution #2909

---
 README.md                                     |  1 +
 ...909-minimum-sum-of-mountain-triplets-ii.js | 43 +++++++++++++++++++
 2 files changed, 44 insertions(+)
 create mode 100644 solutions/2909-minimum-sum-of-mountain-triplets-ii.js

diff --git a/README.md b/README.md
index e0e21bfe..b415e8f8 100644
--- a/README.md
+++ b/README.md
@@ -2080,6 +2080,7 @@
 2901|[Longest Unequal Adjacent Groups Subsequence II](./solutions/2901-longest-unequal-adjacent-groups-subsequence-ii.js)|Medium|
 2903|[Find Indices With Index and Value Difference I](./solutions/2903-find-indices-with-index-and-value-difference-i.js)|Easy|
 2908|[Minimum Sum of Mountain Triplets I](./solutions/2908-minimum-sum-of-mountain-triplets-i.js)|Easy|
+2909|[Minimum Sum of Mountain Triplets II](./solutions/2909-minimum-sum-of-mountain-triplets-ii.js)|Medium|
 2918|[Minimum Equal Sum of Two Arrays After Replacing Zeros](./solutions/2918-minimum-equal-sum-of-two-arrays-after-replacing-zeros.js)|Medium|
 2929|[Distribute Candies Among Children II](./solutions/2929-distribute-candies-among-children-ii.js)|Medium|
 2942|[Find Words Containing Character](./solutions/2942-find-words-containing-character.js)|Easy|
diff --git a/solutions/2909-minimum-sum-of-mountain-triplets-ii.js b/solutions/2909-minimum-sum-of-mountain-triplets-ii.js
new file mode 100644
index 00000000..21e15bd7
--- /dev/null
+++ b/solutions/2909-minimum-sum-of-mountain-triplets-ii.js
@@ -0,0 +1,43 @@
+/**
+ * 2909. Minimum Sum of Mountain Triplets II
+ * https://leetcode.com/problems/minimum-sum-of-mountain-triplets-ii/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed array nums of integers.
+ *
+ * A triplet of indices (i, j, k) is a mountain if:
+ * - i < j < k
+ * - nums[i] < nums[j] and nums[k] < nums[j]
+ *
+ * Return the minimum possible sum of a mountain triplet of nums. If no such triplet
+ * exists, return -1.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var minimumSum = function(nums) {
+  const n = nums.length;
+  const leftMin = new Array(n).fill(Infinity);
+  const rightMin = new Array(n).fill(Infinity);
+
+  leftMin[0] = nums[0];
+  for (let i = 1; i < n; i++) {
+    leftMin[i] = Math.min(leftMin[i - 1], nums[i]);
+  }
+
+  rightMin[n - 1] = nums[n - 1];
+  for (let i = n - 2; i >= 0; i--) {
+    rightMin[i] = Math.min(rightMin[i + 1], nums[i]);
+  }
+
+  let minSum = Infinity;
+  for (let j = 1; j < n - 1; j++) {
+    if (nums[j] > leftMin[j - 1] && nums[j] > rightMin[j + 1]) {
+      minSum = Math.min(minSum, leftMin[j - 1] + nums[j] + rightMin[j + 1]);
+    }
+  }
+
+  return minSum === Infinity ? -1 : minSum;
+};

From 94d3ad7dded5123770950797b2f39db18de346d6 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 4 Jun 2025 21:36:27 -0500
Subject: [PATCH 413/571] Add solution #2913

---
 README.md                                     |  1 +
 ...rrays-distinct-element-sum-of-squares-i.js | 34 +++++++++++++++++++
 2 files changed, 35 insertions(+)
 create mode 100644 solutions/2913-subarrays-distinct-element-sum-of-squares-i.js

diff --git a/README.md b/README.md
index b415e8f8..487c2060 100644
--- a/README.md
+++ b/README.md
@@ -2081,6 +2081,7 @@
 2903|[Find Indices With Index and Value Difference I](./solutions/2903-find-indices-with-index-and-value-difference-i.js)|Easy|
 2908|[Minimum Sum of Mountain Triplets I](./solutions/2908-minimum-sum-of-mountain-triplets-i.js)|Easy|
 2909|[Minimum Sum of Mountain Triplets II](./solutions/2909-minimum-sum-of-mountain-triplets-ii.js)|Medium|
+2913|[Subarrays Distinct Element Sum of Squares I](./solutions/2913-subarrays-distinct-element-sum-of-squares-i.js)|Easy|
 2918|[Minimum Equal Sum of Two Arrays After Replacing Zeros](./solutions/2918-minimum-equal-sum-of-two-arrays-after-replacing-zeros.js)|Medium|
 2929|[Distribute Candies Among Children II](./solutions/2929-distribute-candies-among-children-ii.js)|Medium|
 2942|[Find Words Containing Character](./solutions/2942-find-words-containing-character.js)|Easy|
diff --git a/solutions/2913-subarrays-distinct-element-sum-of-squares-i.js b/solutions/2913-subarrays-distinct-element-sum-of-squares-i.js
new file mode 100644
index 00000000..ebb8fdfb
--- /dev/null
+++ b/solutions/2913-subarrays-distinct-element-sum-of-squares-i.js
@@ -0,0 +1,34 @@
+/**
+ * 2913. Subarrays Distinct Element Sum of Squares I
+ * https://leetcode.com/problems/subarrays-distinct-element-sum-of-squares-i/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed integer array nums.
+ *
+ * The distinct count of a subarray of nums is defined as:
+ * - Let nums[i..j] be a subarray of nums consisting of all the indices from i to j such
+ *   that 0 <= i <= j < nums.length. Then the number of distinct values in nums[i..j] is
+ *   called the distinct count of nums[i..j].
+ *
+ * Return the sum of the squares of distinct counts of all subarrays of nums.
+ *
+ * A subarray is a contiguous non-empty sequence of elements within an array.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var sumCounts = function(nums) {
+  let result = 0;
+
+  for (let i = 0; i < nums.length; i++) {
+    const set = new Set();
+    for (let j = i; j < nums.length; j++) {
+      set.add(nums[j]);
+      result += set.size * set.size;
+    }
+  }
+
+  return result;
+};

From 076e09adcff4fb89295f495ceaae0b6d597ed55a Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 4 Jun 2025 21:38:19 -0500
Subject: [PATCH 414/571] Add solution #2914

---
 README.md                                     |  1 +
 ...changes-to-make-binary-string-beautiful.js | 29 +++++++++++++++++++
 2 files changed, 30 insertions(+)
 create mode 100644 solutions/2914-minimum-number-of-changes-to-make-binary-string-beautiful.js

diff --git a/README.md b/README.md
index 487c2060..a68f9335 100644
--- a/README.md
+++ b/README.md
@@ -2082,6 +2082,7 @@
 2908|[Minimum Sum of Mountain Triplets I](./solutions/2908-minimum-sum-of-mountain-triplets-i.js)|Easy|
 2909|[Minimum Sum of Mountain Triplets II](./solutions/2909-minimum-sum-of-mountain-triplets-ii.js)|Medium|
 2913|[Subarrays Distinct Element Sum of Squares I](./solutions/2913-subarrays-distinct-element-sum-of-squares-i.js)|Easy|
+2914|[Minimum Number of Changes to Make Binary String Beautiful](./solutions/2914-minimum-number-of-changes-to-make-binary-string-beautiful.js)|Medium|
 2918|[Minimum Equal Sum of Two Arrays After Replacing Zeros](./solutions/2918-minimum-equal-sum-of-two-arrays-after-replacing-zeros.js)|Medium|
 2929|[Distribute Candies Among Children II](./solutions/2929-distribute-candies-among-children-ii.js)|Medium|
 2942|[Find Words Containing Character](./solutions/2942-find-words-containing-character.js)|Easy|
diff --git a/solutions/2914-minimum-number-of-changes-to-make-binary-string-beautiful.js b/solutions/2914-minimum-number-of-changes-to-make-binary-string-beautiful.js
new file mode 100644
index 00000000..2c50bf70
--- /dev/null
+++ b/solutions/2914-minimum-number-of-changes-to-make-binary-string-beautiful.js
@@ -0,0 +1,29 @@
+/**
+ * 2914. Minimum Number of Changes to Make Binary String Beautiful
+ * https://leetcode.com/problems/minimum-number-of-changes-to-make-binary-string-beautiful/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed binary string s having an even length.
+ *
+ * A string is beautiful if it's possible to partition it into one or more substrings such that:
+ * - Each substring has an even length.
+ * - Each substring contains only 1's or only 0's.
+ *
+ * You can change any character in s to 0 or 1.
+ *
+ * Return the minimum number of changes required to make the string s beautiful.
+ */
+
+/**
+ * @param {string} s
+ * @return {number}
+ */
+var minChanges = function(s) {
+  let result = 0;
+
+  for (let i = 0; i < s.length; i += 2) {
+    if (s[i] !== s[i + 1]) result++;
+  }
+
+  return result;
+};

From 785ca3d81582540d3262071541a7aaf17d9e5c6a Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 4 Jun 2025 21:39:28 -0500
Subject: [PATCH 415/571] Add solution #2917

---
 README.md                                   |  1 +
 solutions/2917-find-the-k-or-of-an-array.js | 30 +++++++++++++++++++++
 2 files changed, 31 insertions(+)
 create mode 100644 solutions/2917-find-the-k-or-of-an-array.js

diff --git a/README.md b/README.md
index a68f9335..ec7e3a8b 100644
--- a/README.md
+++ b/README.md
@@ -2083,6 +2083,7 @@
 2909|[Minimum Sum of Mountain Triplets II](./solutions/2909-minimum-sum-of-mountain-triplets-ii.js)|Medium|
 2913|[Subarrays Distinct Element Sum of Squares I](./solutions/2913-subarrays-distinct-element-sum-of-squares-i.js)|Easy|
 2914|[Minimum Number of Changes to Make Binary String Beautiful](./solutions/2914-minimum-number-of-changes-to-make-binary-string-beautiful.js)|Medium|
+2917|[Find the K-or of an Array](./solutions/2917-find-the-k-or-of-an-array.js)|Easy|
 2918|[Minimum Equal Sum of Two Arrays After Replacing Zeros](./solutions/2918-minimum-equal-sum-of-two-arrays-after-replacing-zeros.js)|Medium|
 2929|[Distribute Candies Among Children II](./solutions/2929-distribute-candies-among-children-ii.js)|Medium|
 2942|[Find Words Containing Character](./solutions/2942-find-words-containing-character.js)|Easy|
diff --git a/solutions/2917-find-the-k-or-of-an-array.js b/solutions/2917-find-the-k-or-of-an-array.js
new file mode 100644
index 00000000..d37773ad
--- /dev/null
+++ b/solutions/2917-find-the-k-or-of-an-array.js
@@ -0,0 +1,30 @@
+/**
+ * 2917. Find the K-or of an Array
+ * https://leetcode.com/problems/find-the-k-or-of-an-array/
+ * Difficulty: Easy
+ *
+ * You are given an integer array nums, and an integer k. Let's introduce K-or operation
+ * by extending the standard bitwise OR. In K-or, a bit position in the result is set to
+ * 1 if at least k numbers in nums have a 1 in that position.
+ *
+ * Return the K-or of nums.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} k
+ * @return {number}
+ */
+var findKOr = function(nums, k) {
+  let result = 0;
+
+  for (let bit = 0; bit < 31; bit++) {
+    let count = 0;
+    for (const num of nums) {
+      if (num & (1 << bit)) count++;
+    }
+    if (count >= k) result |= (1 << bit);
+  }
+
+  return result;
+};

From 3c7061c2a2b0d6545bf7dbe12f32d514376eb3ff Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 4 Jun 2025 21:40:52 -0500
Subject: [PATCH 416/571] Add solution #2923

---
 README.md                         |  1 +
 solutions/2923-find-champion-i.js | 37 +++++++++++++++++++++++++++++++
 2 files changed, 38 insertions(+)
 create mode 100644 solutions/2923-find-champion-i.js

diff --git a/README.md b/README.md
index ec7e3a8b..9ff13905 100644
--- a/README.md
+++ b/README.md
@@ -2085,6 +2085,7 @@
 2914|[Minimum Number of Changes to Make Binary String Beautiful](./solutions/2914-minimum-number-of-changes-to-make-binary-string-beautiful.js)|Medium|
 2917|[Find the K-or of an Array](./solutions/2917-find-the-k-or-of-an-array.js)|Easy|
 2918|[Minimum Equal Sum of Two Arrays After Replacing Zeros](./solutions/2918-minimum-equal-sum-of-two-arrays-after-replacing-zeros.js)|Medium|
+2923|[Find Champion I](./solutions/2923-find-champion-i.js)|Easy|
 2929|[Distribute Candies Among Children II](./solutions/2929-distribute-candies-among-children-ii.js)|Medium|
 2942|[Find Words Containing Character](./solutions/2942-find-words-containing-character.js)|Easy|
 2948|[Make Lexicographically Smallest Array by Swapping Elements](./solutions/2948-make-lexicographically-smallest-array-by-swapping-elements.js)|Medium|
diff --git a/solutions/2923-find-champion-i.js b/solutions/2923-find-champion-i.js
new file mode 100644
index 00000000..c641cd07
--- /dev/null
+++ b/solutions/2923-find-champion-i.js
@@ -0,0 +1,37 @@
+/**
+ * 2923. Find Champion I
+ * https://leetcode.com/problems/find-champion-i/
+ * Difficulty: Easy
+ *
+ * There are n teams numbered from 0 to n - 1 in a tournament.
+ *
+ * Given a 0-indexed 2D boolean matrix grid of size n * n. For all i, j that 0 <= i, j <= n - 1
+ * and i != j team i is stronger than team j if grid[i][j] == 1, otherwise, team j is stronger
+ * than team i.
+ *
+ * Team a will be the champion of the tournament if there is no team b that is stronger than
+ * team a.
+ *
+ * Return the team that will be the champion of the tournament.
+ */
+
+/**
+ * @param {number[][]} grid
+ * @return {number}
+ */
+var findChampion = function(grid) {
+  const n = grid.length;
+
+  for (let i = 0; i < n; i++) {
+    let isChampion = true;
+    for (let j = 0; j < n; j++) {
+      if (i !== j && grid[j][i] === 1) {
+        isChampion = false;
+        break;
+      }
+    }
+    if (isChampion) return i;
+  }
+
+  return -1;
+};

From a1040d25601c0bae735f94dde0b7df66b4a53493 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 4 Jun 2025 22:03:49 -0500
Subject: [PATCH 417/571] Add solution #2924

---
 README.md                          |  1 +
 solutions/2924-find-champion-ii.js | 47 ++++++++++++++++++++++++++++++
 2 files changed, 48 insertions(+)
 create mode 100644 solutions/2924-find-champion-ii.js

diff --git a/README.md b/README.md
index 9ff13905..ebe62fea 100644
--- a/README.md
+++ b/README.md
@@ -2086,6 +2086,7 @@
 2917|[Find the K-or of an Array](./solutions/2917-find-the-k-or-of-an-array.js)|Easy|
 2918|[Minimum Equal Sum of Two Arrays After Replacing Zeros](./solutions/2918-minimum-equal-sum-of-two-arrays-after-replacing-zeros.js)|Medium|
 2923|[Find Champion I](./solutions/2923-find-champion-i.js)|Easy|
+2924|[Find Champion II](./solutions/2924-find-champion-ii.js)|Medium|
 2929|[Distribute Candies Among Children II](./solutions/2929-distribute-candies-among-children-ii.js)|Medium|
 2942|[Find Words Containing Character](./solutions/2942-find-words-containing-character.js)|Easy|
 2948|[Make Lexicographically Smallest Array by Swapping Elements](./solutions/2948-make-lexicographically-smallest-array-by-swapping-elements.js)|Medium|
diff --git a/solutions/2924-find-champion-ii.js b/solutions/2924-find-champion-ii.js
new file mode 100644
index 00000000..a475f55d
--- /dev/null
+++ b/solutions/2924-find-champion-ii.js
@@ -0,0 +1,47 @@
+/**
+ * 2924. Find Champion II
+ * https://leetcode.com/problems/find-champion-ii/
+ * Difficulty: Medium
+ *
+ * There are n teams numbered from 0 to n - 1 in a tournament; each team is also a node in a DAG.
+ *
+ * You are given the integer n and a 0-indexed 2D integer array edges of length m representing the
+ * DAG, where edges[i] = [ui, vi] indicates that there is a directed edge from team ui to team vi
+ * in the graph.
+ *
+ * A directed edge from a to b in the graph means that team a is stronger than team b and team b
+ * is weaker than team a.
+ *
+ * Team a will be the champion of the tournament if there is no team b that is stronger than team a.
+ *
+ * Return the team that will be the champion of the tournament if there is a unique champion,
+ * otherwise, return -1.
+ *
+ * Notes:
+ * - A cycle is a series of nodes a1, a2, ..., an, an+1 such that node a1 is the same node as node
+ *   an+1, the nodes a1, a2, ..., an are distinct, and there is a directed edge from the node ai
+ *   to node ai+1 for every i in the range [1, n].
+ * - A DAG is a directed graph that does not have any cycle.
+ */
+
+/**
+ * @param {number} n
+ * @param {number[][]} edges
+ * @return {number}
+ */
+var findChampion = function(n, edges) {
+  const inDegree = new Array(n).fill(0);
+
+  for (const [, v] of edges) {
+    inDegree[v]++;
+  }
+  let champion = -1;
+  for (let i = 0; i < n; i++) {
+    if (inDegree[i] === 0) {
+      if (champion !== -1) return -1;
+      champion = i;
+    }
+  }
+
+  return champion;
+};

From a23ef9ea1cdd9afedfe15ed5e98b0c69d7accea9 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 4 Jun 2025 22:14:25 -0500
Subject: [PATCH 418/571] Add solution #2925

---
 README.md                                     |  1 +
 ...ore-after-applying-operations-on-a-tree.js | 58 +++++++++++++++++++
 2 files changed, 59 insertions(+)
 create mode 100644 solutions/2925-maximum-score-after-applying-operations-on-a-tree.js

diff --git a/README.md b/README.md
index ebe62fea..3ebde2b9 100644
--- a/README.md
+++ b/README.md
@@ -2087,6 +2087,7 @@
 2918|[Minimum Equal Sum of Two Arrays After Replacing Zeros](./solutions/2918-minimum-equal-sum-of-two-arrays-after-replacing-zeros.js)|Medium|
 2923|[Find Champion I](./solutions/2923-find-champion-i.js)|Easy|
 2924|[Find Champion II](./solutions/2924-find-champion-ii.js)|Medium|
+2925|[Maximum Score After Applying Operations on a Tree](./solutions/2925-maximum-score-after-applying-operations-on-a-tree.js)|Medium|
 2929|[Distribute Candies Among Children II](./solutions/2929-distribute-candies-among-children-ii.js)|Medium|
 2942|[Find Words Containing Character](./solutions/2942-find-words-containing-character.js)|Easy|
 2948|[Make Lexicographically Smallest Array by Swapping Elements](./solutions/2948-make-lexicographically-smallest-array-by-swapping-elements.js)|Medium|
diff --git a/solutions/2925-maximum-score-after-applying-operations-on-a-tree.js b/solutions/2925-maximum-score-after-applying-operations-on-a-tree.js
new file mode 100644
index 00000000..55cb4532
--- /dev/null
+++ b/solutions/2925-maximum-score-after-applying-operations-on-a-tree.js
@@ -0,0 +1,58 @@
+/**
+ * 2925. Maximum Score After Applying Operations on a Tree
+ * https://leetcode.com/problems/maximum-score-after-applying-operations-on-a-tree/
+ * Difficulty: Medium
+ *
+ * There is an undirected tree with n nodes labeled from 0 to n - 1, and rooted at node 0. You are
+ * given a 2D integer array edges of length n - 1, where edges[i] = [ai, bi] indicates that there
+ * is an edge between nodes ai and bi in the tree.
+ *
+ * You are also given a 0-indexed integer array values of length n, where values[i] is the value
+ * associated with the ith node.
+ *
+ * You start with a score of 0. In one operation, you can:
+ * - Pick any node i.
+ * - Add values[i] to your score.
+ * - Set values[i] to 0.
+ *
+ * A tree is healthy if the sum of values on the path from the root to any leaf node is different
+ * than zero.
+ *
+ * Return the maximum score you can obtain after performing these operations on the tree any
+ * number of times so that it remains healthy.
+ */
+
+/**
+ * @param {number[][]} edges
+ * @param {number[]} values
+ * @return {number}
+ */
+var maximumScoreAfterOperations = function(edges, values) {
+  const n = values.length;
+  const graph = new Array(n).fill().map(() => []);
+
+  for (const [u, v] of edges) {
+    graph[u].push(v);
+    graph[v].push(u);
+  }
+
+  const totalSum = values.reduce((sum, val) => sum + val, 0);
+  const minToKeep = dfs(0, -1);
+
+  return totalSum - minToKeep;
+
+  function dfs(node, parent) {
+    const children = graph[node].filter(child => child !== parent);
+
+    if (children.length === 0) {
+      return values[node];
+    }
+
+    let childrenSum = 0;
+    for (const child of children) {
+      childrenSum += dfs(child, node);
+    }
+
+    return Math.min(values[node], childrenSum);
+  }
+};

From b16149ddb0b4ad433e746ac8b984984903073e4b Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 4 Jun 2025 22:15:41 -0500
Subject: [PATCH 419/571] Add solution #2928

---
 README.md                                     |  1 +
 ...928-distribute-candies-among-children-i.js | 28 +++++++++++++++++++
 2 files changed, 29 insertions(+)
 create mode 100644 solutions/2928-distribute-candies-among-children-i.js

diff --git a/README.md b/README.md
index 3ebde2b9..1d736caf 100644
--- a/README.md
+++ b/README.md
@@ -2088,6 +2088,7 @@
 2923|[Find Champion I](./solutions/2923-find-champion-i.js)|Easy|
 2924|[Find Champion II](./solutions/2924-find-champion-ii.js)|Medium|
 2925|[Maximum Score After Applying Operations on a Tree](./solutions/2925-maximum-score-after-applying-operations-on-a-tree.js)|Medium|
+2928|[Distribute Candies Among Children I](./solutions/2928-distribute-candies-among-children-i.js)|Easy|
 2929|[Distribute Candies Among Children II](./solutions/2929-distribute-candies-among-children-ii.js)|Medium|
 2942|[Find Words Containing Character](./solutions/2942-find-words-containing-character.js)|Easy|
 2948|[Make Lexicographically Smallest Array by Swapping Elements](./solutions/2948-make-lexicographically-smallest-array-by-swapping-elements.js)|Medium|
diff --git a/solutions/2928-distribute-candies-among-children-i.js b/solutions/2928-distribute-candies-among-children-i.js
new file mode 100644
index 00000000..fe0c287d
--- /dev/null
+++ b/solutions/2928-distribute-candies-among-children-i.js
@@ -0,0 +1,28 @@
+/**
+ * 2928. Distribute Candies Among Children I
+ * https://leetcode.com/problems/distribute-candies-among-children-i/
+ * Difficulty: Easy
+ *
+ * You are given two positive integers n and limit.
+ *
+ * Return the total number of ways to distribute n candies among 3 children such that no child
+ * gets more than limit candies.
+ */
+
+/**
+ * @param {number} n
+ * @param {number} limit
+ * @return {number}
+ */
+var distributeCandies = function(n, limit) {
+  let result = 0;
+
+  for (let i = 0; i <= Math.min(n, limit); i++) {
+    for (let j = 0; j <= Math.min(n - i, limit); j++) {
+      const k = n - i - j;
+      if (k >= 0 && k <= limit) result++;
+    }
+  }
+
+  return result;
+};

From 135555edbc4e9a12a2aebfc3f85fb3fd19f9886c Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 4 Jun 2025 22:38:33 -0500
Subject: [PATCH 420/571] Add solution #2932

---
 README.md                                   |  1 +
 solutions/2932-maximum-strong-pair-xor-i.js | 37 +++++++++++++++++++++
 2 files changed, 38 insertions(+)
 create mode 100644 solutions/2932-maximum-strong-pair-xor-i.js

diff --git a/README.md b/README.md
index 1d736caf..ec5f205c 100644
--- a/README.md
+++ b/README.md
@@ -2090,6 +2090,7 @@
 2925|[Maximum Score After Applying Operations on a Tree](./solutions/2925-maximum-score-after-applying-operations-on-a-tree.js)|Medium|
 2928|[Distribute Candies Among Children I](./solutions/2928-distribute-candies-among-children-i.js)|Easy|
 2929|[Distribute Candies Among Children II](./solutions/2929-distribute-candies-among-children-ii.js)|Medium|
+2932|[Maximum Strong Pair XOR I](./solutions/2932-maximum-strong-pair-xor-i.js)|Easy|
 2942|[Find Words Containing Character](./solutions/2942-find-words-containing-character.js)|Easy|
 2948|[Make Lexicographically Smallest Array by Swapping Elements](./solutions/2948-make-lexicographically-smallest-array-by-swapping-elements.js)|Medium|
 2962|[Count Subarrays Where Max Element Appears at Least K Times](./solutions/2962-count-subarrays-where-max-element-appears-at-least-k-times.js)|Medium|
diff --git a/solutions/2932-maximum-strong-pair-xor-i.js b/solutions/2932-maximum-strong-pair-xor-i.js
new file mode 100644
index 00000000..67477b17
--- /dev/null
+++ b/solutions/2932-maximum-strong-pair-xor-i.js
@@ -0,0 +1,37 @@
+/**
+ * 2932. Maximum Strong Pair XOR I
+ * https://leetcode.com/problems/maximum-strong-pair-xor-i/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed integer array nums. A pair of integers x and y is called a strong pair
+ * if it satisfies the condition:
+ * - |x - y| <= min(x, y)
+ *
+ * You need to select two integers from nums such that they form a strong pair and their bitwise
+ * XOR is the maximum among all strong pairs in the array.
+ *
+ * Return the maximum XOR value out of all possible strong pairs in the array nums.
+ *
+ * Note that you can pick the same integer twice to form a pair.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var maximumStrongPairXor = function(nums) {
+  let result = 0;
+  nums.sort((a, b) => a - b);
+
+  for (let i = 0; i < nums.length; i++) {
+    for (let j = i; j < nums.length; j++) {
+      if (nums[j] - nums[i] <= Math.min(nums[i], nums[j])) {
+        result = Math.max(result, nums[i] ^ nums[j]);
+      } else {
+        break;
+      }
+    }
+  }
+
+  return result;
+};

From 46b5b3ceb30c1949880a96f5222c75fa89cac5e9 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 4 Jun 2025 22:41:54 -0500
Subject: [PATCH 421/571] Add solution #2933

---
 README.md                               |  1 +
 solutions/2933-high-access-employees.js | 54 +++++++++++++++++++++++++
 2 files changed, 55 insertions(+)
 create mode 100644 solutions/2933-high-access-employees.js

diff --git a/README.md b/README.md
index ec5f205c..3a9cb8c5 100644
--- a/README.md
+++ b/README.md
@@ -2091,6 +2091,7 @@
 2928|[Distribute Candies Among Children I](./solutions/2928-distribute-candies-among-children-i.js)|Easy|
 2929|[Distribute Candies Among Children II](./solutions/2929-distribute-candies-among-children-ii.js)|Medium|
 2932|[Maximum Strong Pair XOR I](./solutions/2932-maximum-strong-pair-xor-i.js)|Easy|
+2933|[High-Access Employees](./solutions/2933-high-access-employees.js)|Medium|
 2942|[Find Words Containing Character](./solutions/2942-find-words-containing-character.js)|Easy|
 2948|[Make Lexicographically Smallest Array by Swapping Elements](./solutions/2948-make-lexicographically-smallest-array-by-swapping-elements.js)|Medium|
 2962|[Count Subarrays Where Max Element Appears at Least K Times](./solutions/2962-count-subarrays-where-max-element-appears-at-least-k-times.js)|Medium|
diff --git a/solutions/2933-high-access-employees.js b/solutions/2933-high-access-employees.js
new file mode 100644
index 00000000..98c9a73f
--- /dev/null
+++ b/solutions/2933-high-access-employees.js
@@ -0,0 +1,54 @@
+/**
+ * 2933. High-Access Employees
+ * https://leetcode.com/problems/high-access-employees/
+ * Difficulty: Medium
+ *
+ * You are given a 2D 0-indexed array of strings, accessTimes, with size n. For each i where
+ * 0 <= i <= n - 1, accessTimes[i][0] represents the name of an employee, and accessTimes[i][1]
+ * represents the access time of that employee. All entries in accessTimes are within the same day.
+ *
+ * The access time is represented as four digits using a 24-hour time format, for example, "0800"
+ * or "2250".
+ *
+ * An employee is said to be high-access if he has accessed the system three or more times within
+ * a one-hour period.
+ *
+ * Times with exactly one hour of difference are not considered part of the same one-hour period.
+ * For example, "0815" and "0915" are not part of the same one-hour period.
+ *
+ * Access times at the start and end of the day are not counted within the same one-hour period.
+ * For example, "0005" and "2350" are not part of the same one-hour period.
+ *
+ * Return a list that contains the names of high-access employees with any order you want.
+ */
+
+/**
+ * @param {string[][]} accessTimes
+ * @return {string[]}
+ */
+var findHighAccessEmployees = function(accessTimes) {
+  const employeeAccess = new Map();
+
+  for (const [name, time] of accessTimes) {
+    const minutes = parseInt(time.slice(0, 2)) * 60 + parseInt(time.slice(2));
+    if (!employeeAccess.has(name)) {
+      employeeAccess.set(name, []);
+    }
+    employeeAccess.get(name).push(minutes);
+  }
+
+  const result = [];
+  for (const [name, times] of employeeAccess) {
+    times.sort((a, b) => a - b);
+    if (times.length >= 3) {
+      for (let i = 0; i <= times.length - 3; i++) {
+        if (times[i + 2] - times[i] < 60) {
+          result.push(name);
+          break;
+        }
+      }
+    }
+  }
+
+  return result;
+};

From e2d9e8baed1cbad586e2fd26760630c81b8889ae Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 4 Jun 2025 23:43:29 -0500
Subject: [PATCH 422/571] Add solution #2934

---
 README.md                                     |  1 +
 ...ons-to-maximize-last-elements-in-arrays.js | 57 +++++++++++++++++++
 2 files changed, 58 insertions(+)
 create mode 100644 solutions/2934-minimum-operations-to-maximize-last-elements-in-arrays.js

diff --git a/README.md b/README.md
index 3a9cb8c5..cbe21d44 100644
--- a/README.md
+++ b/README.md
@@ -2092,6 +2092,7 @@
 2929|[Distribute Candies Among Children II](./solutions/2929-distribute-candies-among-children-ii.js)|Medium|
 2932|[Maximum Strong Pair XOR I](./solutions/2932-maximum-strong-pair-xor-i.js)|Easy|
 2933|[High-Access Employees](./solutions/2933-high-access-employees.js)|Medium|
+2934|[Minimum Operations to Maximize Last Elements in Arrays](./solutions/2934-minimum-operations-to-maximize-last-elements-in-arrays.js)|Medium|
 2942|[Find Words Containing Character](./solutions/2942-find-words-containing-character.js)|Easy|
 2948|[Make Lexicographically Smallest Array by Swapping Elements](./solutions/2948-make-lexicographically-smallest-array-by-swapping-elements.js)|Medium|
 2962|[Count Subarrays Where Max Element Appears at Least K Times](./solutions/2962-count-subarrays-where-max-element-appears-at-least-k-times.js)|Medium|
diff --git a/solutions/2934-minimum-operations-to-maximize-last-elements-in-arrays.js b/solutions/2934-minimum-operations-to-maximize-last-elements-in-arrays.js
new file mode 100644
index 00000000..c2803a60
--- /dev/null
+++ b/solutions/2934-minimum-operations-to-maximize-last-elements-in-arrays.js
@@ -0,0 +1,57 @@
+/**
+ * 2934. Minimum Operations to Maximize Last Elements in Arrays
+ * https://leetcode.com/problems/minimum-operations-to-maximize-last-elements-in-arrays/
+ * Difficulty: Medium
+ *
+ * You are given two 0-indexed integer arrays, nums1 and nums2, both having length n.
+ *
+ * You are allowed to perform a series of operations (possibly none).
+ *
+ * In an operation, you select an index i in the range [0, n - 1] and swap the values of
+ * nums1[i] and nums2[i].
+ *
+ * Your task is to find the minimum number of operations required to satisfy the following
+ * conditions:
+ * - nums1[n - 1] is equal to the maximum value among all elements of nums1, i.e.,
+ *   nums1[n - 1] = max(nums1[0], nums1[1], ..., nums1[n - 1]).
+ * - nums2[n - 1] is equal to the maximum value among all elements of nums2, i.e.,
+ *   nums2[n - 1] = max(nums2[0], nums2[1], ..., nums2[n - 1]).
+ *
+ * Return an integer denoting the minimum number of operations needed to meet both conditions,
+ * or -1 if it is impossible to satisfy both conditions.
+ */
+
+/**
+ * @param {number[]} nums1
+ * @param {number[]} nums2
+ * @return {number}
+ */
+var minOperations = function(nums1, nums2) {
+  const n = nums1.length;
+  const last1 = nums1[n - 1];
+  const last2 = nums2[n - 1];
+
+  let swapsNoChange = 0;
+  let swapsChange = 0;
+
+  for (let i = 0; i < n - 1; i++) {
+    if (nums1[i] > last1 || nums2[i] > last2) {
+      if (nums2[i] > last1 || nums1[i] > last2) {
+        return -1;
+      }
+      swapsNoChange++;
+    }
+    if (nums1[i] > last2 || nums2[i] > last1) {
+      if (nums2[i] > last2 || nums1[i] > last1) {
+        return -1;
+      }
+      swapsChange++;
+    }
+  }
+
+  if (last1 !== last2) {
+    swapsChange++;
+  }
+
+  return Math.min(swapsNoChange, swapsChange);
+};

From a7a8ce14f2851b3e7cf73d59c1f3e65bf816013a Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 4 Jun 2025 23:44:27 -0500
Subject: [PATCH 423/571] Add solution #2937

---
 README.md                                  |  1 +
 solutions/2937-make-three-strings-equal.js | 35 ++++++++++++++++++++++
 2 files changed, 36 insertions(+)
 create mode 100644 solutions/2937-make-three-strings-equal.js

diff --git a/README.md b/README.md
index cbe21d44..1b09c37c 100644
--- a/README.md
+++ b/README.md
@@ -2093,6 +2093,7 @@
 2932|[Maximum Strong Pair XOR I](./solutions/2932-maximum-strong-pair-xor-i.js)|Easy|
 2933|[High-Access Employees](./solutions/2933-high-access-employees.js)|Medium|
 2934|[Minimum Operations to Maximize Last Elements in Arrays](./solutions/2934-minimum-operations-to-maximize-last-elements-in-arrays.js)|Medium|
+2937|[Make Three Strings Equal](./solutions/2937-make-three-strings-equal.js)|Easy|
 2942|[Find Words Containing Character](./solutions/2942-find-words-containing-character.js)|Easy|
 2948|[Make Lexicographically Smallest Array by Swapping Elements](./solutions/2948-make-lexicographically-smallest-array-by-swapping-elements.js)|Medium|
 2962|[Count Subarrays Where Max Element Appears at Least K Times](./solutions/2962-count-subarrays-where-max-element-appears-at-least-k-times.js)|Medium|
diff --git a/solutions/2937-make-three-strings-equal.js b/solutions/2937-make-three-strings-equal.js
new file mode 100644
index 00000000..c7dad334
--- /dev/null
+++ b/solutions/2937-make-three-strings-equal.js
@@ -0,0 +1,35 @@
+/**
+ * 2937. Make Three Strings Equal
+ * https://leetcode.com/problems/make-three-strings-equal/
+ * Difficulty: Easy
+ *
+ * You are given three strings: s1, s2, and s3. In one operation you can choose one of these
+ * strings and delete its rightmost character. Note that you cannot completely empty a string.
+ *
+ * Return the minimum number of operations required to make the strings equal. If it is
+ * impossible to make them equal, return -1.
+ */
+
+/**
+ * @param {string} s1
+ * @param {string} s2
+ * @param {string} s3
+ * @return {number}
+ */
+var findMinimumOperations = function(s1, s2, s3) {
+  const minLength = Math.min(s1.length, s2.length, s3.length);
+
+  let commonPrefixLength = 0;
+  for (let i = 0; i < minLength; i++) {
+    if (s1[i] !== s2[i] || s2[i] !== s3[i]) {
+      break;
+    }
+    commonPrefixLength++;
+  }
+
+  if (commonPrefixLength === 0) {
+    return -1;
+  }
+
+  return s1.length + s2.length + s3.length - 3 * commonPrefixLength;
+};

From fd57e606f75d48643c535fde44df856e853c4ad2 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 4 Jun 2025 23:47:40 -0500
Subject: [PATCH 424/571] Add solution #2938

---
 README.md                                     |  1 +
 .../2938-separate-black-and-white-balls.js    | 33 +++++++++++++++++++
 2 files changed, 34 insertions(+)
 create mode 100644 solutions/2938-separate-black-and-white-balls.js

diff --git a/README.md b/README.md
index 1b09c37c..0df8750c 100644
--- a/README.md
+++ b/README.md
@@ -2094,6 +2094,7 @@
 2933|[High-Access Employees](./solutions/2933-high-access-employees.js)|Medium|
 2934|[Minimum Operations to Maximize Last Elements in Arrays](./solutions/2934-minimum-operations-to-maximize-last-elements-in-arrays.js)|Medium|
 2937|[Make Three Strings Equal](./solutions/2937-make-three-strings-equal.js)|Easy|
+2938|[Separate Black and White Balls](./solutions/2938-separate-black-and-white-balls.js)|Medium|
 2942|[Find Words Containing Character](./solutions/2942-find-words-containing-character.js)|Easy|
 2948|[Make Lexicographically Smallest Array by Swapping Elements](./solutions/2948-make-lexicographically-smallest-array-by-swapping-elements.js)|Medium|
 2962|[Count Subarrays Where Max Element Appears at Least K Times](./solutions/2962-count-subarrays-where-max-element-appears-at-least-k-times.js)|Medium|
diff --git a/solutions/2938-separate-black-and-white-balls.js b/solutions/2938-separate-black-and-white-balls.js
new file mode 100644
index 00000000..cd8d022d
--- /dev/null
+++ b/solutions/2938-separate-black-and-white-balls.js
@@ -0,0 +1,33 @@
+/**
+ * 2938. Separate Black and White Balls
+ * https://leetcode.com/problems/separate-black-and-white-balls/
+ * Difficulty: Medium
+ *
+ * There are n balls on a table, each ball has a color black or white.
+ *
+ * You are given a 0-indexed binary string s of length n, where 1 and 0 represent black and white
+ * balls, respectively.
+ *
+ * In each step, you can choose two adjacent balls and swap them.
+ *
+ * Return the minimum number of steps to group all the black balls to the right and all the white
+ * balls to the left.
+ */
+
+/**
+ * @param {string} s
+ * @return {number}
+ */
+var minimumSteps = function(s) {
+  let result = 0;
+  let whiteCount = 0;
+
+  for (let i = 0; i < s.length; i++) {
+    if (s[i] === '0') {
+      result += i - whiteCount;
+      whiteCount++;
+    }
+  }
+
+  return result;
+};

From fbb835747a462266fd58c471b672a4e1368019ae Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 4 Jun 2025 23:48:39 -0500
Subject: [PATCH 425/571] Add solution #2946

---
 README.md                                     |  1 +
 ...6-matrix-similarity-after-cyclic-shifts.js | 35 +++++++++++++++++++
 2 files changed, 36 insertions(+)
 create mode 100644 solutions/2946-matrix-similarity-after-cyclic-shifts.js

diff --git a/README.md b/README.md
index 0df8750c..272aa5f7 100644
--- a/README.md
+++ b/README.md
@@ -2096,6 +2096,7 @@
 2937|[Make Three Strings Equal](./solutions/2937-make-three-strings-equal.js)|Easy|
 2938|[Separate Black and White Balls](./solutions/2938-separate-black-and-white-balls.js)|Medium|
 2942|[Find Words Containing Character](./solutions/2942-find-words-containing-character.js)|Easy|
+2946|[Matrix Similarity After Cyclic Shifts](./solutions/2946-matrix-similarity-after-cyclic-shifts.js)|Easy|
 2948|[Make Lexicographically Smallest Array by Swapping Elements](./solutions/2948-make-lexicographically-smallest-array-by-swapping-elements.js)|Medium|
 2962|[Count Subarrays Where Max Element Appears at Least K Times](./solutions/2962-count-subarrays-where-max-element-appears-at-least-k-times.js)|Medium|
 2965|[Find Missing and Repeated Values](./solutions/2965-find-missing-and-repeated-values.js)|Easy|
diff --git a/solutions/2946-matrix-similarity-after-cyclic-shifts.js b/solutions/2946-matrix-similarity-after-cyclic-shifts.js
new file mode 100644
index 00000000..4d93251f
--- /dev/null
+++ b/solutions/2946-matrix-similarity-after-cyclic-shifts.js
@@ -0,0 +1,35 @@
+/**
+ * 2946. Matrix Similarity After Cyclic Shifts
+ * https://leetcode.com/problems/matrix-similarity-after-cyclic-shifts/
+ * Difficulty: Easy
+ *
+ * You are given an m x n integer matrix mat and an integer k. The matrix rows are 0-indexed.
+ *
+ * The following proccess happens k times:
+ * - Even-indexed rows (0, 2, 4, ...) are cyclically shifted to the left.
+ * - Odd-indexed rows (1, 3, 5, ...) are cyclically shifted to the right.
+ *
+ * Return true if the final modified matrix after k steps is identical to the original matrix,
+ * and false otherwise.
+ */
+
+/**
+ * @param {number[][]} mat
+ * @param {number} k
+ * @return {boolean}
+ */
+var areSimilar = function(mat, k) {
+  const m = mat.length;
+  const n = mat[0].length;
+
+  for (let i = 0; i < m; i++) {
+    for (let j = 0; j < n; j++) {
+      const shift = i % 2 === 0 ? (j - k % n + n) % n : (j + k % n) % n;
+      if (mat[i][j] !== mat[i][shift]) {
+        return false;
+      }
+    }
+  }
+
+  return true;
+};

From 62eac7e6e59f44ae872922816c1c075e16294094 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 4 Jun 2025 23:49:55 -0500
Subject: [PATCH 426/571] Add solution #2947

---
 README.md                                     |  1 +
 .../2947-count-beautiful-substrings-i.js      | 51 +++++++++++++++++++
 2 files changed, 52 insertions(+)
 create mode 100644 solutions/2947-count-beautiful-substrings-i.js

diff --git a/README.md b/README.md
index 272aa5f7..78095fa2 100644
--- a/README.md
+++ b/README.md
@@ -2097,6 +2097,7 @@
 2938|[Separate Black and White Balls](./solutions/2938-separate-black-and-white-balls.js)|Medium|
 2942|[Find Words Containing Character](./solutions/2942-find-words-containing-character.js)|Easy|
 2946|[Matrix Similarity After Cyclic Shifts](./solutions/2946-matrix-similarity-after-cyclic-shifts.js)|Easy|
+2947|[Count Beautiful Substrings I](./solutions/2947-count-beautiful-substrings-i.js)|Medium|
 2948|[Make Lexicographically Smallest Array by Swapping Elements](./solutions/2948-make-lexicographically-smallest-array-by-swapping-elements.js)|Medium|
 2962|[Count Subarrays Where Max Element Appears at Least K Times](./solutions/2962-count-subarrays-where-max-element-appears-at-least-k-times.js)|Medium|
 2965|[Find Missing and Repeated Values](./solutions/2965-find-missing-and-repeated-values.js)|Easy|
diff --git a/solutions/2947-count-beautiful-substrings-i.js b/solutions/2947-count-beautiful-substrings-i.js
new file mode 100644
index 00000000..0972a990
--- /dev/null
+++ b/solutions/2947-count-beautiful-substrings-i.js
@@ -0,0 +1,51 @@
+/**
+ * 2947. Count Beautiful Substrings I
+ * https://leetcode.com/problems/count-beautiful-substrings-i/
+ * Difficulty: Medium
+ *
+ * You are given a string s and a positive integer k.
+ *
+ * Let vowels and consonants be the number of vowels and consonants in a string.
+ *
+ * A string is beautiful if:
+ * - vowels == consonants.
+ * - (vowels * consonants) % k == 0, in other terms the multiplication of vowels and
+ *   consonants is divisible by k.
+ *
+ * Return the number of non-empty beautiful substrings in the given string s.
+ *
+ * A substring is a contiguous sequence of characters in a string.
+ *
+ * Vowel letters in English are 'a', 'e', 'i', 'o', and 'u'.
+ *
+ * Consonant letters in English are every letter except vowels.
+ */
+
+/**
+ * @param {string} s
+ * @param {number} k
+ * @return {number}
+ */
+var beautifulSubstrings = function(s, k) {
+  const vowels = new Set(['a', 'e', 'i', 'o', 'u']);
+  let result = 0;
+
+  for (let start = 0; start < s.length; start++) {
+    let vowelCount = 0;
+    let consonantCount = 0;
+
+    for (let end = start; end < s.length; end++) {
+      if (vowels.has(s[end])) {
+        vowelCount++;
+      } else {
+        consonantCount++;
+      }
+
+      if (vowelCount === consonantCount && (vowelCount * consonantCount) % k === 0) {
+        result++;
+      }
+    }
+  }
+
+  return result;
+};

From 6077d6b590fdeaa812cd56c72247b4497adb6472 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 5 Jun 2025 00:02:42 -0500
Subject: [PATCH 427/571] Add solution #2951

---
 README.md                        |  1 +
 solutions/2951-find-the-peaks.js | 30 ++++++++++++++++++++++++++++++
 2 files changed, 31 insertions(+)
 create mode 100644 solutions/2951-find-the-peaks.js

diff --git a/README.md b/README.md
index 78095fa2..89b0af4d 100644
--- a/README.md
+++ b/README.md
@@ -2099,6 +2099,7 @@
 2946|[Matrix Similarity After Cyclic Shifts](./solutions/2946-matrix-similarity-after-cyclic-shifts.js)|Easy|
 2947|[Count Beautiful Substrings I](./solutions/2947-count-beautiful-substrings-i.js)|Medium|
 2948|[Make Lexicographically Smallest Array by Swapping Elements](./solutions/2948-make-lexicographically-smallest-array-by-swapping-elements.js)|Medium|
+2951|[Find the Peaks](./solutions/2951-find-the-peaks.js)|Easy|
 2962|[Count Subarrays Where Max Element Appears at Least K Times](./solutions/2962-count-subarrays-where-max-element-appears-at-least-k-times.js)|Medium|
 2965|[Find Missing and Repeated Values](./solutions/2965-find-missing-and-repeated-values.js)|Easy|
 2999|[Count the Number of Powerful Integers](./solutions/2999-count-the-number-of-powerful-integers.js)|Hard|
diff --git a/solutions/2951-find-the-peaks.js b/solutions/2951-find-the-peaks.js
new file mode 100644
index 00000000..45e40576
--- /dev/null
+++ b/solutions/2951-find-the-peaks.js
@@ -0,0 +1,30 @@
+/**
+ * 2951. Find the Peaks
+ * https://leetcode.com/problems/find-the-peaks/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed array mountain. Your task is to find all the peaks in the
+ * mountain array.
+ *
+ * Return an array that consists of indices of peaks in the given array in any order.
+ *
+ * Notes:
+ * - A peak is defined as an element that is strictly greater than its neighboring elements.
+ * - The first and last elements of the array are not a peak.
+ */
+
+/**
+ * @param {number[]} mountain
+ * @return {number[]}
+ */
+var findPeaks = function(mountain) {
+  const result = [];
+
+  for (let i = 1; i < mountain.length - 1; i++) {
+    if (mountain[i] > mountain[i - 1] && mountain[i] > mountain[i + 1]) {
+      result.push(i);
+    }
+  }
+
+  return result;
+};

From b8f33a614859032a24630811c0e6305672b90d70 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 5 Jun 2025 00:03:55 -0500
Subject: [PATCH 428/571] Add solution #2952

---
 README.md                                     |  1 +
 ...952-minimum-number-of-coins-to-be-added.js | 41 +++++++++++++++++++
 2 files changed, 42 insertions(+)
 create mode 100644 solutions/2952-minimum-number-of-coins-to-be-added.js

diff --git a/README.md b/README.md
index 89b0af4d..3b3262ea 100644
--- a/README.md
+++ b/README.md
@@ -2100,6 +2100,7 @@
 2947|[Count Beautiful Substrings I](./solutions/2947-count-beautiful-substrings-i.js)|Medium|
 2948|[Make Lexicographically Smallest Array by Swapping Elements](./solutions/2948-make-lexicographically-smallest-array-by-swapping-elements.js)|Medium|
 2951|[Find the Peaks](./solutions/2951-find-the-peaks.js)|Easy|
+2952|[Minimum Number of Coins to be Added](./solutions/2952-minimum-number-of-coins-to-be-added.js)|Medium|
 2962|[Count Subarrays Where Max Element Appears at Least K Times](./solutions/2962-count-subarrays-where-max-element-appears-at-least-k-times.js)|Medium|
 2965|[Find Missing and Repeated Values](./solutions/2965-find-missing-and-repeated-values.js)|Easy|
 2999|[Count the Number of Powerful Integers](./solutions/2999-count-the-number-of-powerful-integers.js)|Hard|
diff --git a/solutions/2952-minimum-number-of-coins-to-be-added.js b/solutions/2952-minimum-number-of-coins-to-be-added.js
new file mode 100644
index 00000000..8290c3f1
--- /dev/null
+++ b/solutions/2952-minimum-number-of-coins-to-be-added.js
@@ -0,0 +1,41 @@
+/**
+ * 2952. Minimum Number of Coins to be Added
+ * https://leetcode.com/problems/minimum-number-of-coins-to-be-added/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed integer array coins, representing the values of the coins available,
+ * and an integer target.
+ *
+ * An integer x is obtainable if there exists a subsequence of coins that sums to x.
+ *
+ * Return the minimum number of coins of any value that need to be added to the array so that every
+ * integer in the range [1, target] is obtainable.
+ *
+ * A subsequence of an array is a new non-empty array that is formed from the original array by
+ * deleting some (possibly none) of the elements without disturbing the relative positions of the
+ * remaining elements.
+ */
+
+/**
+ * @param {number[]} coins
+ * @param {number} target
+ * @return {number}
+ */
+var minimumAddedCoins = function(coins, target) {
+  coins.sort((a, b) => a - b);
+  let result = 0;
+  let currentMax = 0;
+  let index = 0;
+
+  while (currentMax < target) {
+    if (index < coins.length && coins[index] <= currentMax + 1) {
+      currentMax += coins[index];
+      index++;
+    } else {
+      currentMax += currentMax + 1;
+      result++;
+    }
+  }
+
+  return result;
+};

From 9dbe97dfe6b7df6a876acb96e7058bbf4f2a0d37 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 5 Jun 2025 00:05:06 -0500
Subject: [PATCH 429/571] Add solution #2956

---
 README.md                                     |  1 +
 ...find-common-elements-between-two-arrays.js | 39 +++++++++++++++++++
 2 files changed, 40 insertions(+)
 create mode 100644 solutions/2956-find-common-elements-between-two-arrays.js

diff --git a/README.md b/README.md
index 3b3262ea..2aefaf72 100644
--- a/README.md
+++ b/README.md
@@ -2101,6 +2101,7 @@
 2948|[Make Lexicographically Smallest Array by Swapping Elements](./solutions/2948-make-lexicographically-smallest-array-by-swapping-elements.js)|Medium|
 2951|[Find the Peaks](./solutions/2951-find-the-peaks.js)|Easy|
 2952|[Minimum Number of Coins to be Added](./solutions/2952-minimum-number-of-coins-to-be-added.js)|Medium|
+2956|[Find Common Elements Between Two Arrays](./solutions/2956-find-common-elements-between-two-arrays.js)|Easy|
 2962|[Count Subarrays Where Max Element Appears at Least K Times](./solutions/2962-count-subarrays-where-max-element-appears-at-least-k-times.js)|Medium|
 2965|[Find Missing and Repeated Values](./solutions/2965-find-missing-and-repeated-values.js)|Easy|
 2999|[Count the Number of Powerful Integers](./solutions/2999-count-the-number-of-powerful-integers.js)|Hard|
diff --git a/solutions/2956-find-common-elements-between-two-arrays.js b/solutions/2956-find-common-elements-between-two-arrays.js
new file mode 100644
index 00000000..8189c0e2
--- /dev/null
+++ b/solutions/2956-find-common-elements-between-two-arrays.js
@@ -0,0 +1,39 @@
+/**
+ * 2956. Find Common Elements Between Two Arrays
+ * https://leetcode.com/problems/find-common-elements-between-two-arrays/
+ * Difficulty: Easy
+ *
+ * You are given two integer arrays nums1 and nums2 of sizes n and m, respectively.
+ * Calculate the following values:
+ * - answer1 : the number of indices i such that nums1[i] exists in nums2.
+ * - answer2 : the number of indices i such that nums2[i] exists in nums1.
+ *
+ * Return [answer1,answer2].
+ */
+
+/**
+ * @param {number[]} nums1
+ * @param {number[]} nums2
+ * @return {number[]}
+ */
+var findIntersectionValues = function(nums1, nums2) {
+  const set1 = new Set(nums1);
+  const set2 = new Set(nums2);
+
+  let count1 = 0;
+  let count2 = 0;
+
+  for (const num of nums1) {
+    if (set2.has(num)) {
+      count1++;
+    }
+  }
+
+  for (const num of nums2) {
+    if (set1.has(num)) {
+      count2++;
+    }
+  }
+
+  return [count1, count2];
+};

From 70f15bc40282b0ad7d058c5675dcc41f2124c888 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 5 Jun 2025 00:06:05 -0500
Subject: [PATCH 430/571] Add solution #2957

---
 README.md                                     |  1 +
 ...remove-adjacent-almost-equal-characters.js | 32 +++++++++++++++++++
 2 files changed, 33 insertions(+)
 create mode 100644 solutions/2957-remove-adjacent-almost-equal-characters.js

diff --git a/README.md b/README.md
index 2aefaf72..404fc1a0 100644
--- a/README.md
+++ b/README.md
@@ -2102,6 +2102,7 @@
 2951|[Find the Peaks](./solutions/2951-find-the-peaks.js)|Easy|
 2952|[Minimum Number of Coins to be Added](./solutions/2952-minimum-number-of-coins-to-be-added.js)|Medium|
 2956|[Find Common Elements Between Two Arrays](./solutions/2956-find-common-elements-between-two-arrays.js)|Easy|
+2957|[Remove Adjacent Almost-Equal Characters](./solutions/2957-remove-adjacent-almost-equal-characters.js)|Medium|
 2962|[Count Subarrays Where Max Element Appears at Least K Times](./solutions/2962-count-subarrays-where-max-element-appears-at-least-k-times.js)|Medium|
 2965|[Find Missing and Repeated Values](./solutions/2965-find-missing-and-repeated-values.js)|Easy|
 2999|[Count the Number of Powerful Integers](./solutions/2999-count-the-number-of-powerful-integers.js)|Hard|
diff --git a/solutions/2957-remove-adjacent-almost-equal-characters.js b/solutions/2957-remove-adjacent-almost-equal-characters.js
new file mode 100644
index 00000000..c62070dc
--- /dev/null
+++ b/solutions/2957-remove-adjacent-almost-equal-characters.js
@@ -0,0 +1,32 @@
+/**
+ * 2957. Remove Adjacent Almost-Equal Characters
+ * https://leetcode.com/problems/remove-adjacent-almost-equal-characters/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed string word.
+ *
+ * In one operation, you can pick any index i of word and change word[i] to any lowercase
+ * English letter.
+ *
+ * Return the minimum number of operations needed to remove all adjacent almost-equal
+ * characters from word.
+ *
+ * Two characters a and b are almost-equal if a == b or a and b are adjacent in the alphabet.
+ */
+
+/**
+ * @param {string} word
+ * @return {number}
+ */
+var removeAlmostEqualCharacters = function(word) {
+  let result = 0;
+
+  for (let i = 1; i < word.length; i++) {
+    if (Math.abs(word.charCodeAt(i) - word.charCodeAt(i - 1)) <= 1) {
+      result++;
+      i++;
+    }
+  }
+
+  return result;
+};

From 40768a242d8499ffda5efab3081a037141aec583 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 5 Jun 2025 00:07:23 -0500
Subject: [PATCH 431/571] Add solution #2958

---
 README.md                                     |  1 +
 ...ngest-subarray-with-at-most-k-frequency.js | 40 +++++++++++++++++++
 2 files changed, 41 insertions(+)
 create mode 100644 solutions/2958-length-of-longest-subarray-with-at-most-k-frequency.js

diff --git a/README.md b/README.md
index 404fc1a0..124100e6 100644
--- a/README.md
+++ b/README.md
@@ -2103,6 +2103,7 @@
 2952|[Minimum Number of Coins to be Added](./solutions/2952-minimum-number-of-coins-to-be-added.js)|Medium|
 2956|[Find Common Elements Between Two Arrays](./solutions/2956-find-common-elements-between-two-arrays.js)|Easy|
 2957|[Remove Adjacent Almost-Equal Characters](./solutions/2957-remove-adjacent-almost-equal-characters.js)|Medium|
+2958|[Length of Longest Subarray With at Most K Frequency](./solutions/2958-length-of-longest-subarray-with-at-most-k-frequency.js)|Medium|
 2962|[Count Subarrays Where Max Element Appears at Least K Times](./solutions/2962-count-subarrays-where-max-element-appears-at-least-k-times.js)|Medium|
 2965|[Find Missing and Repeated Values](./solutions/2965-find-missing-and-repeated-values.js)|Easy|
 2999|[Count the Number of Powerful Integers](./solutions/2999-count-the-number-of-powerful-integers.js)|Hard|
diff --git a/solutions/2958-length-of-longest-subarray-with-at-most-k-frequency.js b/solutions/2958-length-of-longest-subarray-with-at-most-k-frequency.js
new file mode 100644
index 00000000..4efcb001
--- /dev/null
+++ b/solutions/2958-length-of-longest-subarray-with-at-most-k-frequency.js
@@ -0,0 +1,40 @@
+/**
+ * 2958. Length of Longest Subarray With at Most K Frequency
+ * https://leetcode.com/problems/length-of-longest-subarray-with-at-most-k-frequency/
+ * Difficulty: Medium
+ *
+ * You are given an integer array nums and an integer k.
+ *
+ * The frequency of an element x is the number of times it occurs in an array.
+ *
+ * An array is called good if the frequency of each element in this array is less than or
+ * equal to k.
+ *
+ * Return the length of the longest good subarray of nums.
+ *
+ * A subarray is a contiguous non-empty sequence of elements within an array.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} k
+ * @return {number}
+ */
+var maxSubarrayLength = function(nums, k) {
+  const map = new Map();
+  let result = 0;
+  let left = 0;
+
+  for (let right = 0; right < nums.length; right++) {
+    map.set(nums[right], (map.get(nums[right]) || 0) + 1);
+
+    while (map.get(nums[right]) > k) {
+      map.set(nums[left], map.get(nums[left]) - 1);
+      left++;
+    }
+
+    result = Math.max(result, right - left + 1);
+  }
+
+  return result;
+};

From 12ba5ea261a8bf9422fe81264f82f05d69fced20 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 5 Jun 2025 19:18:36 -0500
Subject: [PATCH 432/571] Add solution #2960

---
 README.md                                     |  1 +
 ...nt-tested-devices-after-test-operations.js | 40 +++++++++++++++++++
 2 files changed, 41 insertions(+)
 create mode 100644 solutions/2960-count-tested-devices-after-test-operations.js

diff --git a/README.md b/README.md
index 124100e6..8e9e4e07 100644
--- a/README.md
+++ b/README.md
@@ -2104,6 +2104,7 @@
 2956|[Find Common Elements Between Two Arrays](./solutions/2956-find-common-elements-between-two-arrays.js)|Easy|
 2957|[Remove Adjacent Almost-Equal Characters](./solutions/2957-remove-adjacent-almost-equal-characters.js)|Medium|
 2958|[Length of Longest Subarray With at Most K Frequency](./solutions/2958-length-of-longest-subarray-with-at-most-k-frequency.js)|Medium|
+2960|[Count Tested Devices After Test Operations](./solutions/2960-count-tested-devices-after-test-operations.js)|Easy|
 2962|[Count Subarrays Where Max Element Appears at Least K Times](./solutions/2962-count-subarrays-where-max-element-appears-at-least-k-times.js)|Medium|
 2965|[Find Missing and Repeated Values](./solutions/2965-find-missing-and-repeated-values.js)|Easy|
 2999|[Count the Number of Powerful Integers](./solutions/2999-count-the-number-of-powerful-integers.js)|Hard|
diff --git a/solutions/2960-count-tested-devices-after-test-operations.js b/solutions/2960-count-tested-devices-after-test-operations.js
new file mode 100644
index 00000000..6c118fb3
--- /dev/null
+++ b/solutions/2960-count-tested-devices-after-test-operations.js
@@ -0,0 +1,40 @@
+/**
+ * 2960. Count Tested Devices After Test Operations
+ * https://leetcode.com/problems/count-tested-devices-after-test-operations/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed integer array batteryPercentages having length n, denoting the
+ * battery percentages of n 0-indexed devices.
+ *
+ * Your task is to test each device i in order from 0 to n - 1, by performing the following
+ * test operations:
+ * - If batteryPercentages[i] is greater than 0:
+ *   - Increment the count of tested devices.
+ *   - Decrease the battery percentage of all devices with indices j in the range [i + 1, n - 1]
+ *     by 1, ensuring their battery percentage never goes below 0, i.e,
+ *     batteryPercentages[j] = max(0, batteryPercentages[j] - 1).
+ *   - Move to the next device.
+ * - Otherwise, move to the next device without performing any test.
+ *
+ * Return an integer denoting the number of devices that will be tested after performing the test
+ * operations in order.
+ */
+
+/**
+ * @param {number[]} batteryPercentages
+ * @return {number}
+ */
+var countTestedDevices = function(batteryPercentages) {
+  let result = 0;
+
+  for (let i = 0; i < batteryPercentages.length; i++) {
+    if (batteryPercentages[i] > 0) {
+      result++;
+      for (let j = i + 1; j < batteryPercentages.length; j++) {
+        batteryPercentages[j] = Math.max(0, batteryPercentages[j] - 1);
+      }
+    }
+  }
+
+  return result;
+};

From 83667fb894fe97e80bd3eba3553f0488f7825dbb Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 5 Jun 2025 19:20:33 -0500
Subject: [PATCH 433/571] Add solution #2961

---
 README.md                                     |  1 +
 .../2961-double-modular-exponentiation.js     | 43 +++++++++++++++++++
 2 files changed, 44 insertions(+)
 create mode 100644 solutions/2961-double-modular-exponentiation.js

diff --git a/README.md b/README.md
index 8e9e4e07..c3d81976 100644
--- a/README.md
+++ b/README.md
@@ -2105,6 +2105,7 @@
 2957|[Remove Adjacent Almost-Equal Characters](./solutions/2957-remove-adjacent-almost-equal-characters.js)|Medium|
 2958|[Length of Longest Subarray With at Most K Frequency](./solutions/2958-length-of-longest-subarray-with-at-most-k-frequency.js)|Medium|
 2960|[Count Tested Devices After Test Operations](./solutions/2960-count-tested-devices-after-test-operations.js)|Easy|
+2961|[Double Modular Exponentiation](./solutions/2961-double-modular-exponentiation.js)|Medium|
 2962|[Count Subarrays Where Max Element Appears at Least K Times](./solutions/2962-count-subarrays-where-max-element-appears-at-least-k-times.js)|Medium|
 2965|[Find Missing and Repeated Values](./solutions/2965-find-missing-and-repeated-values.js)|Easy|
 2999|[Count the Number of Powerful Integers](./solutions/2999-count-the-number-of-powerful-integers.js)|Hard|
diff --git a/solutions/2961-double-modular-exponentiation.js b/solutions/2961-double-modular-exponentiation.js
new file mode 100644
index 00000000..1a9f9162
--- /dev/null
+++ b/solutions/2961-double-modular-exponentiation.js
@@ -0,0 +1,43 @@
+/**
+ * 2961. Double Modular Exponentiation
+ * https://leetcode.com/problems/double-modular-exponentiation/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed 2D array variables where variables[i] = [ai, bi, ci, mi], and an
+ * integer target.
+ *
+ * An index i is good if the following formula holds:
+ * - 0 <= i < variables.length
+ * - ((aibi % 10)ci) % mi == target
+ *
+ * Return an array consisting of good indices in any order.
+ */
+
+/**
+ * @param {number[][]} variables
+ * @param {number} target
+ * @return {number[]}
+ */
+var getGoodIndices = function(variables, target) {
+  const result = [];
+
+  for (let i = 0; i < variables.length; i++) {
+    const [base, exp1, exp2, modulus] = variables[i];
+
+    let inner = 1;
+    for (let j = 0; j < exp1; j++) {
+      inner = (inner * base) % 10;
+    }
+
+    let count = 1;
+    for (let j = 0; j < exp2; j++) {
+      count = (count * inner) % modulus;
+    }
+
+    if (count === target) {
+      result.push(i);
+    }
+  }
+
+  return result;
+};

From b110ecc45393cb9821a085b241d22bc14e24b13d Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 5 Jun 2025 19:23:30 -0500
Subject: [PATCH 434/571] Add solution #2963

---
 README.md                                     |  1 +
 ...963-count-the-number-of-good-partitions.js | 43 +++++++++++++++++++
 2 files changed, 44 insertions(+)
 create mode 100644 solutions/2963-count-the-number-of-good-partitions.js

diff --git a/README.md b/README.md
index c3d81976..da1dbee2 100644
--- a/README.md
+++ b/README.md
@@ -2107,6 +2107,7 @@
 2960|[Count Tested Devices After Test Operations](./solutions/2960-count-tested-devices-after-test-operations.js)|Easy|
 2961|[Double Modular Exponentiation](./solutions/2961-double-modular-exponentiation.js)|Medium|
 2962|[Count Subarrays Where Max Element Appears at Least K Times](./solutions/2962-count-subarrays-where-max-element-appears-at-least-k-times.js)|Medium|
+2963|[Count the Number of Good Partitions](./solutions/2963-count-the-number-of-good-partitions.js)|Hard|
 2965|[Find Missing and Repeated Values](./solutions/2965-find-missing-and-repeated-values.js)|Easy|
 2999|[Count the Number of Powerful Integers](./solutions/2999-count-the-number-of-powerful-integers.js)|Hard|
 3024|[Type of Triangle](./solutions/3024-type-of-triangle.js)|Easy|
diff --git a/solutions/2963-count-the-number-of-good-partitions.js b/solutions/2963-count-the-number-of-good-partitions.js
new file mode 100644
index 00000000..9144b31e
--- /dev/null
+++ b/solutions/2963-count-the-number-of-good-partitions.js
@@ -0,0 +1,43 @@
+/**
+ * 2963. Count the Number of Good Partitions
+ * https://leetcode.com/problems/count-the-number-of-good-partitions/
+ * Difficulty: Hard
+ *
+ * You are given a 0-indexed array nums consisting of positive integers.
+ *
+ * A partition of an array into one or more contiguous subarrays is called good if no two
+ * subarrays contain the same number.
+ *
+ * Return the total number of good partitions of nums.
+ *
+ * Since the answer may be large, return it modulo 109 + 7.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var numberOfGoodPartitions = function(nums) {
+  const mod = 1e9 + 7;
+  const map = new Map();
+  let segments = 0;
+  let end = -1;
+
+  for (let i = 0; i < nums.length; i++) {
+    map.set(nums[i], i);
+  }
+
+  for (let i = 0; i < nums.length; i++) {
+    if (i > end) {
+      segments++;
+    }
+    end = Math.max(end, map.get(nums[i]));
+  }
+
+  let result = 1;
+  for (let i = 1; i < segments; i++) {
+    result = (result * 2) % mod;
+  }
+
+  return result;
+};

From ff369b6694fff634a62ad332d92a7765a18248e8 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 5 Jun 2025 19:24:50 -0500
Subject: [PATCH 435/571] Add solution #2966

---
 README.md                                     |  1 +
 ...e-array-into-arrays-with-max-difference.js | 33 +++++++++++++++++++
 2 files changed, 34 insertions(+)
 create mode 100644 solutions/2966-divide-array-into-arrays-with-max-difference.js

diff --git a/README.md b/README.md
index da1dbee2..a5590086 100644
--- a/README.md
+++ b/README.md
@@ -2109,6 +2109,7 @@
 2962|[Count Subarrays Where Max Element Appears at Least K Times](./solutions/2962-count-subarrays-where-max-element-appears-at-least-k-times.js)|Medium|
 2963|[Count the Number of Good Partitions](./solutions/2963-count-the-number-of-good-partitions.js)|Hard|
 2965|[Find Missing and Repeated Values](./solutions/2965-find-missing-and-repeated-values.js)|Easy|
+2966|[Divide Array Into Arrays With Max Difference](./solutions/2966-divide-array-into-arrays-with-max-difference.js)|Medium|
 2999|[Count the Number of Powerful Integers](./solutions/2999-count-the-number-of-powerful-integers.js)|Hard|
 3024|[Type of Triangle](./solutions/3024-type-of-triangle.js)|Easy|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
diff --git a/solutions/2966-divide-array-into-arrays-with-max-difference.js b/solutions/2966-divide-array-into-arrays-with-max-difference.js
new file mode 100644
index 00000000..3da39b41
--- /dev/null
+++ b/solutions/2966-divide-array-into-arrays-with-max-difference.js
@@ -0,0 +1,33 @@
+/**
+ * 2966. Divide Array Into Arrays With Max Difference
+ * https://leetcode.com/problems/divide-array-into-arrays-with-max-difference/
+ * Difficulty: Medium
+ *
+ * You are given an integer array nums of size n where n is a multiple of 3 and a positive
+ * integer k.
+ *
+ * Divide the array nums into n / 3 arrays of size 3 satisfying the following condition:
+ * - The difference between any two elements in one array is less than or equal to k.
+ *
+ * Return a 2D array containing the arrays. If it is impossible to satisfy the conditions, return
+ * an empty array. And if there are multiple answers, return any of them.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} k
+ * @return {number[][]}
+ */
+var divideArray = function(nums, k) {
+  nums.sort((a, b) => a - b);
+  const result = [];
+
+  for (let i = 0; i < nums.length; i += 3) {
+    if (nums[i + 2] - nums[i] > k) {
+      return [];
+    }
+    result.push([nums[i], nums[i + 1], nums[i + 2]]);
+  }
+
+  return result;
+};

From 53177b8ddadab7cae848fdeae36389d8cabfe581 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 5 Jun 2025 19:25:52 -0500
Subject: [PATCH 436/571] Add solution #2970

---
 README.md                                     |  1 +
 ...-the-number-of-incremovable-subarrays-i.js | 46 +++++++++++++++++++
 2 files changed, 47 insertions(+)
 create mode 100644 solutions/2970-count-the-number-of-incremovable-subarrays-i.js

diff --git a/README.md b/README.md
index a5590086..c37b5aa5 100644
--- a/README.md
+++ b/README.md
@@ -2110,6 +2110,7 @@
 2963|[Count the Number of Good Partitions](./solutions/2963-count-the-number-of-good-partitions.js)|Hard|
 2965|[Find Missing and Repeated Values](./solutions/2965-find-missing-and-repeated-values.js)|Easy|
 2966|[Divide Array Into Arrays With Max Difference](./solutions/2966-divide-array-into-arrays-with-max-difference.js)|Medium|
+2970|[Count the Number of Incremovable Subarrays I](./solutions/2970-count-the-number-of-incremovable-subarrays-i.js)|Easy|
 2999|[Count the Number of Powerful Integers](./solutions/2999-count-the-number-of-powerful-integers.js)|Hard|
 3024|[Type of Triangle](./solutions/3024-type-of-triangle.js)|Easy|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
diff --git a/solutions/2970-count-the-number-of-incremovable-subarrays-i.js b/solutions/2970-count-the-number-of-incremovable-subarrays-i.js
new file mode 100644
index 00000000..269065a7
--- /dev/null
+++ b/solutions/2970-count-the-number-of-incremovable-subarrays-i.js
@@ -0,0 +1,46 @@
+/**
+ * 2970. Count the Number of Incremovable Subarrays I
+ * https://leetcode.com/problems/count-the-number-of-incremovable-subarrays-i/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed array of positive integers nums.
+ *
+ * A subarray of nums is called incremovable if nums becomes strictly increasing on removing the
+ * subarray. For example, the subarray [3, 4] is an incremovable subarray of [5, 3, 4, 6, 7] because
+ * removing this subarray changes the array [5, 3, 4, 6, 7] to [5, 6, 7] which is strictly
+ * increasing.
+ *
+ * Return the total number of incremovable subarrays of nums.
+ *
+ * Note that an empty array is considered strictly increasing.
+ *
+ * A subarray is a contiguous non-empty sequence of elements within an array.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var incremovableSubarrayCount = function(nums) {
+  let result = 0;
+
+  for (let start = 0; start < nums.length; start++) {
+    for (let end = start; end < nums.length; end++) {
+      let isIncreasing = true;
+      let prev = -Infinity;
+
+      for (let i = 0; i < nums.length; i++) {
+        if (i >= start && i <= end) continue;
+        if (nums[i] <= prev) {
+          isIncreasing = false;
+          break;
+        }
+        prev = nums[i];
+      }
+
+      if (isIncreasing) result++;
+    }
+  }
+
+  return result;
+};

From 8029319c277f2145d71e05b364f27ebbe1d39d1c Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 5 Jun 2025 19:29:23 -0500
Subject: [PATCH 437/571] Add solution #2971

---
 README.md                                     |  1 +
 ...find-polygon-with-the-largest-perimeter.js | 33 +++++++++++++++++++
 2 files changed, 34 insertions(+)
 create mode 100644 solutions/2971-find-polygon-with-the-largest-perimeter.js

diff --git a/README.md b/README.md
index c37b5aa5..13ec7b4f 100644
--- a/README.md
+++ b/README.md
@@ -2111,6 +2111,7 @@
 2965|[Find Missing and Repeated Values](./solutions/2965-find-missing-and-repeated-values.js)|Easy|
 2966|[Divide Array Into Arrays With Max Difference](./solutions/2966-divide-array-into-arrays-with-max-difference.js)|Medium|
 2970|[Count the Number of Incremovable Subarrays I](./solutions/2970-count-the-number-of-incremovable-subarrays-i.js)|Easy|
+2971|[Find Polygon With the Largest Perimeter](./solutions/2971-find-polygon-with-the-largest-perimeter.js)|Medium|
 2999|[Count the Number of Powerful Integers](./solutions/2999-count-the-number-of-powerful-integers.js)|Hard|
 3024|[Type of Triangle](./solutions/3024-type-of-triangle.js)|Easy|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
diff --git a/solutions/2971-find-polygon-with-the-largest-perimeter.js b/solutions/2971-find-polygon-with-the-largest-perimeter.js
new file mode 100644
index 00000000..15d2e501
--- /dev/null
+++ b/solutions/2971-find-polygon-with-the-largest-perimeter.js
@@ -0,0 +1,33 @@
+/**
+ * 2971. Find Polygon With the Largest Perimeter
+ * https://leetcode.com/problems/find-polygon-with-the-largest-perimeter/
+ * Difficulty: Medium
+ *
+ * You are given an array of positive integers nums of length n.
+ *
+ * A polygon is a closed plane figure that has at least 3 sides. The longest side of a polygon is
+ * smaller than the sum of its other sides.
+ *
+ * Conversely, if you have k (k >= 3) positive real numbers a1, a2, a3, ..., ak where
+ * a1 <= a2 <= a3 <= ... <= ak and a1 + a2 + a3 + ... + ak-1 > ak, then there always exists
+ * a polygon with k sides whose lengths are a1, a2, a3, ..., ak.
+ *
+ * The perimeter of a polygon is the sum of lengths of its sides.
+ *
+ * Return the largest possible perimeter of a polygon whose sides can be formed from nums, or -1
+ * if it is not possible to create a polygon.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var largestPerimeter = function(nums) {
+  nums.sort((a, b) => b - a);
+  for (let i = 0; i < nums.length - 2; i++) {
+    if (nums[i] < nums.slice(i + 1).reduce((sum, num) => sum + num, 0)) {
+      return nums.slice(i).reduce((sum, num) => sum + num, 0);
+    }
+  }
+  return -1;
+};

From 6006d572901d2a8f4c61a7fe2e86706f227711de Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 5 Jun 2025 19:30:59 -0500
Subject: [PATCH 438/571] Add solution #2976

---
 README.md                                     |  1 +
 .../2976-minimum-cost-to-convert-string-i.js  | 59 +++++++++++++++++++
 2 files changed, 60 insertions(+)
 create mode 100644 solutions/2976-minimum-cost-to-convert-string-i.js

diff --git a/README.md b/README.md
index 13ec7b4f..7d999055 100644
--- a/README.md
+++ b/README.md
@@ -2112,6 +2112,7 @@
 2966|[Divide Array Into Arrays With Max Difference](./solutions/2966-divide-array-into-arrays-with-max-difference.js)|Medium|
 2970|[Count the Number of Incremovable Subarrays I](./solutions/2970-count-the-number-of-incremovable-subarrays-i.js)|Easy|
 2971|[Find Polygon With the Largest Perimeter](./solutions/2971-find-polygon-with-the-largest-perimeter.js)|Medium|
+2976|[Minimum Cost to Convert String I](./solutions/2976-minimum-cost-to-convert-string-i.js)|Medium|
 2999|[Count the Number of Powerful Integers](./solutions/2999-count-the-number-of-powerful-integers.js)|Hard|
 3024|[Type of Triangle](./solutions/3024-type-of-triangle.js)|Easy|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
diff --git a/solutions/2976-minimum-cost-to-convert-string-i.js b/solutions/2976-minimum-cost-to-convert-string-i.js
new file mode 100644
index 00000000..9107955d
--- /dev/null
+++ b/solutions/2976-minimum-cost-to-convert-string-i.js
@@ -0,0 +1,59 @@
+/**
+ * 2976. Minimum Cost to Convert String I
+ * https://leetcode.com/problems/minimum-cost-to-convert-string-i/
+ * Difficulty: Medium
+ *
+ * You are given two 0-indexed strings source and target, both of length n and consisting of
+ * lowercase English letters. You are also given two 0-indexed character arrays original and
+ * changed, and an integer array cost, where cost[i] represents the cost of changing the character
+ * original[i] to the character changed[i].
+ *
+ * You start with the string source. In one operation, you can pick a character x from the string
+ * and change it to the character y at a cost of z if there exists any index j such that
+ * cost[j] == z, original[j] == x, and changed[j] == y.
+ *
+ * Return the minimum cost to convert the string source to the string target using any number of
+ * operations. If it is impossible to convert source to target, return -1.
+ *
+ * Note that there may exist indices i, j such that original[j] == original[i] and
+ * changed[j] == changed[i].
+ */
+
+/**
+ * @param {string} source
+ * @param {string} target
+ * @param {character[]} original
+ * @param {character[]} changed
+ * @param {number[]} cost
+ * @return {number}
+ */
+var minimumCost = function(source, target, original, changed, cost) {
+  const graph = new Array(26).fill().map(() => new Array(26).fill(Infinity));
+  for (let i = 0; i < 26; i++) graph[i][i] = 0;
+
+  for (let i = 0; i < original.length; i++) {
+    const from = original[i].charCodeAt(0) - 97;
+    const to = changed[i].charCodeAt(0) - 97;
+    graph[from][to] = Math.min(graph[from][to], cost[i]);
+  }
+
+  for (let k = 0; k < 26; k++) {
+    for (let i = 0; i < 26; i++) {
+      for (let j = 0; j < 26; j++) {
+        graph[i][j] = Math.min(graph[i][j], graph[i][k] + graph[k][j]);
+      }
+    }
+  }
+
+  let result = 0;
+  for (let i = 0; i < source.length; i++) {
+    if (source[i] !== target[i]) {
+      const from = source[i].charCodeAt(0) - 97;
+      const to = target[i].charCodeAt(0) - 97;
+      if (graph[from][to] === Infinity) return -1;
+      result += graph[from][to];
+    }
+  }
+
+  return result;
+};

From 64821b5d7288e911c6713971f8cbd4d71c76224a Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 5 Jun 2025 19:33:11 -0500
Subject: [PATCH 439/571] Add solution #2980

---
 README.md                                     |  1 +
 ...-check-if-bitwise-or-has-trailing-zeros.js | 36 +++++++++++++++++++
 2 files changed, 37 insertions(+)
 create mode 100644 solutions/2980-check-if-bitwise-or-has-trailing-zeros.js

diff --git a/README.md b/README.md
index 7d999055..5b3100ab 100644
--- a/README.md
+++ b/README.md
@@ -2113,6 +2113,7 @@
 2970|[Count the Number of Incremovable Subarrays I](./solutions/2970-count-the-number-of-incremovable-subarrays-i.js)|Easy|
 2971|[Find Polygon With the Largest Perimeter](./solutions/2971-find-polygon-with-the-largest-perimeter.js)|Medium|
 2976|[Minimum Cost to Convert String I](./solutions/2976-minimum-cost-to-convert-string-i.js)|Medium|
+2980|[Check if Bitwise OR Has Trailing Zeros](./solutions/2980-check-if-bitwise-or-has-trailing-zeros.js)|Easy|
 2999|[Count the Number of Powerful Integers](./solutions/2999-count-the-number-of-powerful-integers.js)|Hard|
 3024|[Type of Triangle](./solutions/3024-type-of-triangle.js)|Easy|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
diff --git a/solutions/2980-check-if-bitwise-or-has-trailing-zeros.js b/solutions/2980-check-if-bitwise-or-has-trailing-zeros.js
new file mode 100644
index 00000000..e3afe838
--- /dev/null
+++ b/solutions/2980-check-if-bitwise-or-has-trailing-zeros.js
@@ -0,0 +1,36 @@
+/**
+ * 2980. Check if Bitwise OR Has Trailing Zeros
+ * https://leetcode.com/problems/check-if-bitwise-or-has-trailing-zeros/
+ * Difficulty: Easy
+ *
+ * You are given an array of positive integers nums.
+ *
+ * You have to check if it is possible to select two or more elements in the array such
+ * that the bitwise OR of the selected elements has at least one trailing zero in its
+ * binary representation.
+ *
+ * For example, the binary representation of 5, which is "101", does not have any trailing
+ * zeros, whereas the binary representation of 4, which is "100", has two trailing zeros.
+ *
+ * Return true if it is possible to select two or more elements whose bitwise OR has trailing
+ * zeros, return false otherwise.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {boolean}
+ */
+var hasTrailingZeros = function(nums) {
+  let evenCount = 0;
+
+  for (const num of nums) {
+    if (num % 2 === 0) {
+      evenCount++;
+      if (evenCount >= 2) {
+        return true;
+      }
+    }
+  }
+
+  return false;
+};

From 27782c850fdf90e272240d2b8c5bba3a4eb1fed4 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 5 Jun 2025 19:34:11 -0500
Subject: [PATCH 440/571] Add solution #2981

---
 README.md                                     |  1 +
 ...-special-substring-that-occurs-thrice-i.js | 39 +++++++++++++++++++
 2 files changed, 40 insertions(+)
 create mode 100644 solutions/2981-find-longest-special-substring-that-occurs-thrice-i.js

diff --git a/README.md b/README.md
index 5b3100ab..366a2ca2 100644
--- a/README.md
+++ b/README.md
@@ -2114,6 +2114,7 @@
 2971|[Find Polygon With the Largest Perimeter](./solutions/2971-find-polygon-with-the-largest-perimeter.js)|Medium|
 2976|[Minimum Cost to Convert String I](./solutions/2976-minimum-cost-to-convert-string-i.js)|Medium|
 2980|[Check if Bitwise OR Has Trailing Zeros](./solutions/2980-check-if-bitwise-or-has-trailing-zeros.js)|Easy|
+2981|[Find Longest Special Substring That Occurs Thrice I](./solutions/2981-find-longest-special-substring-that-occurs-thrice-i.js)|Medium|
 2999|[Count the Number of Powerful Integers](./solutions/2999-count-the-number-of-powerful-integers.js)|Hard|
 3024|[Type of Triangle](./solutions/3024-type-of-triangle.js)|Easy|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
diff --git a/solutions/2981-find-longest-special-substring-that-occurs-thrice-i.js b/solutions/2981-find-longest-special-substring-that-occurs-thrice-i.js
new file mode 100644
index 00000000..ac12f932
--- /dev/null
+++ b/solutions/2981-find-longest-special-substring-that-occurs-thrice-i.js
@@ -0,0 +1,39 @@
+/**
+ * 2981. Find Longest Special Substring That Occurs Thrice I
+ * https://leetcode.com/problems/find-longest-special-substring-that-occurs-thrice-i/
+ * Difficulty: Medium
+ *
+ * You are given a string s that consists of lowercase English letters.
+ *
+ * A string is called special if it is made up of only a single character. For example, the
+ * string "abc" is not special, whereas the strings "ddd", "zz", and "f" are special.
+ *
+ * Return the length of the longest special substring of s which occurs at least thrice,
+ * or -1 if no special substring occurs at least thrice.
+ *
+ * A substring is a contiguous non-empty sequence of characters within a string.
+ */
+
+/**
+ * @param {string} s
+ * @return {number}
+ */
+var maximumLength = function(s) {
+  const map = new Map();
+  let result = -1;
+
+  for (let i = 0; i < s.length; i++) {
+    for (let len = 1; len <= s.length - i; len++) {
+      const substr = s.slice(i, i + len);
+      if (substr.split('').every(c => c === substr[0])) {
+        const count = (map.get(substr) || 0) + 1;
+        map.set(substr, count);
+        if (count >= 3) {
+          result = Math.max(result, len);
+        }
+      }
+    }
+  }
+
+  return result;
+};

From 62f1c79ba1f60bf032cb520d5de7dd5be65b6313 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 5 Jun 2025 19:35:21 -0500
Subject: [PATCH 441/571] Add solution #2997

---
 README.md                                     |  1 +
 ...operations-to-make-array-xor-equal-to-k.js | 38 +++++++++++++++++++
 2 files changed, 39 insertions(+)
 create mode 100644 solutions/2997-minimum-number-of-operations-to-make-array-xor-equal-to-k.js

diff --git a/README.md b/README.md
index 366a2ca2..a4c4fac6 100644
--- a/README.md
+++ b/README.md
@@ -2115,6 +2115,7 @@
 2976|[Minimum Cost to Convert String I](./solutions/2976-minimum-cost-to-convert-string-i.js)|Medium|
 2980|[Check if Bitwise OR Has Trailing Zeros](./solutions/2980-check-if-bitwise-or-has-trailing-zeros.js)|Easy|
 2981|[Find Longest Special Substring That Occurs Thrice I](./solutions/2981-find-longest-special-substring-that-occurs-thrice-i.js)|Medium|
+2997|[Minimum Number of Operations to Make Array XOR Equal to K](./solutions/2997-minimum-number-of-operations-to-make-array-xor-equal-to-k.js)|Medium|
 2999|[Count the Number of Powerful Integers](./solutions/2999-count-the-number-of-powerful-integers.js)|Hard|
 3024|[Type of Triangle](./solutions/3024-type-of-triangle.js)|Easy|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
diff --git a/solutions/2997-minimum-number-of-operations-to-make-array-xor-equal-to-k.js b/solutions/2997-minimum-number-of-operations-to-make-array-xor-equal-to-k.js
new file mode 100644
index 00000000..b1d492eb
--- /dev/null
+++ b/solutions/2997-minimum-number-of-operations-to-make-array-xor-equal-to-k.js
@@ -0,0 +1,38 @@
+/**
+ * 2997. Minimum Number of Operations to Make Array XOR Equal to K
+ * https://leetcode.com/problems/minimum-number-of-operations-to-make-array-xor-equal-to-k/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed integer array nums and a positive integer k.
+ *
+ * You can apply the following operation on the array any number of times:
+ * - Choose any element of the array and flip a bit in its binary representation. Flipping a bit
+ *   means changing a 0 to 1 or vice versa.
+ *
+ * Return the minimum number of operations required to make the bitwise XOR of all elements of the
+ * final array equal to k.
+ *
+ * Note that you can flip leading zero bits in the binary representation of elements. For example,
+ * for the number (101)2 you can flip the fourth bit and obtain (1101)2.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} k
+ * @return {number}
+ */
+var minOperations = function(nums, k) {
+  let xorResult = 0;
+  for (const num of nums) {
+    xorResult ^= num;
+  }
+
+  let result = 0;
+  let diff = xorResult ^ k;
+  while (diff > 0) {
+    result += diff & 1;
+    diff >>= 1;
+  }
+
+  return result;
+};

From 615e3fc09ec7a5e43a22798bd10e9aacb9183409 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 5 Jun 2025 23:29:12 -0500
Subject: [PATCH 442/571] Add solution #2376

---
 README.md                                |  1 +
 solutions/2376-count-special-integers.js | 47 ++++++++++++++++++++++++
 2 files changed, 48 insertions(+)
 create mode 100644 solutions/2376-count-special-integers.js

diff --git a/README.md b/README.md
index a4c4fac6..aa1ebb9a 100644
--- a/README.md
+++ b/README.md
@@ -1801,6 +1801,7 @@
 2373|[Largest Local Values in a Matrix](./solutions/2373-largest-local-values-in-a-matrix.js)|Easy|
 2374|[Node With Highest Edge Score](./solutions/2374-node-with-highest-edge-score.js)|Medium|
 2375|[Construct Smallest Number From DI String](./solutions/2375-construct-smallest-number-from-di-string.js)|Medium|
+2376|[Count Special Integers](./solutions/2376-count-special-integers.js)|Hard|
 2379|[Minimum Recolors to Get K Consecutive Black Blocks](./solutions/2379-minimum-recolors-to-get-k-consecutive-black-blocks.js)|Easy|
 2380|[Time Needed to Rearrange a Binary String](./solutions/2380-time-needed-to-rearrange-a-binary-string.js)|Medium|
 2381|[Shifting Letters II](./solutions/2381-shifting-letters-ii.js)|Medium|
diff --git a/solutions/2376-count-special-integers.js b/solutions/2376-count-special-integers.js
new file mode 100644
index 00000000..977b5730
--- /dev/null
+++ b/solutions/2376-count-special-integers.js
@@ -0,0 +1,47 @@
+/**
+ * 2376. Count Special Integers
+ * https://leetcode.com/problems/count-special-integers/
+ * Difficulty: Hard
+ *
+ * We call a positive integer special if all of its digits are distinct.
+ *
+ * Given a positive integer n, return the number of special integers that belong to the
+ * interval [1, n].
+ */
+
+/**
+ * @param {number} n
+ * @return {number}
+ */
+var countSpecialNumbers = function(n) {
+  const digits = String(n).split('').map(Number);
+  const len = digits.length;
+  let total = 0;
+
+  for (let i = 1; i < len; i++) {
+    let count = 9;
+    for (let j = 0; j < i - 1; j++) {
+      count *= (10 - j - 1);
+    }
+    total += count;
+  }
+
+  const used = new Set();
+  for (let i = 0; i < len; i++) {
+    for (let d = (i === 0 ? 1 : 0); d < digits[i]; d++) {
+      if (!used.has(d)) {
+        let count = 1;
+        for (let j = i + 1; j < len; j++) {
+          count *= (10 - used.size - (j - i));
+        }
+        total += count;
+      }
+    }
+    if (used.has(digits[i]) || digits[i] === 0 && i === 0) break;
+    used.add(digits[i]);
+  }
+
+  if (used.size === len) total++;
+
+  return total;
+};

From 1b2aa72fb7cd06e07fc693590197539474c7013f Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 5 Jun 2025 23:30:27 -0500
Subject: [PATCH 443/571] Add solution #2420

---
 README.md                               |  1 +
 solutions/2420-find-all-good-indices.js | 42 +++++++++++++++++++++++++
 2 files changed, 43 insertions(+)
 create mode 100644 solutions/2420-find-all-good-indices.js

diff --git a/README.md b/README.md
index aa1ebb9a..940b2e08 100644
--- a/README.md
+++ b/README.md
@@ -1829,6 +1829,7 @@
 2416|[Sum of Prefix Scores of Strings](./solutions/2416-sum-of-prefix-scores-of-strings.js)|Hard|
 2418|[Sort the People](./solutions/2418-sort-the-people.js)|Easy|
 2419|[Longest Subarray With Maximum Bitwise AND](./solutions/2419-longest-subarray-with-maximum-bitwise-and.js)|Medium|
+2420|[Find All Good Indices](./solutions/2420-find-all-good-indices.js)|Medium|
 2421|[Number of Good Paths](./solutions/2421-number-of-good-paths.js)|Hard|
 2425|[Bitwise XOR of All Pairings](./solutions/2425-bitwise-xor-of-all-pairings.js)|Medium|
 2426|[Number of Pairs Satisfying Inequality](./solutions/2426-number-of-pairs-satisfying-inequality.js)|Hard|
diff --git a/solutions/2420-find-all-good-indices.js b/solutions/2420-find-all-good-indices.js
new file mode 100644
index 00000000..e3216e6e
--- /dev/null
+++ b/solutions/2420-find-all-good-indices.js
@@ -0,0 +1,42 @@
+/**
+ * 2420. Find All Good Indices
+ * https://leetcode.com/problems/find-all-good-indices/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed integer array nums of size n and a positive integer k.
+ *
+ * We call an index i in the range k <= i < n - k good if the following conditions are satisfied:
+ * - The k elements that are just before the index i are in non-increasing order.
+ * - The k elements that are just after the index i are in non-decreasing order.
+ *
+ * Return an array of all good indices sorted in increasing order.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} k
+ * @return {number[]}
+ */
+var goodIndices = function(nums, k) {
+  const n = nums.length;
+  const nonIncreasing = new Array(n).fill(1);
+  const nonDecreasing = new Array(n).fill(1);
+  const result = [];
+
+  for (let i = 1; i < n; i++) {
+    if (nums[i - 1] >= nums[i]) {
+      nonIncreasing[i] = nonIncreasing[i - 1] + 1;
+    }
+    if (nums[n - i] >= nums[n - i - 1]) {
+      nonDecreasing[n - i - 1] = nonDecreasing[n - i] + 1;
+    }
+  }
+
+  for (let i = k; i < n - k; i++) {
+    if (nonIncreasing[i - 1] >= k && nonDecreasing[i + 1] >= k) {
+      result.push(i);
+    }
+  }
+
+  return result;
+};

From ad665db01368020b9bdf35b72763f75cbf0cf3ae Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 5 Jun 2025 23:34:22 -0500
Subject: [PATCH 444/571] Add solution #2484

---
 README.md                                     |  1 +
 .../2484-count-palindromic-subsequences.js    | 59 +++++++++++++++++++
 2 files changed, 60 insertions(+)
 create mode 100644 solutions/2484-count-palindromic-subsequences.js

diff --git a/README.md b/README.md
index 940b2e08..c27f6816 100644
--- a/README.md
+++ b/README.md
@@ -1875,6 +1875,7 @@
 2481|[Minimum Cuts to Divide a Circle](./solutions/2481-minimum-cuts-to-divide-a-circle.js)|Easy|
 2482|[Difference Between Ones and Zeros in Row and Column](./solutions/2482-difference-between-ones-and-zeros-in-row-and-column.js)|Medium|
 2483|[Minimum Penalty for a Shop](./solutions/2483-minimum-penalty-for-a-shop.js)|Medium|
+2484|[Count Palindromic Subsequences](./solutions/2484-count-palindromic-subsequences.js)|Hard|
 2485|[Find the Pivot Integer](./solutions/2485-find-the-pivot-integer.js)|Easy|
 2486|[Append Characters to String to Make Subsequence](./solutions/2486-append-characters-to-string-to-make-subsequence.js)|Medium|
 2487|[Remove Nodes From Linked List](./solutions/2487-remove-nodes-from-linked-list.js)|Medium|
diff --git a/solutions/2484-count-palindromic-subsequences.js b/solutions/2484-count-palindromic-subsequences.js
new file mode 100644
index 00000000..a6c3851c
--- /dev/null
+++ b/solutions/2484-count-palindromic-subsequences.js
@@ -0,0 +1,59 @@
+/**
+ * 2484. Count Palindromic Subsequences
+ * https://leetcode.com/problems/count-palindromic-subsequences/
+ * Difficulty: Hard
+ *
+ * Given a string of digits s, return the number of palindromic subsequences of s having length 5.
+ * Since the answer may be very large, return it modulo 109 + 7.
+ *
+ * Note:
+ * - A string is palindromic if it reads the same forward and backward.
+ * - A subsequence is a string that can be derived from another string by deleting some or no
+ *   characters without changing the order of the remaining characters.
+ */
+
+/**
+ * @param {string} s
+ * @return {number}
+ */
+var countPalindromes = function(s) {
+  const MOD = 1e9 + 7;
+  const n = s.length;
+
+  const prefixPairs = new Array(n).fill(0).map(() => new Array(100).fill(0));
+  const suffixPairs = new Array(n).fill(0).map(() => new Array(100).fill(0));
+
+  for (let i = 1; i < n; i++) {
+    for (let pair = 0; pair < 100; pair++) {
+      prefixPairs[i][pair] = prefixPairs[i - 1][pair];
+    }
+    for (let j = 0; j < i; j++) {
+      const pair = parseInt(s[j]) * 10 + parseInt(s[i]);
+      prefixPairs[i][pair]++;
+    }
+  }
+
+  for (let i = n - 2; i >= 0; i--) {
+    for (let pair = 0; pair < 100; pair++) {
+      suffixPairs[i][pair] = suffixPairs[i + 1][pair];
+    }
+    for (let j = i + 1; j < n; j++) {
+      const pair = parseInt(s[i]) * 10 + parseInt(s[j]);
+      suffixPairs[i][pair]++;
+    }
+  }
+
+  let result = 0;
+  for (let i = 2; i < n - 2; i++) {
+    for (let first = 0; first < 10; first++) {
+      for (let second = 0; second < 10; second++) {
+        const leftPair = first * 10 + second;
+        const rightPair = second * 10 + first;
+        result = (result + (prefixPairs[i - 1][leftPair]
+          * suffixPairs[i + 1][rightPair]) % MOD) % MOD;
+      }
+    }
+  }
+
+  return result;
+};

From e235c8bd45b3bef0b13567e977303c74fff2ddf6 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 5 Jun 2025 23:35:30 -0500
Subject: [PATCH 445/571] Add solution #2576

---
 README.md                                     |  1 +
 ...nd-the-maximum-number-of-marked-indices.js | 38 +++++++++++++++++++
 2 files changed, 39 insertions(+)
 create mode 100644 solutions/2576-find-the-maximum-number-of-marked-indices.js

diff --git a/README.md b/README.md
index c27f6816..e18a2aac 100644
--- a/README.md
+++ b/README.md
@@ -1927,6 +1927,7 @@
 2570|[Merge Two 2D Arrays by Summing Values](./solutions/2570-merge-two-2d-arrays-by-summing-values.js)|Easy|
 2571|[Minimum Operations to Reduce an Integer to 0](./solutions/2571-minimum-operations-to-reduce-an-integer-to-0.js)|Medium|
 2574|[Left and Right Sum Differences](./solutions/2574-left-and-right-sum-differences.js)|Easy|
+2576|[Find the Maximum Number of Marked Indices](./solutions/2576-find-the-maximum-number-of-marked-indices.js)|Medium|
 2578|[Split With Minimum Sum](./solutions/2578-split-with-minimum-sum.js)|Easy|
 2579|[Count Total Number of Colored Cells](./solutions/2579-count-total-number-of-colored-cells.js)|Medium|
 2581|[Count Number of Possible Root Nodes](./solutions/2581-count-number-of-possible-root-nodes.js)|Hard|
diff --git a/solutions/2576-find-the-maximum-number-of-marked-indices.js b/solutions/2576-find-the-maximum-number-of-marked-indices.js
new file mode 100644
index 00000000..73f0f859
--- /dev/null
+++ b/solutions/2576-find-the-maximum-number-of-marked-indices.js
@@ -0,0 +1,38 @@
+/**
+ * 2576. Find the Maximum Number of Marked Indices
+ * https://leetcode.com/problems/find-the-maximum-number-of-marked-indices/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed integer array nums.
+ *
+ * Initially, all of the indices are unmarked. You are allowed to make this operation any
+ * number of times:
+ * - Pick two different unmarked indices i and j such that 2 * nums[i] <= nums[j], then
+ *   mark i and j.
+ *
+ * Return the maximum possible number of marked indices in nums using the above operation
+ * any number of times.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var maxNumOfMarkedIndices = function(nums) {
+  nums.sort((a, b) => a - b);
+  let result = 0;
+  let left = 0;
+  let right = Math.floor(nums.length / 2);
+
+  while (left < Math.floor(nums.length / 2) && right < nums.length) {
+    if (2 * nums[left] <= nums[right]) {
+      result += 2;
+      left++;
+      right++;
+    } else {
+      right++;
+    }
+  }
+
+  return result;
+};

From 0000c47f5f854b3e8a8f01dea1285dd4e94eb20f Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 5 Jun 2025 23:36:49 -0500
Subject: [PATCH 446/571] Add solution #2598

---
 README.md                                     |  1 +
 ...g-non-negative-integer-after-operations.js | 40 +++++++++++++++++++
 2 files changed, 41 insertions(+)
 create mode 100644 solutions/2598-smallest-missing-non-negative-integer-after-operations.js

diff --git a/README.md b/README.md
index e18a2aac..0555738e 100644
--- a/README.md
+++ b/README.md
@@ -1942,6 +1942,7 @@
 2595|[Number of Even and Odd Bits](./solutions/2595-number-of-even-and-odd-bits.js)|Easy|
 2596|[Check Knight Tour Configuration](./solutions/2596-check-knight-tour-configuration.js)|Medium|
 2597|[The Number of Beautiful Subsets](./solutions/2597-the-number-of-beautiful-subsets.js)|Medium|
+2598|[Smallest Missing Non-negative Integer After Operations](./solutions/2598-smallest-missing-non-negative-integer-after-operations.js)|Medium|
 2600|[K Items With the Maximum Sum](./solutions/2600-k-items-with-the-maximum-sum.js)|Easy|
 2601|[Prime Subtraction Operation](./solutions/2601-prime-subtraction-operation.js)|Medium|
 2605|[Form Smallest Number From Two Digit Arrays](./solutions/2605-form-smallest-number-from-two-digit-arrays.js)|Easy|
diff --git a/solutions/2598-smallest-missing-non-negative-integer-after-operations.js b/solutions/2598-smallest-missing-non-negative-integer-after-operations.js
new file mode 100644
index 00000000..fe19438b
--- /dev/null
+++ b/solutions/2598-smallest-missing-non-negative-integer-after-operations.js
@@ -0,0 +1,40 @@
+/**
+ * 2598. Smallest Missing Non-negative Integer After Operations
+ * https://leetcode.com/problems/smallest-missing-non-negative-integer-after-operations/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed integer array nums and an integer value.
+ *
+ * In one operation, you can add or subtract value from any element of nums.
+ * - For example, if nums = [1,2,3] and value = 2, you can choose to subtract value from nums[0]
+ *   to make nums = [-1,2,3].
+ *
+ * The MEX (minimum excluded) of an array is the smallest missing non-negative integer in it.
+ * - For example, the MEX of [-1,2,3] is 0 while the MEX of [1,0,3] is 2.
+ *
+ * Return the maximum MEX of nums after applying the mentioned operation any number of times.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} value
+ * @return {number}
+ */
+var findSmallestInteger = function(nums, value) {
+  const remainderCount = new Map();
+
+  for (const num of nums) {
+    const remainder = ((num % value) + value) % value;
+    remainderCount.set(remainder, (remainderCount.get(remainder) || 0) + 1);
+  }
+
+  for (let mex = 0; mex <= nums.length; mex++) {
+    const remainder = mex % value;
+    if (!remainderCount.has(remainder) || remainderCount.get(remainder) === 0) {
+      return mex;
+    }
+    remainderCount.set(remainder, remainderCount.get(remainder) - 1);
+  }
+
+  return nums.length;
+};

From 8f96e3264da84e659cda370ca56942d3988b3763 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 5 Jun 2025 23:39:45 -0500
Subject: [PATCH 447/571] Add solution #2841

---
 README.md                                     |  1 +
 ...1-maximum-sum-of-almost-unique-subarray.js | 51 +++++++++++++++++++
 2 files changed, 52 insertions(+)
 create mode 100644 solutions/2841-maximum-sum-of-almost-unique-subarray.js

diff --git a/README.md b/README.md
index 0555738e..19b1cfe2 100644
--- a/README.md
+++ b/README.md
@@ -2059,6 +2059,7 @@
 2833|[Furthest Point From Origin](./solutions/2833-furthest-point-from-origin.js)|Easy|
 2839|[Check if Strings Can be Made Equal With Operations I](./solutions/2839-check-if-strings-can-be-made-equal-with-operations-i.js)|Easy|
 2840|[Check if Strings Can be Made Equal With Operations II](./solutions/2840-check-if-strings-can-be-made-equal-with-operations-ii.js)|Medium|
+2841|[Maximum Sum of Almost Unique Subarray](./solutions/2841-maximum-sum-of-almost-unique-subarray.js)|Medium|
 2843|[Count Symmetric Integers](./solutions/2843-count-symmetric-integers.js)|Easy|
 2845|[Count of Interesting Subarrays](./solutions/2845-count-of-interesting-subarrays.js)|Medium|
 2846|[Minimum Edge Weight Equilibrium Queries in a Tree](./solutions/2846-minimum-edge-weight-equilibrium-queries-in-a-tree.js)|Hard|
diff --git a/solutions/2841-maximum-sum-of-almost-unique-subarray.js b/solutions/2841-maximum-sum-of-almost-unique-subarray.js
new file mode 100644
index 00000000..e36e3b1a
--- /dev/null
+++ b/solutions/2841-maximum-sum-of-almost-unique-subarray.js
@@ -0,0 +1,51 @@
+/**
+ * 2841. Maximum Sum of Almost Unique Subarray
+ * https://leetcode.com/problems/maximum-sum-of-almost-unique-subarray/
+ * Difficulty: Medium
+ *
+ * You are given an integer array nums and two positive integers m and k.
+ *
+ * Return the maximum sum out of all almost unique subarrays of length k of nums. If no such
+ * subarray exists, return 0.
+ *
+ * A subarray of nums is almost unique if it contains at least m distinct elements.
+ *
+ * A subarray is a contiguous non-empty sequence of elements within an array.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} m
+ * @param {number} k
+ * @return {number}
+ */
+var maxSum = function(nums, m, k) {
+  const map = new Map();
+  let subarraySum = 0;
+  let result = 0;
+
+  for (let i = 0; i < k; i++) {
+    map.set(nums[i], (map.get(nums[i]) || 0) + 1);
+    subarraySum += nums[i];
+  }
+
+  if (map.size >= m) {
+    result = subarraySum;
+  }
+
+  for (let i = k; i < nums.length; i++) {
+    map.set(nums[i - k], map.get(nums[i - k]) - 1);
+    if (map.get(nums[i - k]) === 0) {
+      map.delete(nums[i - k]);
+    }
+
+    map.set(nums[i], (map.get(nums[i]) || 0) + 1);
+    subarraySum = subarraySum - nums[i - k] + nums[i];
+
+    if (map.size >= m) {
+      result = Math.max(result, subarraySum);
+    }
+  }
+
+  return result;
+};

From 4bdb205d690c0791e00306941b1c60ff47f2f570 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 5 Jun 2025 23:41:08 -0500
Subject: [PATCH 448/571] Add solution #2904

---
 README.md                                     |  1 +
 ...cographically-smallest-beautiful-string.js | 48 +++++++++++++++++++
 2 files changed, 49 insertions(+)
 create mode 100644 solutions/2904-shortest-and-lexicographically-smallest-beautiful-string.js

diff --git a/README.md b/README.md
index 19b1cfe2..1c171deb 100644
--- a/README.md
+++ b/README.md
@@ -2085,6 +2085,7 @@
 2900|[Longest Unequal Adjacent Groups Subsequence I](./solutions/2900-longest-unequal-adjacent-groups-subsequence-i.js)|Easy|
 2901|[Longest Unequal Adjacent Groups Subsequence II](./solutions/2901-longest-unequal-adjacent-groups-subsequence-ii.js)|Medium|
 2903|[Find Indices With Index and Value Difference I](./solutions/2903-find-indices-with-index-and-value-difference-i.js)|Easy|
+2904|[Shortest and Lexicographically Smallest Beautiful String](./solutions/2904-shortest-and-lexicographically-smallest-beautiful-string.js)|Medium|
 2908|[Minimum Sum of Mountain Triplets I](./solutions/2908-minimum-sum-of-mountain-triplets-i.js)|Easy|
 2909|[Minimum Sum of Mountain Triplets II](./solutions/2909-minimum-sum-of-mountain-triplets-ii.js)|Medium|
 2913|[Subarrays Distinct Element Sum of Squares I](./solutions/2913-subarrays-distinct-element-sum-of-squares-i.js)|Easy|
diff --git a/solutions/2904-shortest-and-lexicographically-smallest-beautiful-string.js b/solutions/2904-shortest-and-lexicographically-smallest-beautiful-string.js
new file mode 100644
index 00000000..d328f151
--- /dev/null
+++ b/solutions/2904-shortest-and-lexicographically-smallest-beautiful-string.js
@@ -0,0 +1,48 @@
+/**
+ * 2904. Shortest and Lexicographically Smallest Beautiful String
+ * https://leetcode.com/problems/shortest-and-lexicographically-smallest-beautiful-string/
+ * Difficulty: Medium
+ *
+ * You are given a binary string s and a positive integer k.
+ *
+ * A substring of s is beautiful if the number of 1's in it is exactly k.
+ *
+ * Let len be the length of the shortest beautiful substring.
+ *
+ * Return the lexicographically smallest beautiful substring of string s with length equal to
+ * len. If s doesn't contain a beautiful substring, return an empty string.
+ *
+ * A string a is lexicographically larger than a string b (of the same length) if in the first
+ * position where a and b differ, a has a character strictly larger than the corresponding
+ * character in b.
+ * - For example, "abcd" is lexicographically larger than "abcc" because the first position they
+ *   differ is at the fourth character, and d is greater than c.
+ */
+
+/**
+ * @param {string} s
+ * @param {number} k
+ * @return {string}
+ */
+var shortestBeautifulSubstring = function(s, k) {
+  let minLength = Infinity;
+  let result = '';
+
+  for (let start = 0; start < s.length; start++) {
+    let onesCount = 0;
+    for (let end = start; end < s.length; end++) {
+      if (s[end] === '1') onesCount++;
+      if (onesCount === k) {
+        const currentLength = end - start + 1;
+        const currentSubstring = s.slice(start, end + 1);
+        if (currentLength < minLength
+            || (currentLength === minLength && currentSubstring < result)) {
+          minLength = currentLength;
+          result = currentSubstring;
+        }
+      }
+    }
+  }
+
+  return result;
+};

From d8248c38e1c52b1d4d725e6e058a421edcf949f9 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 5 Jun 2025 23:42:14 -0500
Subject: [PATCH 449/571] Add solution #2998

---
 README.md                                     |  1 +
 ...ber-of-operations-to-make-x-and-y-equal.js | 45 +++++++++++++++++++
 2 files changed, 46 insertions(+)
 create mode 100644 solutions/2998-minimum-number-of-operations-to-make-x-and-y-equal.js

diff --git a/README.md b/README.md
index 1c171deb..e87bd053 100644
--- a/README.md
+++ b/README.md
@@ -2123,6 +2123,7 @@
 2980|[Check if Bitwise OR Has Trailing Zeros](./solutions/2980-check-if-bitwise-or-has-trailing-zeros.js)|Easy|
 2981|[Find Longest Special Substring That Occurs Thrice I](./solutions/2981-find-longest-special-substring-that-occurs-thrice-i.js)|Medium|
 2997|[Minimum Number of Operations to Make Array XOR Equal to K](./solutions/2997-minimum-number-of-operations-to-make-array-xor-equal-to-k.js)|Medium|
+2998|[Minimum Number of Operations to Make X and Y Equal](./solutions/2998-minimum-number-of-operations-to-make-x-and-y-equal.js)|Medium|
 2999|[Count the Number of Powerful Integers](./solutions/2999-count-the-number-of-powerful-integers.js)|Hard|
 3024|[Type of Triangle](./solutions/3024-type-of-triangle.js)|Easy|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
diff --git a/solutions/2998-minimum-number-of-operations-to-make-x-and-y-equal.js b/solutions/2998-minimum-number-of-operations-to-make-x-and-y-equal.js
new file mode 100644
index 00000000..cc18c133
--- /dev/null
+++ b/solutions/2998-minimum-number-of-operations-to-make-x-and-y-equal.js
@@ -0,0 +1,45 @@
+/**
+ * 2998. Minimum Number of Operations to Make X and Y Equal
+ * https://leetcode.com/problems/minimum-number-of-operations-to-make-x-and-y-equal/
+ * Difficulty: Medium
+ *
+ * You are given two positive integers x and y.
+ *
+ * In one operation, you can do one of the four following operations:
+ * 1. Divide x by 11 if x is a multiple of 11.
+ * 2. Divide x by 5 if x is a multiple of 5.
+ * 3. Decrement x by 1.
+ * 4. Increment x by 1.
+ *
+ * Return the minimum number of operations required to make x and y equal.
+ */
+
+/**
+ * @param {number} x
+ * @param {number} y
+ * @return {number}
+ */
+var minimumOperationsToMakeEqual = function(x, y) {
+  const queue = [[x, 0]];
+  const visited = new Set([x]);
+
+  while (queue.length) {
+    const [current, steps] = queue.shift();
+
+    if (current === y) return steps;
+
+    const nextStates = [];
+    if (current % 11 === 0) nextStates.push(current / 11);
+    if (current % 5 === 0) nextStates.push(current / 5);
+    nextStates.push(current - 1, current + 1);
+
+    for (const next of nextStates) {
+      if (next >= 0 && next <= 10000 && !visited.has(next)) {
+        visited.add(next);
+        queue.push([next, steps + 1]);
+      }
+    }
+  }
+
+  return -1;
+};

From 3f1b60254ef2ca1b45c1ac193f17907c6f843466 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 5 Jun 2025 23:44:28 -0500
Subject: [PATCH 450/571] Add solution #3002

---
 README.md                                     |  1 +
 ...02-maximum-size-of-a-set-after-removals.js | 41 +++++++++++++++++++
 2 files changed, 42 insertions(+)
 create mode 100644 solutions/3002-maximum-size-of-a-set-after-removals.js

diff --git a/README.md b/README.md
index e87bd053..357652eb 100644
--- a/README.md
+++ b/README.md
@@ -2125,6 +2125,7 @@
 2997|[Minimum Number of Operations to Make Array XOR Equal to K](./solutions/2997-minimum-number-of-operations-to-make-array-xor-equal-to-k.js)|Medium|
 2998|[Minimum Number of Operations to Make X and Y Equal](./solutions/2998-minimum-number-of-operations-to-make-x-and-y-equal.js)|Medium|
 2999|[Count the Number of Powerful Integers](./solutions/2999-count-the-number-of-powerful-integers.js)|Hard|
+3002|[Maximum Size of a Set After Removals](./solutions/3002-maximum-size-of-a-set-after-removals.js)|Medium|
 3024|[Type of Triangle](./solutions/3024-type-of-triangle.js)|Easy|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
 3066|[Minimum Operations to Exceed Threshold Value II](./solutions/3066-minimum-operations-to-exceed-threshold-value-ii.js)|Medium|
diff --git a/solutions/3002-maximum-size-of-a-set-after-removals.js b/solutions/3002-maximum-size-of-a-set-after-removals.js
new file mode 100644
index 00000000..66f30fd1
--- /dev/null
+++ b/solutions/3002-maximum-size-of-a-set-after-removals.js
@@ -0,0 +1,41 @@
+/**
+ * 3002. Maximum Size of a Set After Removals
+ * https://leetcode.com/problems/maximum-size-of-a-set-after-removals/
+ * Difficulty: Medium
+ *
+ * You are given two 0-indexed integer arrays nums1 and nums2 of even length n.
+ *
+ * You must remove n / 2 elements from nums1 and n / 2 elements from nums2. After the removals,
+ * you insert the remaining elements of nums1 and nums2 into a set s.
+ *
+ * Return the maximum possible size of the set s.
+ */
+
+/**
+ * @param {number[]} nums1
+ * @param {number[]} nums2
+ * @return {number}
+ */
+var maximumSetSize = function(nums1, nums2) {
+  const n = nums1.length;
+  const set1 = new Set(nums1);
+  const set2 = new Set(nums2);
+
+  let unique1 = set1.size;
+  let unique2 = set2.size;
+  let common = 0;
+
+  for (const num of set1) {
+    if (set2.has(num)) common++;
+  }
+
+  unique1 -= common;
+  unique2 -= common;
+
+  const max1 = Math.min(unique1, n / 2);
+  const max2 = Math.min(unique2, n / 2);
+  const remaining = n / 2 - max1 + n / 2 - max2;
+  const maxCommon = Math.min(common, remaining);
+
+  return max1 + max2 + maxCommon;
+};

From 7cca561752d43c089893e1f1d1174b8ddb1f3ed2 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 5 Jun 2025 23:45:32 -0500
Subject: [PATCH 451/571] Add solution #3005

---
 README.md                                     |  1 +
 ...5-count-elements-with-maximum-frequency.js | 35 +++++++++++++++++++
 2 files changed, 36 insertions(+)
 create mode 100644 solutions/3005-count-elements-with-maximum-frequency.js

diff --git a/README.md b/README.md
index 357652eb..f9b7fbaf 100644
--- a/README.md
+++ b/README.md
@@ -2126,6 +2126,7 @@
 2998|[Minimum Number of Operations to Make X and Y Equal](./solutions/2998-minimum-number-of-operations-to-make-x-and-y-equal.js)|Medium|
 2999|[Count the Number of Powerful Integers](./solutions/2999-count-the-number-of-powerful-integers.js)|Hard|
 3002|[Maximum Size of a Set After Removals](./solutions/3002-maximum-size-of-a-set-after-removals.js)|Medium|
+3005|[Count Elements With Maximum Frequency](./solutions/3005-count-elements-with-maximum-frequency.js)|Easy|
 3024|[Type of Triangle](./solutions/3024-type-of-triangle.js)|Easy|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
 3066|[Minimum Operations to Exceed Threshold Value II](./solutions/3066-minimum-operations-to-exceed-threshold-value-ii.js)|Medium|
diff --git a/solutions/3005-count-elements-with-maximum-frequency.js b/solutions/3005-count-elements-with-maximum-frequency.js
new file mode 100644
index 00000000..cb89603e
--- /dev/null
+++ b/solutions/3005-count-elements-with-maximum-frequency.js
@@ -0,0 +1,35 @@
+/**
+ * 3005. Count Elements With Maximum Frequency
+ * https://leetcode.com/problems/count-elements-with-maximum-frequency/
+ * Difficulty: Easy
+ *
+ * You are given an array nums consisting of positive integers.
+ *
+ * Return the total frequencies of elements in nums such that those elements all have the
+ * maximum frequency.
+ *
+ * The frequency of an element is the number of occurrences of that element in the array.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var maxFrequencyElements = function(nums) {
+  const map = new Map();
+  let maxFreq = 0;
+  let result = 0;
+
+  for (const num of nums) {
+    const count = (map.get(num) || 0) + 1;
+    map.set(num, count);
+    if (count > maxFreq) {
+      maxFreq = count;
+      result = count;
+    } else if (count === maxFreq) {
+      result += count;
+    }
+  }
+
+  return result;
+};

From 9781a2cc5c277763abbf661d6750b0d2b30f7754 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 5 Jun 2025 23:52:12 -0500
Subject: [PATCH 452/571] Add solution #3010

---
 README.md                                     |  1 +
 ...rray-into-subarrays-with-minimum-cost-i.js | 32 +++++++++++++++++++
 2 files changed, 33 insertions(+)
 create mode 100644 solutions/3010-divide-an-array-into-subarrays-with-minimum-cost-i.js

diff --git a/README.md b/README.md
index f9b7fbaf..5c3e6f26 100644
--- a/README.md
+++ b/README.md
@@ -2127,6 +2127,7 @@
 2999|[Count the Number of Powerful Integers](./solutions/2999-count-the-number-of-powerful-integers.js)|Hard|
 3002|[Maximum Size of a Set After Removals](./solutions/3002-maximum-size-of-a-set-after-removals.js)|Medium|
 3005|[Count Elements With Maximum Frequency](./solutions/3005-count-elements-with-maximum-frequency.js)|Easy|
+3010|[Divide an Array Into Subarrays With Minimum Cost I](./solutions/3010-divide-an-array-into-subarrays-with-minimum-cost-i.js)|Easy|
 3024|[Type of Triangle](./solutions/3024-type-of-triangle.js)|Easy|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
 3066|[Minimum Operations to Exceed Threshold Value II](./solutions/3066-minimum-operations-to-exceed-threshold-value-ii.js)|Medium|
diff --git a/solutions/3010-divide-an-array-into-subarrays-with-minimum-cost-i.js b/solutions/3010-divide-an-array-into-subarrays-with-minimum-cost-i.js
new file mode 100644
index 00000000..26a184a5
--- /dev/null
+++ b/solutions/3010-divide-an-array-into-subarrays-with-minimum-cost-i.js
@@ -0,0 +1,32 @@
+/**
+ * 3010. Divide an Array Into Subarrays With Minimum Cost I
+ * https://leetcode.com/problems/divide-an-array-into-subarrays-with-minimum-cost-i/
+ * Difficulty: Easy
+ *
+ * You are given an array of integers nums of length n.
+ *
+ * The cost of an array is the value of its first element. For example, the cost of [1,2,3]
+ * is 1 while the cost of [3,4,1] is 3.
+ *
+ * You need to divide nums into 3 disjoint contiguous subarrays.
+ *
+ * Return the minimum possible sum of the cost of these subarrays.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var minimumCost = function(nums) {
+  const n = nums.length;
+  let result = Infinity;
+
+  for (let i = 1; i < n - 1; i++) {
+    for (let j = i + 1; j < n; j++) {
+      const cost = nums[0] + nums[i] + nums[j];
+      result = Math.min(result, cost);
+    }
+  }
+
+  return result;
+};

From 3e0b7849d652cc73fe4bfab37ee9065eb0101733 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 5 Jun 2025 23:53:37 -0500
Subject: [PATCH 453/571] Add solution #3011

---
 README.md                                     |  1 +
 solutions/3011-find-if-array-can-be-sorted.js | 57 +++++++++++++++++++
 2 files changed, 58 insertions(+)
 create mode 100644 solutions/3011-find-if-array-can-be-sorted.js

diff --git a/README.md b/README.md
index 5c3e6f26..93f75535 100644
--- a/README.md
+++ b/README.md
@@ -2128,6 +2128,7 @@
 3002|[Maximum Size of a Set After Removals](./solutions/3002-maximum-size-of-a-set-after-removals.js)|Medium|
 3005|[Count Elements With Maximum Frequency](./solutions/3005-count-elements-with-maximum-frequency.js)|Easy|
 3010|[Divide an Array Into Subarrays With Minimum Cost I](./solutions/3010-divide-an-array-into-subarrays-with-minimum-cost-i.js)|Easy|
+3011|[Find if Array Can Be Sorted](./solutions/3011-find-if-array-can-be-sorted.js)|Medium|
 3024|[Type of Triangle](./solutions/3024-type-of-triangle.js)|Easy|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
 3066|[Minimum Operations to Exceed Threshold Value II](./solutions/3066-minimum-operations-to-exceed-threshold-value-ii.js)|Medium|
diff --git a/solutions/3011-find-if-array-can-be-sorted.js b/solutions/3011-find-if-array-can-be-sorted.js
new file mode 100644
index 00000000..c395e89e
--- /dev/null
+++ b/solutions/3011-find-if-array-can-be-sorted.js
@@ -0,0 +1,57 @@
+/**
+ * 3011. Find if Array Can Be Sorted
+ * https://leetcode.com/problems/find-if-array-can-be-sorted/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed array of positive integers nums.
+ *
+ * In one operation, you can swap any two adjacent elements if they have the same number of
+ * set bits. You are allowed to do this operation any number of times (including zero).
+ *
+ * Return true if you can sort the array in ascending order, else return false.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {boolean}
+ */
+var canSortArray = function(nums) {
+  const sorted = [...nums].sort((a, b) => a - b);
+  const bitGroups = [];
+  let currentBits = countSetBits(nums[0]);
+  let group = [nums[0]];
+
+  for (let i = 1; i < nums.length; i++) {
+    const bits = countSetBits(nums[i]);
+    if (bits === currentBits) {
+      group.push(nums[i]);
+    } else {
+      bitGroups.push(group);
+      group = [nums[i]];
+      currentBits = bits;
+    }
+  }
+  bitGroups.push(group);
+
+  let index = 0;
+  for (const group of bitGroups) {
+    const groupSorted = [...group].sort((a, b) => a - b);
+    for (const num of groupSorted) {
+      if (num !== sorted[index]) {
+        return false;
+      }
+      index++;
+    }
+  }
+
+  return true;
+
+  function countSetBits(num) {
+    let count = 0;
+    while (num) {
+      count += num & 1;
+      num >>= 1;
+    }
+    return count;
+  }
+};

From 77f8144db97be2a55a224408c29fd43c23ae8ea7 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 6 Jun 2025 00:02:41 -0500
Subject: [PATCH 454/571] Add solution #3014

---
 README.md                                     |  1 +
 ...minimum-number-of-pushes-to-type-word-i.js | 42 +++++++++++++++++++
 2 files changed, 43 insertions(+)
 create mode 100644 solutions/3014-minimum-number-of-pushes-to-type-word-i.js

diff --git a/README.md b/README.md
index 93f75535..4aed3de7 100644
--- a/README.md
+++ b/README.md
@@ -2129,6 +2129,7 @@
 3005|[Count Elements With Maximum Frequency](./solutions/3005-count-elements-with-maximum-frequency.js)|Easy|
 3010|[Divide an Array Into Subarrays With Minimum Cost I](./solutions/3010-divide-an-array-into-subarrays-with-minimum-cost-i.js)|Easy|
 3011|[Find if Array Can Be Sorted](./solutions/3011-find-if-array-can-be-sorted.js)|Medium|
+3014|[Minimum Number of Pushes to Type Word I](./solutions/3014-minimum-number-of-pushes-to-type-word-i.js)|Easy|
 3024|[Type of Triangle](./solutions/3024-type-of-triangle.js)|Easy|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
 3066|[Minimum Operations to Exceed Threshold Value II](./solutions/3066-minimum-operations-to-exceed-threshold-value-ii.js)|Medium|
diff --git a/solutions/3014-minimum-number-of-pushes-to-type-word-i.js b/solutions/3014-minimum-number-of-pushes-to-type-word-i.js
new file mode 100644
index 00000000..347e798e
--- /dev/null
+++ b/solutions/3014-minimum-number-of-pushes-to-type-word-i.js
@@ -0,0 +1,42 @@
+/**
+ * 3014. Minimum Number of Pushes to Type Word I
+ * https://leetcode.com/problems/minimum-number-of-pushes-to-type-word-i/
+ * Difficulty: Easy
+ *
+ * You are given a string word containing distinct lowercase English letters.
+ *
+ * Telephone keypads have keys mapped with distinct collections of lowercase English letters,
+ * which can be used to form words by pushing them. For example, the key 2 is mapped with
+ * ["a","b","c"], we need to push the key one time to type "a", two times to type "b", and
+ * three times to type "c".
+ *
+ * It is allowed to remap the keys numbered 2 to 9 to distinct collections of letters. The
+ * keys can be remapped to any amount of letters, but each letter must be mapped to exactly
+ * one key. You need to find the minimum number of times the keys will be pushed to type
+ * the string word.
+ *
+ * Return the minimum number of pushes needed to type word after remapping the keys.
+ *
+ * An example mapping of letters to keys on a telephone keypad is given below. Note that
+ * 1, *, #, and 0 do not map to any letters.
+ */
+
+/**
+ * @param {string} word
+ * @return {number}
+ */
+var minimumPushes = function(word) {
+  const frequency = new Array(26).fill(0);
+  for (const char of word) {
+    frequency[char.charCodeAt(0) - 97]++;
+  }
+  frequency.sort((a, b) => b - a);
+
+  let result = 0;
+  for (let i = 0; i < frequency.length; i++) {
+    if (frequency[i] === 0) break;
+    result += frequency[i] * (Math.floor(i / 8) + 1);
+  }
+
+  return result;
+};

From e88ca716b3afa194a51e0457b5ee35892c5f90e1 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 6 Jun 2025 00:04:06 -0500
Subject: [PATCH 455/571] Add solution #3015

---
 README.md                                     |  1 +
 ...umber-of-houses-at-a-certain-distance-i.js | 57 +++++++++++++++++++
 2 files changed, 58 insertions(+)
 create mode 100644 solutions/3015-count-the-number-of-houses-at-a-certain-distance-i.js

diff --git a/README.md b/README.md
index 4aed3de7..1482b713 100644
--- a/README.md
+++ b/README.md
@@ -2130,6 +2130,7 @@
 3010|[Divide an Array Into Subarrays With Minimum Cost I](./solutions/3010-divide-an-array-into-subarrays-with-minimum-cost-i.js)|Easy|
 3011|[Find if Array Can Be Sorted](./solutions/3011-find-if-array-can-be-sorted.js)|Medium|
 3014|[Minimum Number of Pushes to Type Word I](./solutions/3014-minimum-number-of-pushes-to-type-word-i.js)|Easy|
+3015|[Count the Number of Houses at a Certain Distance I](./solutions/3015-count-the-number-of-houses-at-a-certain-distance-i.js)|Medium|
 3024|[Type of Triangle](./solutions/3024-type-of-triangle.js)|Easy|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
 3066|[Minimum Operations to Exceed Threshold Value II](./solutions/3066-minimum-operations-to-exceed-threshold-value-ii.js)|Medium|
diff --git a/solutions/3015-count-the-number-of-houses-at-a-certain-distance-i.js b/solutions/3015-count-the-number-of-houses-at-a-certain-distance-i.js
new file mode 100644
index 00000000..02801f91
--- /dev/null
+++ b/solutions/3015-count-the-number-of-houses-at-a-certain-distance-i.js
@@ -0,0 +1,57 @@
+/**
+ * 3015. Count the Number of Houses at a Certain Distance I
+ * https://leetcode.com/problems/count-the-number-of-houses-at-a-certain-distance-i/
+ * Difficulty: Medium
+ *
+ * You are given three positive integers n, x, and y.
+ *
+ * In a city, there exist houses numbered 1 to n connected by n streets. There is a street
+ * connecting the house numbered i with the house numbered i + 1 for all 1 <= i <= n - 1.
+ * An additional street connects the house numbered x with the house numbered y.
+ *
+ * For each k, such that 1 <= k <= n, you need to find the number of pairs of houses (house1,
+ * house2) such that the minimum number of streets that need to be traveled to reach house2
+ * from house1 is k.
+ *
+ * Return a 1-indexed array result of length n where result[k] represents the total number
+ * of pairs of houses such that the minimum streets required to reach one house from the
+ * other is k.
+ *
+ * Note that x and y can be equal.
+ */
+
+/**
+ * @param {number} n
+ * @param {number} x
+ * @param {number} y
+ * @return {number[]}
+ */
+var countOfPairs = function(n, x, y) {
+  const distances = new Array(n + 1).fill().map(() => new Array(n + 1).fill(Infinity));
+
+  for (let i = 1; i <= n; i++) {
+    distances[i][i] = 0;
+    if (i < n) distances[i][i + 1] = distances[i + 1][i] = 1;
+  }
+
+  distances[x][y] = distances[y][x] = 1;
+
+  for (let k = 1; k <= n; k++) {
+    for (let i = 1; i <= n; i++) {
+      for (let j = 1; j <= n; j++) {
+        distances[i][j] = Math.min(distances[i][j], distances[i][k] + distances[k][j]);
+      }
+    }
+  }
+
+  const result = new Array(n + 1).fill(0);
+  for (let i = 1; i <= n; i++) {
+    for (let j = 1; j <= n; j++) {
+      if (i !== j && distances[i][j] !== Infinity) {
+        result[distances[i][j]]++;
+      }
+    }
+  }
+
+  return result.slice(1);
+};

From 003e11f2b3d065b7bc6b0b25892d36fdb6a610d7 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 6 Jun 2025 00:05:38 -0500
Subject: [PATCH 456/571] Add solution #3016

---
 README.md                                     |  1 +
 ...inimum-number-of-pushes-to-type-word-ii.js | 41 +++++++++++++++++++
 2 files changed, 42 insertions(+)
 create mode 100644 solutions/3016-minimum-number-of-pushes-to-type-word-ii.js

diff --git a/README.md b/README.md
index 1482b713..3fcb1a49 100644
--- a/README.md
+++ b/README.md
@@ -2131,6 +2131,7 @@
 3011|[Find if Array Can Be Sorted](./solutions/3011-find-if-array-can-be-sorted.js)|Medium|
 3014|[Minimum Number of Pushes to Type Word I](./solutions/3014-minimum-number-of-pushes-to-type-word-i.js)|Easy|
 3015|[Count the Number of Houses at a Certain Distance I](./solutions/3015-count-the-number-of-houses-at-a-certain-distance-i.js)|Medium|
+3016|[Minimum Number of Pushes to Type Word II](./solutions/3016-minimum-number-of-pushes-to-type-word-ii.js)|Medium|
 3024|[Type of Triangle](./solutions/3024-type-of-triangle.js)|Easy|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
 3066|[Minimum Operations to Exceed Threshold Value II](./solutions/3066-minimum-operations-to-exceed-threshold-value-ii.js)|Medium|
diff --git a/solutions/3016-minimum-number-of-pushes-to-type-word-ii.js b/solutions/3016-minimum-number-of-pushes-to-type-word-ii.js
new file mode 100644
index 00000000..5a54a46c
--- /dev/null
+++ b/solutions/3016-minimum-number-of-pushes-to-type-word-ii.js
@@ -0,0 +1,41 @@
+/**
+ * 3016. Minimum Number of Pushes to Type Word II
+ * https://leetcode.com/problems/minimum-number-of-pushes-to-type-word-ii/
+ * Difficulty: Medium
+ *
+ * You are given a string word containing lowercase English letters.
+ *
+ * Telephone keypads have keys mapped with distinct collections of lowercase English letters,
+ * which can be used to form words by pushing them. For example, the key 2 is mapped with
+ * ["a","b","c"], we need to push the key one time to type "a", two times to type "b", and
+ * three times to type "c".
+ *
+ * It is allowed to remap the keys numbered 2 to 9 to distinct collections of letters. The
+ * keys can be remapped to any amount of letters, but each letter must be mapped to exactly
+ * one key. You need to find the minimum number of times the keys will be pushed to type the
+ * string word.
+ *
+ * Return the minimum number of pushes needed to type word after remapping the keys.
+ *
+ * An example mapping of letters to keys on a telephone keypad is given below. Note that
+ * 1, *, #, and 0 do not map to any letters.
+ */
+
+/**
+ * @param {string} word
+ * @return {number}
+ */
+var minimumPushes = function(word) {
+  const frequency = new Array(26).fill(0);
+  for (const char of word) {
+    frequency[char.charCodeAt(0) - 97]++;
+  }
+  frequency.sort((a, b) => b - a);
+
+  let result = 0;
+  for (let i = 0; i < frequency.length && frequency[i] > 0; i++) {
+    result += frequency[i] * (Math.floor(i / 8) + 1);
+  }
+
+  return result;
+};

From 860a9ce17b3fedd972ce791064b301e1220c4d1b Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 6 Jun 2025 22:38:05 -0500
Subject: [PATCH 457/571] Add solution #3170

---
 README.md                                     |  1 +
 ...lly-minimum-string-after-removing-stars.js | 40 +++++++++++++++++++
 2 files changed, 41 insertions(+)
 create mode 100644 solutions/3170-lexicographically-minimum-string-after-removing-stars.js

diff --git a/README.md b/README.md
index 3fcb1a49..9dcc163a 100644
--- a/README.md
+++ b/README.md
@@ -2142,6 +2142,7 @@
 3151|[Special Array I](./solutions/3151-special-array-i.js)|Easy|
 3160|[Find the Number of Distinct Colors Among the Balls](./solutions/3160-find-the-number-of-distinct-colors-among-the-balls.js)|Medium|
 3169|[Count Days Without Meetings](./solutions/3169-count-days-without-meetings.js)|Medium|
+3170|[Lexicographically Minimum String After Removing Stars](./solutions/3170-lexicographically-minimum-string-after-removing-stars.js)|Medium|
 3174|[Clear Digits](./solutions/3174-clear-digits.js)|Easy|
 3178|[Find the Child Who Has the Ball After K Seconds](./solutions/3178-find-the-child-who-has-the-ball-after-k-seconds.js)|Easy|
 3191|[Minimum Operations to Make Binary Array Elements Equal to One I](./solutions/3191-minimum-operations-to-make-binary-array-elements-equal-to-one-i.js)|Medium|
diff --git a/solutions/3170-lexicographically-minimum-string-after-removing-stars.js b/solutions/3170-lexicographically-minimum-string-after-removing-stars.js
new file mode 100644
index 00000000..c0efec6b
--- /dev/null
+++ b/solutions/3170-lexicographically-minimum-string-after-removing-stars.js
@@ -0,0 +1,40 @@
+/**
+ * 3170. Lexicographically Minimum String After Removing Stars
+ * https://leetcode.com/problems/lexicographically-minimum-string-after-removing-stars/
+ * Difficulty: Medium
+ *
+ * You are given a string s. It may contain any number of '*' characters. Your task is to
+ * remove all '*' characters.
+ *
+ * While there is a '*', do the following operation:
+ * - Delete the leftmost '*' and the smallest non-'*' character to its left. If there are several
+ *   smallest characters, you can delete any of them.
+ *
+ * Return the lexicographically smallest resulting string after removing all '*' characters.
+ */
+
+/**
+ * @param {string} s
+ * @return {string}
+ */
+var clearStars = function(s) {
+  const chars = s.split('');
+  const deleted = new Set();
+  const stacks = new Array(26).fill().map(() => []);
+
+  for (let i = 0; i < s.length; i++) {
+    if (s[i] === '*') {
+      for (let j = 0; j < 26; j++) {
+        if (stacks[j].length) {
+          deleted.add(stacks[j].pop());
+          deleted.add(i);
+          break;
+        }
+      }
+    } else {
+      stacks[s[i].charCodeAt(0) - 97].push(i);
+    }
+  }
+
+  return chars.filter((_, i) => !deleted.has(i)).join('');
+};

From 2fd61650d5528ddcd1fd4af43865629fc167df9b Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 6 Jun 2025 22:41:48 -0500
Subject: [PATCH 458/571] Add solution #3019

---
 README.md                                 |  1 +
 solutions/3019-number-of-changing-keys.js | 30 +++++++++++++++++++++++
 2 files changed, 31 insertions(+)
 create mode 100644 solutions/3019-number-of-changing-keys.js

diff --git a/README.md b/README.md
index 9dcc163a..91036696 100644
--- a/README.md
+++ b/README.md
@@ -2132,6 +2132,7 @@
 3014|[Minimum Number of Pushes to Type Word I](./solutions/3014-minimum-number-of-pushes-to-type-word-i.js)|Easy|
 3015|[Count the Number of Houses at a Certain Distance I](./solutions/3015-count-the-number-of-houses-at-a-certain-distance-i.js)|Medium|
 3016|[Minimum Number of Pushes to Type Word II](./solutions/3016-minimum-number-of-pushes-to-type-word-ii.js)|Medium|
+3019|[Number of Changing Keys](./solutions/3019-number-of-changing-keys.js)|Easy|
 3024|[Type of Triangle](./solutions/3024-type-of-triangle.js)|Easy|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
 3066|[Minimum Operations to Exceed Threshold Value II](./solutions/3066-minimum-operations-to-exceed-threshold-value-ii.js)|Medium|
diff --git a/solutions/3019-number-of-changing-keys.js b/solutions/3019-number-of-changing-keys.js
new file mode 100644
index 00000000..f48c69f0
--- /dev/null
+++ b/solutions/3019-number-of-changing-keys.js
@@ -0,0 +1,30 @@
+/**
+ * 3019. Number of Changing Keys
+ * https://leetcode.com/problems/number-of-changing-keys/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed string s typed by a user. Changing a key is defined as using a key
+ * different from the last used key. For example, s = "ab" has a change of a key while s = "bBBb"
+ * does not have any.
+ *
+ * Return the number of times the user had to change the key.
+ *
+ * Note: Modifiers like shift or caps lock won't be counted in changing the key that is if a user
+ * typed the letter 'a' and then the letter 'A' then it will not be considered as a changing of key.
+ */
+
+/**
+ * @param {string} s
+ * @return {number}
+ */
+var countKeyChanges = function(s) {
+  let result = 0;
+
+  for (let i = 1; i < s.length; i++) {
+    if (s[i].toLowerCase() !== s[i - 1].toLowerCase()) {
+      result++;
+    }
+  }
+
+  return result;
+};

From 510da6865bd40a2f7c5215781668762b2503a8a7 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 6 Jun 2025 22:48:12 -0500
Subject: [PATCH 459/571] Add solution #3021

---
 README.md                                     |  1 +
 .../3021-alice-and-bob-playing-flower-game.js | 37 +++++++++++++++++++
 2 files changed, 38 insertions(+)
 create mode 100644 solutions/3021-alice-and-bob-playing-flower-game.js

diff --git a/README.md b/README.md
index 91036696..ba2bbff4 100644
--- a/README.md
+++ b/README.md
@@ -2133,6 +2133,7 @@
 3015|[Count the Number of Houses at a Certain Distance I](./solutions/3015-count-the-number-of-houses-at-a-certain-distance-i.js)|Medium|
 3016|[Minimum Number of Pushes to Type Word II](./solutions/3016-minimum-number-of-pushes-to-type-word-ii.js)|Medium|
 3019|[Number of Changing Keys](./solutions/3019-number-of-changing-keys.js)|Easy|
+3021|[Alice and Bob Playing Flower Game](./solutions/3021-alice-and-bob-playing-flower-game.js)|Medium|
 3024|[Type of Triangle](./solutions/3024-type-of-triangle.js)|Easy|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
 3066|[Minimum Operations to Exceed Threshold Value II](./solutions/3066-minimum-operations-to-exceed-threshold-value-ii.js)|Medium|
diff --git a/solutions/3021-alice-and-bob-playing-flower-game.js b/solutions/3021-alice-and-bob-playing-flower-game.js
new file mode 100644
index 00000000..4335643c
--- /dev/null
+++ b/solutions/3021-alice-and-bob-playing-flower-game.js
@@ -0,0 +1,37 @@
+/**
+ * 3021. Alice and Bob Playing Flower Game
+ * https://leetcode.com/problems/alice-and-bob-playing-flower-game/
+ * Difficulty: Medium
+ *
+ * Alice and Bob are playing a turn-based game on a circular field surrounded by flowers.
+ * The circle represents the field, and there are x flowers in the clockwise direction
+ * between Alice and Bob, and y flowers in the anti-clockwise direction between them.
+ *
+ * The game proceeds as follows:
+ * 1. Alice takes the first turn.
+ * 2. In each turn, a player must choose either the clockwise or anti-clockwise direction
+ *    and pick one flower from that side.
+ * 3. At the end of the turn, if there are no flowers left at all, the current player
+ *    captures their opponent and wins the game.
+ *
+ * Given two integers, n and m, the task is to compute the number of possible pairs (x, y)
+ * that satisfy the conditions:
+ * - Alice must win the game according to the described rules.
+ * - The number of flowers x in the clockwise direction must be in the range [1,n].
+ * - The number of flowers y in the anti-clockwise direction must be in the range [1,m].
+ *
+ * Return the number of possible pairs (x, y) that satisfy the conditions mentioned in the
+ * statement.
+ */
+
+/**
+ * @param {number} n
+ * @param {number} m
+ * @return {number}
+ */
+var flowerGame = function(n, m) {
+  const evenN = Math.floor(n / 2);
+  const evenM = Math.floor(m / 2);
+
+  return evenN * (m - evenM) + (n - evenN) * evenM;
+};

From b290eacee8bdc4390978caea5addaf2a766ba084 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 6 Jun 2025 22:49:28 -0500
Subject: [PATCH 460/571] Add solution #3025

---
 README.md                                     |  1 +
 ...nd-the-number-of-ways-to-place-people-i.js | 43 +++++++++++++++++++
 2 files changed, 44 insertions(+)
 create mode 100644 solutions/3025-find-the-number-of-ways-to-place-people-i.js

diff --git a/README.md b/README.md
index ba2bbff4..85e644ea 100644
--- a/README.md
+++ b/README.md
@@ -2135,6 +2135,7 @@
 3019|[Number of Changing Keys](./solutions/3019-number-of-changing-keys.js)|Easy|
 3021|[Alice and Bob Playing Flower Game](./solutions/3021-alice-and-bob-playing-flower-game.js)|Medium|
 3024|[Type of Triangle](./solutions/3024-type-of-triangle.js)|Easy|
+3025|[Find the Number of Ways to Place People I](./solutions/3025-find-the-number-of-ways-to-place-people-i.js)|Medium|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
 3066|[Minimum Operations to Exceed Threshold Value II](./solutions/3066-minimum-operations-to-exceed-threshold-value-ii.js)|Medium|
 3068|[Find the Maximum Sum of Node Values](./solutions/3068-find-the-maximum-sum-of-node-values.js)|Hard|
diff --git a/solutions/3025-find-the-number-of-ways-to-place-people-i.js b/solutions/3025-find-the-number-of-ways-to-place-people-i.js
new file mode 100644
index 00000000..d0b579c1
--- /dev/null
+++ b/solutions/3025-find-the-number-of-ways-to-place-people-i.js
@@ -0,0 +1,43 @@
+/**
+ * 3025. Find the Number of Ways to Place People I
+ * https://leetcode.com/problems/find-the-number-of-ways-to-place-people-i/
+ * Difficulty: Medium
+ *
+ * You are given a 2D array points of size n x 2 representing integer coordinates of some points
+ * on a 2D plane, where points[i] = [xi, yi].
+ *
+ * Count the number of pairs of points (A, B), where
+ * - A is on the upper left side of B, and
+ * - there are no other points in the rectangle (or line) they make (including the border).
+ *
+ * Return the count.
+ */
+
+/**
+ * @param {number[][]} points
+ * @return {number}
+ */
+var numberOfPairs = function(points) {
+  points.sort((a, b) => a[0] === b[0] ? b[1] - a[1] : a[0] - b[0]);
+  let result = 0;
+
+  for (let i = 0; i < points.length; i++) {
+    for (let j = i + 1; j < points.length; j++) {
+      if (points[i][1] >= points[j][1]) {
+        let isValid = true;
+        for (let k = 0; k < points.length; k++) {
+          if (k !== i && k !== j) {
+            if (points[k][0] >= points[i][0] && points[k][0] <= points[j][0]
+                && points[k][1] <= points[i][1] && points[k][1] >= points[j][1]) {
+              isValid = false;
+              break;
+            }
+          }
+        }
+        if (isValid) result++;
+      }
+    }
+  }
+
+  return result;
+};

From f57d6169a016738cb770aae86ce001e34c6874e8 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 6 Jun 2025 22:53:25 -0500
Subject: [PATCH 461/571] Add solution #3027

---
 README.md                                     |  1 +
 ...d-the-number-of-ways-to-place-people-ii.js | 68 +++++++++++++++++++
 2 files changed, 69 insertions(+)
 create mode 100644 solutions/3027-find-the-number-of-ways-to-place-people-ii.js

diff --git a/README.md b/README.md
index 85e644ea..8530698d 100644
--- a/README.md
+++ b/README.md
@@ -2136,6 +2136,7 @@
 3021|[Alice and Bob Playing Flower Game](./solutions/3021-alice-and-bob-playing-flower-game.js)|Medium|
 3024|[Type of Triangle](./solutions/3024-type-of-triangle.js)|Easy|
 3025|[Find the Number of Ways to Place People I](./solutions/3025-find-the-number-of-ways-to-place-people-i.js)|Medium|
+3027|[Find the Number of Ways to Place People II](./solutions/3027-find-the-number-of-ways-to-place-people-ii.js)|Hard|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
 3066|[Minimum Operations to Exceed Threshold Value II](./solutions/3066-minimum-operations-to-exceed-threshold-value-ii.js)|Medium|
 3068|[Find the Maximum Sum of Node Values](./solutions/3068-find-the-maximum-sum-of-node-values.js)|Hard|
diff --git a/solutions/3027-find-the-number-of-ways-to-place-people-ii.js b/solutions/3027-find-the-number-of-ways-to-place-people-ii.js
new file mode 100644
index 00000000..6077d142
--- /dev/null
+++ b/solutions/3027-find-the-number-of-ways-to-place-people-ii.js
@@ -0,0 +1,68 @@
+/**
+ * 3027. Find the Number of Ways to Place People II
+ * https://leetcode.com/problems/find-the-number-of-ways-to-place-people-ii/
+ * Difficulty: Hard
+ *
+ * You are given a 2D array points of size n x 2 representing integer coordinates of some points
+ * on a 2D-plane, where points[i] = [xi, yi].
+ *
+ * We define the right direction as positive x-axis (increasing x-coordinate) and the left
+ * direction as negative x-axis (decreasing x-coordinate). Similarly, we define the up direction
+ * as positive y-axis (increasing y-coordinate) and the down direction as negative y-axis
+ * (decreasing y-coordinate)
+ *
+ * You have to place n people, including Alice and Bob, at these points such that there is exactly
+ * one person at every point. Alice wants to be alone with Bob, so Alice will build a rectangular
+ * fence with Alice's position as the upper left corner and Bob's position as the lower right
+ * corner of the fence (Note that the fence might not enclose any area, i.e. it can be a line).
+ * If any person other than Alice and Bob is either inside the fence or on the fence, Alice will
+ * be sad.
+ *
+ * Return the number of pairs of points where you can place Alice and Bob, such that Alice does not
+ * become sad on building the fence.
+ *
+ * Note that Alice can only build a fence with Alice's position as the upper left corner, and Bob's
+ * position as the lower right corner. For example, Alice cannot build either of the fences in the
+ * picture below with four corners (1, 1), (1, 3), (3, 1), and (3, 3), because:
+ * - With Alice at (3, 3) and Bob at (1, 1), Alice's position is not the upper left corner and Bob's
+ *   position is not the lower right corner of the fence.
+ * - With Alice at (1, 3) and Bob at (1, 1), Bob's position is not the lower right corner of the
+ *   fence.
+ */
+
+/**
+ * @param {number[][]} points
+ * @return {number}
+ */
+var numberOfPairs = function(points) {
+  points.sort((a, b) => a[0] === b[0] ? b[1] - a[1] : a[0] - b[0]);
+  let result = 0;
+
+  for (let i = 0; i < points.length; i++) {
+    const [, maxY] = points[i];
+    let minY = -Infinity;
+
+    for (let j = i + 1; j < points.length; j++) {
+      const [, y] = points[j];
+      if (y <= maxY && y > minY) {
+        let isValid = true;
+        for (let k = 0; k < points.length; k++) {
+          if (k !== i && k !== j) {
+            const [x, ky] = points[k];
+            if (x >= points[i][0] && x <= points[j][0]
+                && ky <= points[i][1] && ky >= points[j][1]) {
+              isValid = false;
+              break;
+            }
+          }
+        }
+        if (isValid) {
+          result++;
+          minY = y;
+        }
+      }
+    }
+  }
+
+  return result;
+};

From e81783a8dc1bb79756221bbe4334a5961ee9a9af Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 6 Jun 2025 22:57:58 -0500
Subject: [PATCH 462/571] Add solution #3028

---
 README.md                             |  1 +
 solutions/3028-ant-on-the-boundary.js | 38 +++++++++++++++++++++++++++
 2 files changed, 39 insertions(+)
 create mode 100644 solutions/3028-ant-on-the-boundary.js

diff --git a/README.md b/README.md
index 8530698d..8b032a67 100644
--- a/README.md
+++ b/README.md
@@ -2137,6 +2137,7 @@
 3024|[Type of Triangle](./solutions/3024-type-of-triangle.js)|Easy|
 3025|[Find the Number of Ways to Place People I](./solutions/3025-find-the-number-of-ways-to-place-people-i.js)|Medium|
 3027|[Find the Number of Ways to Place People II](./solutions/3027-find-the-number-of-ways-to-place-people-ii.js)|Hard|
+3028|[Ant on the Boundary](./solutions/3028-ant-on-the-boundary.js)|Easy|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
 3066|[Minimum Operations to Exceed Threshold Value II](./solutions/3066-minimum-operations-to-exceed-threshold-value-ii.js)|Medium|
 3068|[Find the Maximum Sum of Node Values](./solutions/3068-find-the-maximum-sum-of-node-values.js)|Hard|
diff --git a/solutions/3028-ant-on-the-boundary.js b/solutions/3028-ant-on-the-boundary.js
new file mode 100644
index 00000000..fab768da
--- /dev/null
+++ b/solutions/3028-ant-on-the-boundary.js
@@ -0,0 +1,38 @@
+/**
+ * 3028. Ant on the Boundary
+ * https://leetcode.com/problems/ant-on-the-boundary/
+ * Difficulty: Easy
+ *
+ * An ant is on a boundary. It sometimes goes left and sometimes right.
+ *
+ * You are given an array of non-zero integers nums. The ant starts reading nums from the
+ * first element of it to its end. At each step, it moves according to the value of the
+ * current element:
+ * - If nums[i] < 0, it moves left by -nums[i] units.
+ * - If nums[i] > 0, it moves right by nums[i] units.
+ *
+ * Return the number of times the ant returns to the boundary.
+ *
+ * Notes:
+ * - There is an infinite space on both sides of the boundary.
+ * - We check whether the ant is on the boundary only after it has moved |nums[i]| units.
+ *   In other words, if the ant crosses the boundary during its movement, it does not count.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var returnToBoundaryCount = function(nums) {
+  let position = 0;
+  let result = 0;
+
+  for (const step of nums) {
+    position += step;
+    if (position === 0) {
+      result++;
+    }
+  }
+
+  return result;
+};

From e64a4159d399badaa8024e26ce8303c1c27cf2ce Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 6 Jun 2025 22:59:13 -0500
Subject: [PATCH 463/571] Add solution #3029

---
 README.md                                     |  1 +
 ...-time-to-revert-word-to-initial-state-i.js | 33 +++++++++++++++++++
 2 files changed, 34 insertions(+)
 create mode 100644 solutions/3029-minimum-time-to-revert-word-to-initial-state-i.js

diff --git a/README.md b/README.md
index 8b032a67..f4133126 100644
--- a/README.md
+++ b/README.md
@@ -2138,6 +2138,7 @@
 3025|[Find the Number of Ways to Place People I](./solutions/3025-find-the-number-of-ways-to-place-people-i.js)|Medium|
 3027|[Find the Number of Ways to Place People II](./solutions/3027-find-the-number-of-ways-to-place-people-ii.js)|Hard|
 3028|[Ant on the Boundary](./solutions/3028-ant-on-the-boundary.js)|Easy|
+3029|[Minimum Time to Revert Word to Initial State I](./solutions/3029-minimum-time-to-revert-word-to-initial-state-i.js)|Medium|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
 3066|[Minimum Operations to Exceed Threshold Value II](./solutions/3066-minimum-operations-to-exceed-threshold-value-ii.js)|Medium|
 3068|[Find the Maximum Sum of Node Values](./solutions/3068-find-the-maximum-sum-of-node-values.js)|Hard|
diff --git a/solutions/3029-minimum-time-to-revert-word-to-initial-state-i.js b/solutions/3029-minimum-time-to-revert-word-to-initial-state-i.js
new file mode 100644
index 00000000..07d7e492
--- /dev/null
+++ b/solutions/3029-minimum-time-to-revert-word-to-initial-state-i.js
@@ -0,0 +1,33 @@
+/**
+ * 3029. Minimum Time to Revert Word to Initial State I
+ * https://leetcode.com/problems/minimum-time-to-revert-word-to-initial-state-i/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed string word and an integer k.
+ *
+ * At every second, you must perform the following operations:
+ * - Remove the first k characters of word.
+ * - Add any k characters to the end of word.
+ *
+ * Note that you do not necessarily need to add the same characters that you removed.
+ * However, you must perform both operations at every second.
+ *
+ * Return the minimum time greater than zero required for word to revert to its initial state.
+ */
+
+/**
+ * @param {string} word
+ * @param {number} k
+ * @return {number}
+ */
+var minimumTimeToInitialState = function(word, k) {
+  const n = word.length;
+
+  for (let i = 1; i * k <= n; i++) {
+    if (word.slice(i * k) === word.slice(0, n - i * k)) {
+      return i;
+    }
+  }
+
+  return Math.ceil(n / k);
+};

From b916175568720fdf0d3fe35b157c91cc329ba50c Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 6 Jun 2025 23:08:50 -0500
Subject: [PATCH 464/571] Add solution #3030

---
 README.md                                     |  1 +
 .../3030-find-the-grid-of-region-average.js   | 94 +++++++++++++++++++
 2 files changed, 95 insertions(+)
 create mode 100644 solutions/3030-find-the-grid-of-region-average.js

diff --git a/README.md b/README.md
index f4133126..1b22f69a 100644
--- a/README.md
+++ b/README.md
@@ -2139,6 +2139,7 @@
 3027|[Find the Number of Ways to Place People II](./solutions/3027-find-the-number-of-ways-to-place-people-ii.js)|Hard|
 3028|[Ant on the Boundary](./solutions/3028-ant-on-the-boundary.js)|Easy|
 3029|[Minimum Time to Revert Word to Initial State I](./solutions/3029-minimum-time-to-revert-word-to-initial-state-i.js)|Medium|
+3030|[Find the Grid of Region Average](./solutions/3030-find-the-grid-of-region-average.js)|Medium|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
 3066|[Minimum Operations to Exceed Threshold Value II](./solutions/3066-minimum-operations-to-exceed-threshold-value-ii.js)|Medium|
 3068|[Find the Maximum Sum of Node Values](./solutions/3068-find-the-maximum-sum-of-node-values.js)|Hard|
diff --git a/solutions/3030-find-the-grid-of-region-average.js b/solutions/3030-find-the-grid-of-region-average.js
new file mode 100644
index 00000000..d15b7ada
--- /dev/null
+++ b/solutions/3030-find-the-grid-of-region-average.js
@@ -0,0 +1,94 @@
+/**
+ * 3030. Find the Grid of Region Average
+ * https://leetcode.com/problems/find-the-grid-of-region-average/
+ * Difficulty: Medium
+ *
+ * You are given m x n grid image which represents a grayscale image, where image[i][j]
+ * represents a pixel with intensity in the range [0..255]. You are also given a non-negative
+ * integer threshold.
+ *
+ * Two pixels are adjacent if they share an edge.
+ *
+ * A region is a 3 x 3 subgrid where the absolute difference in intensity between any two
+ * adjacent pixels is less than or equal to threshold.
+ *
+ * All pixels in a region belong to that region, note that a pixel can belong to multiple regions.
+ *
+ * You need to calculate a m x n grid result, where result[i][j] is the average intensity of the
+ * regions to which image[i][j] belongs, rounded down to the nearest integer. If image[i][j]
+ * belongs to multiple regions, result[i][j] is the average of the rounded-down average intensities
+ * of these regions, rounded down to the nearest integer. If image[i][j] does not belong to any
+ * region, result[i][j] is equal to image[i][j].
+ *
+ * Return the grid result.
+ */
+
+/**
+ * @param {number[][]} image
+ * @param {number} threshold
+ * @return {number[][]}
+ */
+var resultGrid = function(image, threshold) {
+  const rows = image.length;
+  const cols = image[0].length;
+  const result = Array.from({ length: rows }, () => new Array(cols).fill(0));
+  const regionCount = Array.from({ length: rows }, () => new Array(cols).fill(0));
+
+  for (let i = 0; i <= rows - 3; i++) {
+    for (let j = 0; j <= cols - 3; j++) {
+      if (isValidRegion(i, j)) {
+        const regionAvg = calculateRegionAverage(i, j);
+
+        for (let r = i; r < i + 3; r++) {
+          for (let c = j; c < j + 3; c++) {
+            result[r][c] += regionAvg;
+            regionCount[r][c]++;
+          }
+        }
+      }
+    }
+  }
+
+  for (let i = 0; i < rows; i++) {
+    for (let j = 0; j < cols; j++) {
+      if (regionCount[i][j] === 0) {
+        result[i][j] = image[i][j];
+      } else {
+        result[i][j] = Math.floor(result[i][j] / regionCount[i][j]);
+      }
+    }
+  }
+
+  return result;
+
+  function calculateRegionAverage(startRow, startCol) {
+    let sum = 0;
+    for (let i = startRow; i < startRow + 3; i++) {
+      for (let j = startCol; j < startCol + 3; j++) {
+        sum += image[i][j];
+      }
+    }
+    return Math.floor(sum / 9);
+  }
+
+  function isValidRegion(startRow, startCol) {
+    const directions = [[-1, 0], [1, 0], [0, -1], [0, 1]];
+
+    for (let i = startRow; i < startRow + 3; i++) {
+      for (let j = startCol; j < startCol + 3; j++) {
+        for (const [dr, dc] of directions) {
+          const newRow = i + dr;
+          const newCol = j + dc;
+
+          if (newRow >= startRow && newRow < startRow + 3
+              && newCol >= startCol && newCol < startCol + 3) {
+            if (Math.abs(image[i][j] - image[newRow][newCol]) > threshold) {
+              return false;
+            }
+          }
+        }
+      }
+    }
+    return true;
+  }
+};

From 193e5382e211eaa392fc467298ddc95e46f4c050 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 6 Jun 2025 23:09:55 -0500
Subject: [PATCH 465/571] Add solution #3033

---
 README.md                           |  1 +
 solutions/3033-modify-the-matrix.js | 38 +++++++++++++++++++++++++++++
 2 files changed, 39 insertions(+)
 create mode 100644 solutions/3033-modify-the-matrix.js

diff --git a/README.md b/README.md
index 1b22f69a..5813ec55 100644
--- a/README.md
+++ b/README.md
@@ -2140,6 +2140,7 @@
 3028|[Ant on the Boundary](./solutions/3028-ant-on-the-boundary.js)|Easy|
 3029|[Minimum Time to Revert Word to Initial State I](./solutions/3029-minimum-time-to-revert-word-to-initial-state-i.js)|Medium|
 3030|[Find the Grid of Region Average](./solutions/3030-find-the-grid-of-region-average.js)|Medium|
+3033|[Modify the Matrix](./solutions/3033-modify-the-matrix.js)|Easy|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
 3066|[Minimum Operations to Exceed Threshold Value II](./solutions/3066-minimum-operations-to-exceed-threshold-value-ii.js)|Medium|
 3068|[Find the Maximum Sum of Node Values](./solutions/3068-find-the-maximum-sum-of-node-values.js)|Hard|
diff --git a/solutions/3033-modify-the-matrix.js b/solutions/3033-modify-the-matrix.js
new file mode 100644
index 00000000..6d8b09ab
--- /dev/null
+++ b/solutions/3033-modify-the-matrix.js
@@ -0,0 +1,38 @@
+/**
+ * 3033. Modify the Matrix
+ * https://leetcode.com/problems/modify-the-matrix/
+ * Difficulty: Easy
+ *
+ * Given a 0-indexed m x n integer matrix matrix, create a new 0-indexed matrix called answer.
+ * Make answer equal to matrix, then replace each element with the value -1 with the maximum
+ * element in its respective column.
+ *
+ * Return the matrix answer.
+ */
+
+/**
+ * @param {number[][]} matrix
+ * @return {number[][]}
+ */
+var modifiedMatrix = function(matrix) {
+  const m = matrix.length;
+  const n = matrix[0].length;
+  const result = matrix.map(row => [...row]);
+  const colMaxes = new Array(n).fill(-Infinity);
+
+  for (let j = 0; j < n; j++) {
+    for (let i = 0; i < m; i++) {
+      colMaxes[j] = Math.max(colMaxes[j], matrix[i][j]);
+    }
+  }
+
+  for (let i = 0; i < m; i++) {
+    for (let j = 0; j < n; j++) {
+      if (result[i][j] === -1) {
+        result[i][j] = colMaxes[j];
+      }
+    }
+  }
+
+  return result;
+};

From 9f5c2a6feea84705f50bb59ae6513df99380519b Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 6 Jun 2025 23:13:06 -0500
Subject: [PATCH 466/571] Add solution #3034

---
 README.md                                     |  1 +
 ...ber-of-subarrays-that-match-a-pattern-i.js | 41 +++++++++++++++++++
 2 files changed, 42 insertions(+)
 create mode 100644 solutions/3034-number-of-subarrays-that-match-a-pattern-i.js

diff --git a/README.md b/README.md
index 5813ec55..8156f858 100644
--- a/README.md
+++ b/README.md
@@ -2141,6 +2141,7 @@
 3029|[Minimum Time to Revert Word to Initial State I](./solutions/3029-minimum-time-to-revert-word-to-initial-state-i.js)|Medium|
 3030|[Find the Grid of Region Average](./solutions/3030-find-the-grid-of-region-average.js)|Medium|
 3033|[Modify the Matrix](./solutions/3033-modify-the-matrix.js)|Easy|
+3034|[Number of Subarrays That Match a Pattern I](./solutions/3034-number-of-subarrays-that-match-a-pattern-i.js)|Medium|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
 3066|[Minimum Operations to Exceed Threshold Value II](./solutions/3066-minimum-operations-to-exceed-threshold-value-ii.js)|Medium|
 3068|[Find the Maximum Sum of Node Values](./solutions/3068-find-the-maximum-sum-of-node-values.js)|Hard|
diff --git a/solutions/3034-number-of-subarrays-that-match-a-pattern-i.js b/solutions/3034-number-of-subarrays-that-match-a-pattern-i.js
new file mode 100644
index 00000000..d95a2c36
--- /dev/null
+++ b/solutions/3034-number-of-subarrays-that-match-a-pattern-i.js
@@ -0,0 +1,41 @@
+/**
+ * 3034. Number of Subarrays That Match a Pattern I
+ * https://leetcode.com/problems/number-of-subarrays-that-match-a-pattern-i/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed integer array nums of size n, and a 0-indexed integer array pattern
+ * of size m consisting of integers -1, 0, and 1.
+ *
+ * A subarray nums[i..j] of size m + 1 is said to match the pattern if the following conditions
+ * hold for each element pattern[k]:
+ * - nums[i + k + 1] > nums[i + k] if pattern[k] == 1.
+ * - nums[i + k + 1] == nums[i + k] if pattern[k] == 0.
+ * - nums[i + k + 1] < nums[i + k] if pattern[k] == -1.
+ *
+ * Return the count of subarrays in nums that match the pattern.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number[]} pattern
+ * @return {number}
+ */
+var countMatchingSubarrays = function(nums, pattern) {
+  let result = 0;
+  const m = pattern.length;
+
+  for (let i = 0; i <= nums.length - m - 1; i++) {
+    let isMatch = true;
+    for (let j = 0; j < m; j++) {
+      const diff = nums[i + j + 1] - nums[i + j];
+      if ((pattern[j] === 1 && diff <= 0) || (pattern[j] === 0 && diff !== 0)
+          || (pattern[j] === -1 && diff >= 0)) {
+        isMatch = false;
+        break;
+      }
+    }
+    if (isMatch) result++;
+  }
+
+  return result;
+};

From eb7252f6dea5fd4c8f636b4d0bdbca4baad342aa Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 6 Jun 2025 23:17:41 -0500
Subject: [PATCH 467/571] Add solution #3035

---
 README.md                                     |  1 +
 ...35-maximum-palindromes-after-operations.js | 46 +++++++++++++++++++
 2 files changed, 47 insertions(+)
 create mode 100644 solutions/3035-maximum-palindromes-after-operations.js

diff --git a/README.md b/README.md
index 8156f858..0564b6f9 100644
--- a/README.md
+++ b/README.md
@@ -2142,6 +2142,7 @@
 3030|[Find the Grid of Region Average](./solutions/3030-find-the-grid-of-region-average.js)|Medium|
 3033|[Modify the Matrix](./solutions/3033-modify-the-matrix.js)|Easy|
 3034|[Number of Subarrays That Match a Pattern I](./solutions/3034-number-of-subarrays-that-match-a-pattern-i.js)|Medium|
+3035|[Maximum Palindromes After Operations](./solutions/3035-maximum-palindromes-after-operations.js)|Medium|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
 3066|[Minimum Operations to Exceed Threshold Value II](./solutions/3066-minimum-operations-to-exceed-threshold-value-ii.js)|Medium|
 3068|[Find the Maximum Sum of Node Values](./solutions/3068-find-the-maximum-sum-of-node-values.js)|Hard|
diff --git a/solutions/3035-maximum-palindromes-after-operations.js b/solutions/3035-maximum-palindromes-after-operations.js
new file mode 100644
index 00000000..8897c387
--- /dev/null
+++ b/solutions/3035-maximum-palindromes-after-operations.js
@@ -0,0 +1,46 @@
+/**
+ * 3035. Maximum Palindromes After Operations
+ * https://leetcode.com/problems/maximum-palindromes-after-operations/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed string array words having length n and containing 0-indexed strings.
+ *
+ * You are allowed to perform the following operation any number of times (including zero):
+ * - Choose integers i, j, x, and y such that 0 <= i, j < n, 0 <= x < words[i].length,
+ *   0 <= y < words[j].length, and swap the characters words[i][x] and words[j][y].
+ *
+ * Return an integer denoting the maximum number of palindromes words can contain, after performing
+ * some operations.
+ *
+ * Note: i and j may be equal during an operation.
+ */
+
+/**
+ * @param {string[]} words
+ * @return {number}
+ */
+var maxPalindromesAfterOperations = function(words) {
+  const charCount = new Array(26).fill(0);
+  let pairCount = 0;
+  let result = 0;
+
+  for (const word of words) {
+    for (const char of word) {
+      charCount[char.charCodeAt(0) - 97]++;
+    }
+  }
+
+  for (const count of charCount) {
+    pairCount += Math.floor(count / 2);
+  }
+
+  const lengths = words.map(word => word.length).sort((a, b) => a - b);
+  for (const length of lengths) {
+    if (pairCount >= Math.floor(length / 2)) {
+      pairCount -= Math.floor(length / 2);
+      result++;
+    }
+  }
+
+  return result;
+};

From 63bb953726f8d4d43f6e137e7df5da6ad588b727 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 6 Jun 2025 23:18:39 -0500
Subject: [PATCH 468/571] Add solution #3038

---
 README.md                                     |  1 +
 ...ber-of-operations-with-the-same-score-i.js | 33 +++++++++++++++++++
 2 files changed, 34 insertions(+)
 create mode 100644 solutions/3038-maximum-number-of-operations-with-the-same-score-i.js

diff --git a/README.md b/README.md
index 0564b6f9..c3883230 100644
--- a/README.md
+++ b/README.md
@@ -2143,6 +2143,7 @@
 3033|[Modify the Matrix](./solutions/3033-modify-the-matrix.js)|Easy|
 3034|[Number of Subarrays That Match a Pattern I](./solutions/3034-number-of-subarrays-that-match-a-pattern-i.js)|Medium|
 3035|[Maximum Palindromes After Operations](./solutions/3035-maximum-palindromes-after-operations.js)|Medium|
+3038|[Maximum Number of Operations With the Same Score I](./solutions/3038-maximum-number-of-operations-with-the-same-score-i.js)|Easy|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
 3066|[Minimum Operations to Exceed Threshold Value II](./solutions/3066-minimum-operations-to-exceed-threshold-value-ii.js)|Medium|
 3068|[Find the Maximum Sum of Node Values](./solutions/3068-find-the-maximum-sum-of-node-values.js)|Hard|
diff --git a/solutions/3038-maximum-number-of-operations-with-the-same-score-i.js b/solutions/3038-maximum-number-of-operations-with-the-same-score-i.js
new file mode 100644
index 00000000..d1e825cb
--- /dev/null
+++ b/solutions/3038-maximum-number-of-operations-with-the-same-score-i.js
@@ -0,0 +1,33 @@
+/**
+ * 3038. Maximum Number of Operations With the Same Score I
+ * https://leetcode.com/problems/maximum-number-of-operations-with-the-same-score-i/
+ * Difficulty: Easy
+ *
+ * You are given an array of integers nums. Consider the following operation:
+ * - Delete the first two elements nums and define the score of the operation as the sum of
+ *   these two elements.
+ *
+ * You can perform this operation until nums contains fewer than two elements. Additionally,
+ * the same score must be achieved in all operations.
+ *
+ * Return the maximum number of operations you can perform.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var maxOperations = function(nums) {
+  let result = 0;
+  const targetScore = nums[0] + nums[1];
+
+  for (let i = 0; i < nums.length - 1; i += 2) {
+    if (nums[i] + nums[i + 1] === targetScore) {
+      result++;
+    } else {
+      break;
+    }
+  }
+
+  return result;
+};

From 9c7788b880aa3d8ed355bc0a6b4a86fa7cf935ab Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 6 Jun 2025 23:19:52 -0500
Subject: [PATCH 469/571] Add solution #3039

---
 README.md                                     |  1 +
 ...9-apply-operations-to-make-string-empty.js | 45 +++++++++++++++++++
 2 files changed, 46 insertions(+)
 create mode 100644 solutions/3039-apply-operations-to-make-string-empty.js

diff --git a/README.md b/README.md
index c3883230..d5744f10 100644
--- a/README.md
+++ b/README.md
@@ -2144,6 +2144,7 @@
 3034|[Number of Subarrays That Match a Pattern I](./solutions/3034-number-of-subarrays-that-match-a-pattern-i.js)|Medium|
 3035|[Maximum Palindromes After Operations](./solutions/3035-maximum-palindromes-after-operations.js)|Medium|
 3038|[Maximum Number of Operations With the Same Score I](./solutions/3038-maximum-number-of-operations-with-the-same-score-i.js)|Easy|
+3039|[Apply Operations to Make String Empty](./solutions/3039-apply-operations-to-make-string-empty.js)|Medium|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
 3066|[Minimum Operations to Exceed Threshold Value II](./solutions/3066-minimum-operations-to-exceed-threshold-value-ii.js)|Medium|
 3068|[Find the Maximum Sum of Node Values](./solutions/3068-find-the-maximum-sum-of-node-values.js)|Hard|
diff --git a/solutions/3039-apply-operations-to-make-string-empty.js b/solutions/3039-apply-operations-to-make-string-empty.js
new file mode 100644
index 00000000..82cc2e56
--- /dev/null
+++ b/solutions/3039-apply-operations-to-make-string-empty.js
@@ -0,0 +1,45 @@
+/**
+ * 3039. Apply Operations to Make String Empty
+ * https://leetcode.com/problems/apply-operations-to-make-string-empty/
+ * Difficulty: Medium
+ *
+ * You are given a string s.
+ *
+ * Consider performing the following operation until s becomes empty:
+ * - For every alphabet character from 'a' to 'z', remove the first occurrence of that
+ *   character in s (if it exists).
+ *
+ * For example, let initially s = "aabcbbca". We do the following operations:
+ * - Remove the underlined characters s = "aabcbbca". The resulting string is s = "abbca".
+ * - Remove the underlined characters s = "abbca". The resulting string is s = "ba".
+ * - Remove the underlined characters s = "ba". The resulting string is s = "".
+ *
+ * Return the value of the string s right before applying the last operation. In the
+ * example above, answer is "ba".
+ */
+
+/**
+ * @param {string} s
+ * @return {string}
+ */
+var lastNonEmptyString = function(s) {
+  const charCount = new Array(26).fill(0);
+  let maxFrequency = 0;
+
+  for (const char of s) {
+    const index = char.charCodeAt(0) - 97;
+    charCount[index]++;
+    maxFrequency = Math.max(maxFrequency, charCount[index]);
+  }
+
+  let result = '';
+  for (let i = s.length - 1; i >= 0; i--) {
+    const index = s.charCodeAt(i) - 97;
+    if (charCount[index] === maxFrequency) {
+      result = s[i] + result;
+      charCount[index]--;
+    }
+  }
+
+  return result;
+};

From f1f4f70b52340a97becf997430adddec83ce1b4e Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 6 Jun 2025 23:21:02 -0500
Subject: [PATCH 470/571] Add solution #3043

---
 README.md                                     |  1 +
 ...the-length-of-the-longest-common-prefix.js | 50 +++++++++++++++++++
 2 files changed, 51 insertions(+)
 create mode 100644 solutions/3043-find-the-length-of-the-longest-common-prefix.js

diff --git a/README.md b/README.md
index d5744f10..e638c748 100644
--- a/README.md
+++ b/README.md
@@ -2146,6 +2146,7 @@
 3038|[Maximum Number of Operations With the Same Score I](./solutions/3038-maximum-number-of-operations-with-the-same-score-i.js)|Easy|
 3039|[Apply Operations to Make String Empty](./solutions/3039-apply-operations-to-make-string-empty.js)|Medium|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
+3043|[Find the Length of the Longest Common Prefix](./solutions/3043-find-the-length-of-the-longest-common-prefix.js)|Medium|
 3066|[Minimum Operations to Exceed Threshold Value II](./solutions/3066-minimum-operations-to-exceed-threshold-value-ii.js)|Medium|
 3068|[Find the Maximum Sum of Node Values](./solutions/3068-find-the-maximum-sum-of-node-values.js)|Hard|
 3105|[Longest Strictly Increasing or Strictly Decreasing Subarray](./solutions/3105-longest-strictly-increasing-or-strictly-decreasing-subarray.js)|Easy|
diff --git a/solutions/3043-find-the-length-of-the-longest-common-prefix.js b/solutions/3043-find-the-length-of-the-longest-common-prefix.js
new file mode 100644
index 00000000..13ad3b97
--- /dev/null
+++ b/solutions/3043-find-the-length-of-the-longest-common-prefix.js
@@ -0,0 +1,50 @@
+/**
+ * 3043. Find the Length of the Longest Common Prefix
+ * https://leetcode.com/problems/find-the-length-of-the-longest-common-prefix/
+ * Difficulty: Medium
+ *
+ * You are given two arrays with positive integers arr1 and arr2.
+ *
+ * A prefix of a positive integer is an integer formed by one or more of its digits, starting
+ * from its leftmost digit. For example, 123 is a prefix of the integer 12345, while 234 is not.
+ *
+ * A common prefix of two integers a and b is an integer c, such that c is a prefix of both a
+ * and b. For example, 5655359 and 56554 have common prefixes 565 and 5655 while 1223 and 43456
+ * do not have a common prefix.
+ *
+ * You need to find the length of the longest common prefix between all pairs of integers (x, y)
+ * such that x belongs to arr1 and y belongs to arr2.
+ *
+ * Return the length of the longest common prefix among all pairs. If no common prefix exists
+ * among them, return 0.
+ */
+
+/**
+ * @param {number[]} arr1
+ * @param {number[]} arr2
+ * @return {number}
+ */
+var longestCommonPrefix = function(arr1, arr2) {
+  const prefixSet = new Set();
+  let result = 0;
+
+  for (const num of arr1) {
+    let prefix = num;
+    while (prefix > 0) {
+      prefixSet.add(prefix);
+      prefix = Math.floor(prefix / 10);
+    }
+  }
+
+  for (const num of arr2) {
+    let prefix = num;
+    while (prefix > 0) {
+      if (prefixSet.has(prefix)) {
+        result = Math.max(result, String(prefix).length);
+      }
+      prefix = Math.floor(prefix / 10);
+    }
+  }
+
+  return result;
+};

From 98717e60f120f4490a8806a2daa1885d6552cbb9 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 6 Jun 2025 23:22:21 -0500
Subject: [PATCH 471/571] Add solution #3044

---
 README.md                             |  1 +
 solutions/3044-most-frequent-prime.js | 68 +++++++++++++++++++++++++++
 2 files changed, 69 insertions(+)
 create mode 100644 solutions/3044-most-frequent-prime.js

diff --git a/README.md b/README.md
index e638c748..b02dc685 100644
--- a/README.md
+++ b/README.md
@@ -2147,6 +2147,7 @@
 3039|[Apply Operations to Make String Empty](./solutions/3039-apply-operations-to-make-string-empty.js)|Medium|
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
 3043|[Find the Length of the Longest Common Prefix](./solutions/3043-find-the-length-of-the-longest-common-prefix.js)|Medium|
+3044|[Most Frequent Prime](./solutions/3044-most-frequent-prime.js)|Medium|
 3066|[Minimum Operations to Exceed Threshold Value II](./solutions/3066-minimum-operations-to-exceed-threshold-value-ii.js)|Medium|
 3068|[Find the Maximum Sum of Node Values](./solutions/3068-find-the-maximum-sum-of-node-values.js)|Hard|
 3105|[Longest Strictly Increasing or Strictly Decreasing Subarray](./solutions/3105-longest-strictly-increasing-or-strictly-decreasing-subarray.js)|Easy|
diff --git a/solutions/3044-most-frequent-prime.js b/solutions/3044-most-frequent-prime.js
new file mode 100644
index 00000000..cde4f2e9
--- /dev/null
+++ b/solutions/3044-most-frequent-prime.js
@@ -0,0 +1,68 @@
+/**
+ * 3044. Most Frequent Prime
+ * https://leetcode.com/problems/most-frequent-prime/
+ * Difficulty: Medium
+ *
+ * You are given a m x n 0-indexed 2D matrix mat. From every cell, you can create numbers
+ * in the following way:
+ * - There could be at most 8 paths from the cells namely: east, south-east, south, south-west,
+ *   west, north-west, north, and north-east.
+ * - Select a path from them and append digits in this path to the number being formed by
+ *   traveling in this direction.
+ * - Note that numbers are generated at every step, for example, if the digits along the path
+ *   are 1, 9, 1, then there will be three numbers generated along the way: 1, 19, 191.
+ *
+ * Return the most frequent prime number greater than 10 out of all the numbers created by
+ * traversing the matrix or -1 if no such prime number exists. If there are multiple prime
+ * numbers with the highest frequency, then return the largest among them.
+ *
+ * Note: It is invalid to change the direction during the move.
+ */
+
+/**
+ * @param {number[][]} mat
+ * @return {number}
+ */
+var mostFrequentPrime = function(mat) {
+  const m = mat.length;
+  const n = mat[0].length;
+  const frequency = new Map();
+  const directions = [[0, 1], [1, 1], [1, 0], [1, -1], [0, -1], [-1, -1], [-1, 0], [-1, 1]];
+
+  const isPrime = num => {
+    if (num <= 1) return false;
+    for (let i = 2; i * i <= num; i++) {
+      if (num % i === 0) return false;
+    }
+    return true;
+  };
+
+  for (let i = 0; i < m; i++) {
+    for (let j = 0; j < n; j++) {
+      for (const [dx, dy] of directions) {
+        let x = i;
+        let y = j;
+        let num = 0;
+        while (x >= 0 && x < m && y >= 0 && y < n) {
+          num = num * 10 + mat[x][y];
+          if (num > 10 && isPrime(num)) {
+            frequency.set(num, (frequency.get(num) || 0) + 1);
+          }
+          x += dx;
+          y += dy;
+        }
+      }
+    }
+  }
+
+  let maxFreq = 0;
+  let result = -1;
+  for (const [num, freq] of frequency) {
+    if (freq > maxFreq || (freq === maxFreq && num > result)) {
+      maxFreq = freq;
+      result = num;
+    }
+  }
+
+  return result;
+};

From 8a0613b6c20bca61b40d45f491ea59ce35583f5a Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 7 Jun 2025 23:44:17 -0500
Subject: [PATCH 472/571] Add solution #3046

---
 README.md                         |  1 +
 solutions/3046-split-the-array.js | 28 ++++++++++++++++++++++++++++
 2 files changed, 29 insertions(+)
 create mode 100644 solutions/3046-split-the-array.js

diff --git a/README.md b/README.md
index b02dc685..2a09b6a0 100644
--- a/README.md
+++ b/README.md
@@ -2148,6 +2148,7 @@
 3042|[Count Prefix and Suffix Pairs I](./solutions/3042-count-prefix-and-suffix-pairs-i.js)|Easy|
 3043|[Find the Length of the Longest Common Prefix](./solutions/3043-find-the-length-of-the-longest-common-prefix.js)|Medium|
 3044|[Most Frequent Prime](./solutions/3044-most-frequent-prime.js)|Medium|
+3046|[Split the Array](./solutions/3046-split-the-array.js)|Easy|
 3066|[Minimum Operations to Exceed Threshold Value II](./solutions/3066-minimum-operations-to-exceed-threshold-value-ii.js)|Medium|
 3068|[Find the Maximum Sum of Node Values](./solutions/3068-find-the-maximum-sum-of-node-values.js)|Hard|
 3105|[Longest Strictly Increasing or Strictly Decreasing Subarray](./solutions/3105-longest-strictly-increasing-or-strictly-decreasing-subarray.js)|Easy|
diff --git a/solutions/3046-split-the-array.js b/solutions/3046-split-the-array.js
new file mode 100644
index 00000000..14f28868
--- /dev/null
+++ b/solutions/3046-split-the-array.js
@@ -0,0 +1,28 @@
+/**
+ * 3046. Split the Array
+ * https://leetcode.com/problems/split-the-array/
+ * Difficulty: Easy
+ *
+ * You are given an integer array nums of even length. You have to split the array into two
+ * parts nums1 and nums2 such that:
+ * - nums1.length == nums2.length == nums.length / 2.
+ * - nums1 should contain distinct elements.
+ * - nums2 should also contain distinct elements.
+ *
+ * Return true if it is possible to split the array, and false otherwise.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {boolean}
+ */
+var isPossibleToSplit = function(nums) {
+  const map = new Map();
+
+  for (const num of nums) {
+    map.set(num, (map.get(num) || 0) + 1);
+    if (map.get(num) > 2) return false;
+  }
+
+  return true;
+};

From 6c1c55a62911bf84186e231ae154ed6fd88cbb81 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 7 Jun 2025 23:45:25 -0500
Subject: [PATCH 473/571] Add solution #3047

---
 README.md                                     |  1 +
 ...st-area-of-square-inside-two-rectangles.js | 39 +++++++++++++++++++
 2 files changed, 40 insertions(+)
 create mode 100644 solutions/3047-find-the-largest-area-of-square-inside-two-rectangles.js

diff --git a/README.md b/README.md
index 2a09b6a0..83285a3b 100644
--- a/README.md
+++ b/README.md
@@ -2149,6 +2149,7 @@
 3043|[Find the Length of the Longest Common Prefix](./solutions/3043-find-the-length-of-the-longest-common-prefix.js)|Medium|
 3044|[Most Frequent Prime](./solutions/3044-most-frequent-prime.js)|Medium|
 3046|[Split the Array](./solutions/3046-split-the-array.js)|Easy|
+3047|[Find the Largest Area of Square Inside Two Rectangles](./solutions/3047-find-the-largest-area-of-square-inside-two-rectangles.js)|Medium|
 3066|[Minimum Operations to Exceed Threshold Value II](./solutions/3066-minimum-operations-to-exceed-threshold-value-ii.js)|Medium|
 3068|[Find the Maximum Sum of Node Values](./solutions/3068-find-the-maximum-sum-of-node-values.js)|Hard|
 3105|[Longest Strictly Increasing or Strictly Decreasing Subarray](./solutions/3105-longest-strictly-increasing-or-strictly-decreasing-subarray.js)|Easy|
diff --git a/solutions/3047-find-the-largest-area-of-square-inside-two-rectangles.js b/solutions/3047-find-the-largest-area-of-square-inside-two-rectangles.js
new file mode 100644
index 00000000..7075570e
--- /dev/null
+++ b/solutions/3047-find-the-largest-area-of-square-inside-two-rectangles.js
@@ -0,0 +1,39 @@
+/**
+ * 3047. Find the Largest Area of Square Inside Two Rectangles
+ * https://leetcode.com/problems/find-the-largest-area-of-square-inside-two-rectangles/
+ * Difficulty: Medium
+ *
+ * There exist n rectangles in a 2D plane with edges parallel to the x and y axis. You
+ * are given two 2D integer arrays bottomLeft and topRight where bottomLeft[i] = [a_i, b_i]
+ * and topRight[i] = [c_i, d_i] represent the bottom-left and top-right coordinates of the
+ * ith rectangle, respectively.
+ *
+ * You need to find the maximum area of a square that can fit inside the intersecting
+ * region of at least two rectangles. Return 0 if such a square does not exist.
+ */
+
+/**
+ * @param {number[][]} bottomLeft
+ * @param {number[][]} topRight
+ * @return {number}
+ */
+var largestSquareArea = function(bottomLeft, topRight) {
+  const n = bottomLeft.length;
+  let maxSide = 0;
+
+  for (let i = 0; i < n; i++) {
+    for (let j = i + 1; j < n; j++) {
+      const xLeft = Math.max(bottomLeft[i][0], bottomLeft[j][0]);
+      const yBottom = Math.max(bottomLeft[i][1], bottomLeft[j][1]);
+      const xRight = Math.min(topRight[i][0], topRight[j][0]);
+      const yTop = Math.min(topRight[i][1], topRight[j][1]);
+
+      if (xLeft < xRight && yBottom < yTop) {
+        const side = Math.min(xRight - xLeft, yTop - yBottom);
+        maxSide = Math.max(maxSide, side);
+      }
+    }
+  }
+
+  return maxSide * maxSide;
+};

From dbf84e18974fb03cc1f3caa01dbdb6a615f5e5e9 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 7 Jun 2025 23:46:21 -0500
Subject: [PATCH 474/571] Add solution #3065

---
 README.md                                     |  1 +
 ...-operations-to-exceed-threshold-value-i.js | 27 +++++++++++++++++++
 2 files changed, 28 insertions(+)
 create mode 100644 solutions/3065-minimum-operations-to-exceed-threshold-value-i.js

diff --git a/README.md b/README.md
index 83285a3b..c53843e5 100644
--- a/README.md
+++ b/README.md
@@ -2150,6 +2150,7 @@
 3044|[Most Frequent Prime](./solutions/3044-most-frequent-prime.js)|Medium|
 3046|[Split the Array](./solutions/3046-split-the-array.js)|Easy|
 3047|[Find the Largest Area of Square Inside Two Rectangles](./solutions/3047-find-the-largest-area-of-square-inside-two-rectangles.js)|Medium|
+3065|[Minimum Operations to Exceed Threshold Value I](./solutions/3065-minimum-operations-to-exceed-threshold-value-i.js)|Easy|
 3066|[Minimum Operations to Exceed Threshold Value II](./solutions/3066-minimum-operations-to-exceed-threshold-value-ii.js)|Medium|
 3068|[Find the Maximum Sum of Node Values](./solutions/3068-find-the-maximum-sum-of-node-values.js)|Hard|
 3105|[Longest Strictly Increasing or Strictly Decreasing Subarray](./solutions/3105-longest-strictly-increasing-or-strictly-decreasing-subarray.js)|Easy|
diff --git a/solutions/3065-minimum-operations-to-exceed-threshold-value-i.js b/solutions/3065-minimum-operations-to-exceed-threshold-value-i.js
new file mode 100644
index 00000000..53ae27ae
--- /dev/null
+++ b/solutions/3065-minimum-operations-to-exceed-threshold-value-i.js
@@ -0,0 +1,27 @@
+/**
+ * 3065. Minimum Operations to Exceed Threshold Value I
+ * https://leetcode.com/problems/minimum-operations-to-exceed-threshold-value-i/
+ * Difficulty: Easy
+ *
+ * You are given a 0-indexed integer array nums, and an integer k.
+ *
+ * In one operation, you can remove one occurrence of the smallest element of nums.
+ *
+ * Return the minimum number of operations needed so that all elements of the array are greater
+ * than or equal to k.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} k
+ * @return {number}
+ */
+var minOperations = function(nums, k) {
+  let operations = 0;
+
+  for (const num of nums) {
+    if (num < k) operations++;
+  }
+
+  return operations;
+};

From e3b44e8cd63ecba74384add4189a944facea1134 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 7 Jun 2025 23:48:15 -0500
Subject: [PATCH 475/571] Add solution #3067

---
 README.md                                     |  1 +
 ...able-servers-in-a-weighted-tree-network.js | 64 +++++++++++++++++++
 2 files changed, 65 insertions(+)
 create mode 100644 solutions/3067-count-pairs-of-connectable-servers-in-a-weighted-tree-network.js

diff --git a/README.md b/README.md
index c53843e5..81a1bfc5 100644
--- a/README.md
+++ b/README.md
@@ -2152,6 +2152,7 @@
 3047|[Find the Largest Area of Square Inside Two Rectangles](./solutions/3047-find-the-largest-area-of-square-inside-two-rectangles.js)|Medium|
 3065|[Minimum Operations to Exceed Threshold Value I](./solutions/3065-minimum-operations-to-exceed-threshold-value-i.js)|Easy|
 3066|[Minimum Operations to Exceed Threshold Value II](./solutions/3066-minimum-operations-to-exceed-threshold-value-ii.js)|Medium|
+3067|[Count Pairs of Connectable Servers in a Weighted Tree Network](./solutions/3067-count-pairs-of-connectable-servers-in-a-weighted-tree-network.js)|Medium|
 3068|[Find the Maximum Sum of Node Values](./solutions/3068-find-the-maximum-sum-of-node-values.js)|Hard|
 3105|[Longest Strictly Increasing or Strictly Decreasing Subarray](./solutions/3105-longest-strictly-increasing-or-strictly-decreasing-subarray.js)|Easy|
 3108|[Minimum Cost Walk in Weighted Graph](./solutions/3108-minimum-cost-walk-in-weighted-graph.js)|Hard|
diff --git a/solutions/3067-count-pairs-of-connectable-servers-in-a-weighted-tree-network.js b/solutions/3067-count-pairs-of-connectable-servers-in-a-weighted-tree-network.js
new file mode 100644
index 00000000..cfcb71ff
--- /dev/null
+++ b/solutions/3067-count-pairs-of-connectable-servers-in-a-weighted-tree-network.js
@@ -0,0 +1,64 @@
+/**
+ * 3067. Count Pairs of Connectable Servers in a Weighted Tree Network
+ * https://leetcode.com/problems/count-pairs-of-connectable-servers-in-a-weighted-tree-network/
+ * Difficulty: Medium
+ *
+ * You are given an unrooted weighted tree with n vertices representing servers numbered from 0
+ * to n - 1, an array edges where edges[i] = [ai, bi, weighti] represents a bidirectional edge
+ * between vertices ai and bi of weight weighti. You are also given an integer signalSpeed.
+ *
+ * Two servers a and b are connectable through a server c if:
+ * - a < b, a != c and b != c.
+ * - The distance from c to a is divisible by signalSpeed.
+ * - The distance from c to b is divisible by signalSpeed.
+ * - The path from c to b and the path from c to a do not share any edges.
+ *
+ * Return an integer array count of length n where count[i] is the number of server pairs that are
+ * connectable through the server i.
+ */
+
+/**
+ * @param {number[][]} edges
+ * @param {number} signalSpeed
+ * @return {number[]}
+ */
+var countPairsOfConnectableServers = function(edges, signalSpeed) {
+  const n = edges.length + 1;
+  const graph = Array.from({ length: n }, () => []);
+  for (const [u, v, w] of edges) {
+    graph[u].push([v, w]);
+    graph[v].push([u, w]);
+  }
+
+  const result = new Array(n).fill(0);
+  for (let i = 0; i < n; i++) {
+    result[i] = countValidPairs(i);
+  }
+  return result;
+
+  function countValidPairs(root) {
+    function dfs(node, parent, distance) {
+      let count = distance % signalSpeed === 0 ? 1 : 0;
+      for (const [next, weight] of graph[node]) {
+        if (next !== parent) {
+          count += dfs(next, node, distance + weight);
+        }
+      }
+      return count;
+    }
+
+    let totalPairs = 0;
+    const counts = [];
+    for (const [child, weight] of graph[root]) {
+      const count = dfs(child, root, weight);
+      counts.push(count);
+    }
+
+    let sum = 0;
+    for (const count of counts) {
+      totalPairs += sum * count;
+      sum += count;
+    }
+    return totalPairs;
+  }
+};

From 7cd6a7b5e3f4f7934f8f94e5414c1f5cbee917d0 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 7 Jun 2025 23:49:27 -0500
Subject: [PATCH 476/571] Add solution #3069

---
 README.md                                     |  1 +
 ...9-distribute-elements-into-two-arrays-i.js | 37 +++++++++++++++++++
 2 files changed, 38 insertions(+)
 create mode 100644 solutions/3069-distribute-elements-into-two-arrays-i.js

diff --git a/README.md b/README.md
index 81a1bfc5..74290fb7 100644
--- a/README.md
+++ b/README.md
@@ -2154,6 +2154,7 @@
 3066|[Minimum Operations to Exceed Threshold Value II](./solutions/3066-minimum-operations-to-exceed-threshold-value-ii.js)|Medium|
 3067|[Count Pairs of Connectable Servers in a Weighted Tree Network](./solutions/3067-count-pairs-of-connectable-servers-in-a-weighted-tree-network.js)|Medium|
 3068|[Find the Maximum Sum of Node Values](./solutions/3068-find-the-maximum-sum-of-node-values.js)|Hard|
+3069|[Distribute Elements Into Two Arrays I](./solutions/3069-distribute-elements-into-two-arrays-i.js)|Easy|
 3105|[Longest Strictly Increasing or Strictly Decreasing Subarray](./solutions/3105-longest-strictly-increasing-or-strictly-decreasing-subarray.js)|Easy|
 3108|[Minimum Cost Walk in Weighted Graph](./solutions/3108-minimum-cost-walk-in-weighted-graph.js)|Hard|
 3110|[Score of a String](./solutions/3110-score-of-a-string.js)|Easy|
diff --git a/solutions/3069-distribute-elements-into-two-arrays-i.js b/solutions/3069-distribute-elements-into-two-arrays-i.js
new file mode 100644
index 00000000..ed2f0d96
--- /dev/null
+++ b/solutions/3069-distribute-elements-into-two-arrays-i.js
@@ -0,0 +1,37 @@
+/**
+ * 3069. Distribute Elements Into Two Arrays I
+ * https://leetcode.com/problems/distribute-elements-into-two-arrays-i/
+ * Difficulty: Easy
+ *
+ * You are given a 1-indexed array of distinct integers nums of length n.
+ *
+ * You need to distribute all the elements of nums between two arrays arr1 and arr2 using n
+ * operations. In the first operation, append nums[1] to arr1. In the second operation,
+ * append nums[2] to arr2. Afterwards, in the ith operation:
+ * - If the last element of arr1 is greater than the last element of arr2, append nums[i] to arr1.
+ *   Otherwise, append nums[i] to arr2.
+ *
+ * The array result is formed by concatenating the arrays arr1 and arr2. For example, if
+ * arr1 == [1,2,3] and arr2 == [4,5,6], then result = [1,2,3,4,5,6].
+ *
+ * Return the array result.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number[]}
+ */
+var resultArray = function(nums) {
+  const arr1 = [nums[0]];
+  const arr2 = [nums[1]];
+
+  for (let i = 2; i < nums.length; i++) {
+    if (arr1[arr1.length - 1] > arr2[arr2.length - 1]) {
+      arr1.push(nums[i]);
+    } else {
+      arr2.push(nums[i]);
+    }
+  }
+
+  return [...arr1, ...arr2];
+};

From 955db95e1a93a55ca6cf10781cfde167d2e1e90a Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 7 Jun 2025 23:51:39 -0500
Subject: [PATCH 477/571] Add solution #3070

---
 README.md                                     |  1 +
 ...th-top-left-element-and-sum-less-than-k.js | 39 +++++++++++++++++++
 2 files changed, 40 insertions(+)
 create mode 100644 solutions/3070-count-submatrices-with-top-left-element-and-sum-less-than-k.js

diff --git a/README.md b/README.md
index 74290fb7..a0366757 100644
--- a/README.md
+++ b/README.md
@@ -2155,6 +2155,7 @@
 3067|[Count Pairs of Connectable Servers in a Weighted Tree Network](./solutions/3067-count-pairs-of-connectable-servers-in-a-weighted-tree-network.js)|Medium|
 3068|[Find the Maximum Sum of Node Values](./solutions/3068-find-the-maximum-sum-of-node-values.js)|Hard|
 3069|[Distribute Elements Into Two Arrays I](./solutions/3069-distribute-elements-into-two-arrays-i.js)|Easy|
+3070|[Count Submatrices with Top-Left Element and Sum Less Than k](./solutions/3070-count-submatrices-with-top-left-element-and-sum-less-than-k.js)|Medium|
 3105|[Longest Strictly Increasing or Strictly Decreasing Subarray](./solutions/3105-longest-strictly-increasing-or-strictly-decreasing-subarray.js)|Easy|
 3108|[Minimum Cost Walk in Weighted Graph](./solutions/3108-minimum-cost-walk-in-weighted-graph.js)|Hard|
 3110|[Score of a String](./solutions/3110-score-of-a-string.js)|Easy|
diff --git a/solutions/3070-count-submatrices-with-top-left-element-and-sum-less-than-k.js b/solutions/3070-count-submatrices-with-top-left-element-and-sum-less-than-k.js
new file mode 100644
index 00000000..93cd1cb1
--- /dev/null
+++ b/solutions/3070-count-submatrices-with-top-left-element-and-sum-less-than-k.js
@@ -0,0 +1,39 @@
+/**
+ * 3070. Count Submatrices with Top-Left Element and Sum Less Than k
+ * https://leetcode.com/problems/count-submatrices-with-top-left-element-and-sum-less-than-k/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed integer matrix grid and an integer k.
+ *
+ * Return the number of submatrices that contain the top-left element of the grid, and have a sum
+ * less than or equal to k.
+ */
+
+/**
+ * @param {number[][]} grid
+ * @param {number} k
+ * @return {number}
+ */
+var countSubmatrices = function(grid, k) {
+  const rows = grid.length;
+  const cols = grid[0].length;
+  const prefixSum = Array.from({ length: rows + 1 }, () => new Array(cols + 1).fill(0));
+
+  for (let i = 1; i <= rows; i++) {
+    for (let j = 1; j <= cols; j++) {
+      prefixSum[i][j] = grid[i-1][j-1] + prefixSum[i-1][j]
+        + prefixSum[i][j-1] - prefixSum[i-1][j-1];
+    }
+  }
+
+  let result = 0;
+  for (let i = 1; i <= rows; i++) {
+    for (let j = 1; j <= cols; j++) {
+      if (prefixSum[i][j] <= k) {
+        result++;
+      }
+    }
+  }
+
+  return result;
+};

From e4ebac16fe2b7353556bf4a7af5a0757ca7a5b9f Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 7 Jun 2025 23:53:20 -0500
Subject: [PATCH 478/571] Add solution #3071

---
 README.md                                     |  1 +
 ...rations-to-write-the-letter-y-on-a-grid.js | 63 +++++++++++++++++++
 2 files changed, 64 insertions(+)
 create mode 100644 solutions/3071-minimum-operations-to-write-the-letter-y-on-a-grid.js

diff --git a/README.md b/README.md
index a0366757..b2b929bf 100644
--- a/README.md
+++ b/README.md
@@ -2156,6 +2156,7 @@
 3068|[Find the Maximum Sum of Node Values](./solutions/3068-find-the-maximum-sum-of-node-values.js)|Hard|
 3069|[Distribute Elements Into Two Arrays I](./solutions/3069-distribute-elements-into-two-arrays-i.js)|Easy|
 3070|[Count Submatrices with Top-Left Element and Sum Less Than k](./solutions/3070-count-submatrices-with-top-left-element-and-sum-less-than-k.js)|Medium|
+3071|[Minimum Operations to Write the Letter Y on a Grid](./solutions/3071-minimum-operations-to-write-the-letter-y-on-a-grid.js)|Medium|
 3105|[Longest Strictly Increasing or Strictly Decreasing Subarray](./solutions/3105-longest-strictly-increasing-or-strictly-decreasing-subarray.js)|Easy|
 3108|[Minimum Cost Walk in Weighted Graph](./solutions/3108-minimum-cost-walk-in-weighted-graph.js)|Hard|
 3110|[Score of a String](./solutions/3110-score-of-a-string.js)|Easy|
diff --git a/solutions/3071-minimum-operations-to-write-the-letter-y-on-a-grid.js b/solutions/3071-minimum-operations-to-write-the-letter-y-on-a-grid.js
new file mode 100644
index 00000000..15ad3700
--- /dev/null
+++ b/solutions/3071-minimum-operations-to-write-the-letter-y-on-a-grid.js
@@ -0,0 +1,63 @@
+/**
+ * 3071. Minimum Operations to Write the Letter Y on a Grid
+ * https://leetcode.com/problems/minimum-operations-to-write-the-letter-y-on-a-grid/
+ * Difficulty: Medium
+ *
+ * You are given a 0-indexed n x n grid where n is odd, and grid[r][c] is 0, 1, or 2.
+ *
+ * We say that a cell belongs to the Letter Y if it belongs to one of the following:
+ * - The diagonal starting at the top-left cell and ending at the center cell of the grid.
+ * - The diagonal starting at the top-right cell and ending at the center cell of the grid.
+ * - The vertical line starting at the center cell and ending at the bottom border of the grid.
+ *
+ * The Letter Y is written on the grid if and only if:
+ * - All values at cells belonging to the Y are equal.
+ * - All values at cells not belonging to the Y are equal.
+ * - The values at cells belonging to the Y are different from the values at cells not belonging
+ *   to the Y.
+ *
+ * Return the minimum number of operations needed to write the letter Y on the grid given that
+ * in one operation you can change the value at any cell to 0, 1, or 2.
+ */
+
+/**
+ * @param {number[][]} grid
+ * @return {number}
+ */
+var minimumOperationsToWriteY = function(grid) {
+  const n = grid.length;
+  const center = Math.floor(n / 2);
+  const yCells = [];
+  const nonYCells = [];
+
+  for (let i = 0; i < n; i++) {
+    for (let j = 0; j < n; j++) {
+      if ((i === j && i <= center) || (i === n - 1 - j && i <= center)
+          || (j === center && i >= center)) {
+        yCells.push(grid[i][j]);
+      } else {
+        nonYCells.push(grid[i][j]);
+      }
+    }
+  }
+
+  const yCounts = [0, 0, 0];
+  const nonYCounts = [0, 0, 0];
+
+  for (const val of yCells) yCounts[val]++;
+  for (const val of nonYCells) nonYCounts[val]++;
+
+  let minOperations = Infinity;
+
+  for (let yVal = 0; yVal <= 2; yVal++) {
+    for (let nonYVal = 0; nonYVal <= 2; nonYVal++) {
+      if (yVal !== nonYVal) {
+        const yOps = yCells.length - yCounts[yVal];
+        const nonYOps = nonYCells.length - nonYCounts[nonYVal];
+        minOperations = Math.min(minOperations, yOps + nonYOps);
+      }
+    }
+  }
+
+  return minOperations;
+};

From 62d047bdf2175c01901df2862841cdd4657a3f6f Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 7 Jun 2025 23:54:20 -0500
Subject: [PATCH 479/571] Add solution #3074

---
 README.md                                     |  1 +
 .../3074-apple-redistribution-into-boxes.js   | 38 +++++++++++++++++++
 2 files changed, 39 insertions(+)
 create mode 100644 solutions/3074-apple-redistribution-into-boxes.js

diff --git a/README.md b/README.md
index b2b929bf..0293af67 100644
--- a/README.md
+++ b/README.md
@@ -2157,6 +2157,7 @@
 3069|[Distribute Elements Into Two Arrays I](./solutions/3069-distribute-elements-into-two-arrays-i.js)|Easy|
 3070|[Count Submatrices with Top-Left Element and Sum Less Than k](./solutions/3070-count-submatrices-with-top-left-element-and-sum-less-than-k.js)|Medium|
 3071|[Minimum Operations to Write the Letter Y on a Grid](./solutions/3071-minimum-operations-to-write-the-letter-y-on-a-grid.js)|Medium|
+3074|[Apple Redistribution into Boxes](./solutions/3074-apple-redistribution-into-boxes.js)|Easy|
 3105|[Longest Strictly Increasing or Strictly Decreasing Subarray](./solutions/3105-longest-strictly-increasing-or-strictly-decreasing-subarray.js)|Easy|
 3108|[Minimum Cost Walk in Weighted Graph](./solutions/3108-minimum-cost-walk-in-weighted-graph.js)|Hard|
 3110|[Score of a String](./solutions/3110-score-of-a-string.js)|Easy|
diff --git a/solutions/3074-apple-redistribution-into-boxes.js b/solutions/3074-apple-redistribution-into-boxes.js
new file mode 100644
index 00000000..27e3f17a
--- /dev/null
+++ b/solutions/3074-apple-redistribution-into-boxes.js
@@ -0,0 +1,38 @@
+/**
+ * 3074. Apple Redistribution into Boxes
+ * https://leetcode.com/problems/apple-redistribution-into-boxes/
+ * Difficulty: Easy
+ *
+ * You are given an array apple of size n and an array capacity of size m.
+ *
+ * There are n packs where the ith pack contains apple[i] apples. There are m boxes as well,
+ * and the ith box has a capacity of capacity[i] apples.
+ *
+ * Return the minimum number of boxes you need to select to redistribute these n packs of
+ * apples into boxes.
+ *
+ * Note that, apples from the same pack can be distributed into different boxes.
+ */
+
+/**
+ * @param {number[]} apple
+ * @param {number[]} capacity
+ * @return {number}
+ */
+var minimumBoxes = function(apple, capacity) {
+  const totalApples = apple.reduce((sum, num) => sum + num, 0);
+  const sortedCapacities = capacity.sort((a, b) => b - a);
+  let currentCapacity = 0;
+  let result = 0;
+
+  for (const box of sortedCapacities) {
+    if (currentCapacity < totalApples) {
+      currentCapacity += box;
+      result++;
+    } else {
+      break;
+    }
+  }
+
+  return result;
+};

From 2811dde9b6a5d99904920f01b6f89c41d32dc0cc Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 7 Jun 2025 23:55:31 -0500
Subject: [PATCH 480/571] Add solution #3075

---
 README.md                                     |  1 +
 ...maximize-happiness-of-selected-children.js | 35 +++++++++++++++++++
 2 files changed, 36 insertions(+)
 create mode 100644 solutions/3075-maximize-happiness-of-selected-children.js

diff --git a/README.md b/README.md
index 0293af67..e9152641 100644
--- a/README.md
+++ b/README.md
@@ -2158,6 +2158,7 @@
 3070|[Count Submatrices with Top-Left Element and Sum Less Than k](./solutions/3070-count-submatrices-with-top-left-element-and-sum-less-than-k.js)|Medium|
 3071|[Minimum Operations to Write the Letter Y on a Grid](./solutions/3071-minimum-operations-to-write-the-letter-y-on-a-grid.js)|Medium|
 3074|[Apple Redistribution into Boxes](./solutions/3074-apple-redistribution-into-boxes.js)|Easy|
+3075|[Maximize Happiness of Selected Children](./solutions/3075-maximize-happiness-of-selected-children.js)|Medium|
 3105|[Longest Strictly Increasing or Strictly Decreasing Subarray](./solutions/3105-longest-strictly-increasing-or-strictly-decreasing-subarray.js)|Easy|
 3108|[Minimum Cost Walk in Weighted Graph](./solutions/3108-minimum-cost-walk-in-weighted-graph.js)|Hard|
 3110|[Score of a String](./solutions/3110-score-of-a-string.js)|Easy|
diff --git a/solutions/3075-maximize-happiness-of-selected-children.js b/solutions/3075-maximize-happiness-of-selected-children.js
new file mode 100644
index 00000000..853a0851
--- /dev/null
+++ b/solutions/3075-maximize-happiness-of-selected-children.js
@@ -0,0 +1,35 @@
+/**
+ * 3075. Maximize Happiness of Selected Children
+ * https://leetcode.com/problems/maximize-happiness-of-selected-children/
+ * Difficulty: Medium
+ *
+ * You are given an array happiness of length n, and a positive integer k.
+ *
+ * There are n children standing in a queue, where the ith child has happiness value
+ * happiness[i]. You want to select k children from these n children in k turns.
+ *
+ * In each turn, when you select a child, the happiness value of all the children that
+ * have not been selected till now decreases by 1. Note that the happiness value cannot
+ * become negative and gets decremented only if it is positive.
+ *
+ * Return the maximum sum of the happiness values of the selected children you can
+ * achieve by selecting k children.
+ */
+
+/**
+ * @param {number[]} happiness
+ * @param {number} k
+ * @return {number}
+ */
+var maximumHappinessSum = function(happiness, k) {
+  const sortedHappiness = happiness.sort((a, b) => b - a);
+  let result = 0;
+
+  for (let i = 0; i < k; i++) {
+    const currentHappiness = sortedHappiness[i] - i;
+    if (currentHappiness <= 0) break;
+    result += currentHappiness;
+  }
+
+  return result;
+};

From a74449370b48a41cf1baa758b994a5127aa25833 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 7 Jun 2025 23:57:02 -0500
Subject: [PATCH 481/571] Add solution #3076

---
 README.md                                     |  1 +
 ...shortest-uncommon-substring-in-an-array.js | 56 +++++++++++++++++++
 2 files changed, 57 insertions(+)
 create mode 100644 solutions/3076-shortest-uncommon-substring-in-an-array.js

diff --git a/README.md b/README.md
index e9152641..72e021ec 100644
--- a/README.md
+++ b/README.md
@@ -2159,6 +2159,7 @@
 3071|[Minimum Operations to Write the Letter Y on a Grid](./solutions/3071-minimum-operations-to-write-the-letter-y-on-a-grid.js)|Medium|
 3074|[Apple Redistribution into Boxes](./solutions/3074-apple-redistribution-into-boxes.js)|Easy|
 3075|[Maximize Happiness of Selected Children](./solutions/3075-maximize-happiness-of-selected-children.js)|Medium|
+3076|[Shortest Uncommon Substring in an Array](./solutions/3076-shortest-uncommon-substring-in-an-array.js)|Medium|
 3105|[Longest Strictly Increasing or Strictly Decreasing Subarray](./solutions/3105-longest-strictly-increasing-or-strictly-decreasing-subarray.js)|Easy|
 3108|[Minimum Cost Walk in Weighted Graph](./solutions/3108-minimum-cost-walk-in-weighted-graph.js)|Hard|
 3110|[Score of a String](./solutions/3110-score-of-a-string.js)|Easy|
diff --git a/solutions/3076-shortest-uncommon-substring-in-an-array.js b/solutions/3076-shortest-uncommon-substring-in-an-array.js
new file mode 100644
index 00000000..60559014
--- /dev/null
+++ b/solutions/3076-shortest-uncommon-substring-in-an-array.js
@@ -0,0 +1,56 @@
+/**
+ * 3076. Shortest Uncommon Substring in an Array
+ * https://leetcode.com/problems/shortest-uncommon-substring-in-an-array/
+ * Difficulty: Medium
+ *
+ * You are given an array arr of size n consisting of non-empty strings.
+ *
+ * Find a string array answer of size n such that:
+ * - answer[i] is the shortest substring of arr[i] that does not occur as a substring in any
+ *   other string in arr. If multiple such substrings exist, answer[i] should be the
+ *   lexicographically smallest. And if no such substring exists, answer[i] should be an
+ *   empty string.
+ *
+ * Return the array answer.
+ */
+
+/**
+ * @param {string[]} arr
+ * @return {string[]}
+ */
+var shortestSubstrings = function(arr) {
+  const n = arr.length;
+  const result = new Array(n).fill('');
+
+  for (let i = 0; i < n; i++) {
+    const str = arr[i];
+    let minLen = Infinity;
+    let minSubstr = '';
+
+    for (let len = 1; len <= str.length; len++) {
+      for (let start = 0; start <= str.length - len; start++) {
+        const substr = str.slice(start, start + len);
+        if (isUnique(substr, i)) {
+          if (len < minLen || (len === minLen && substr < minSubstr)) {
+            minLen = len;
+            minSubstr = substr;
+          }
+        }
+      }
+      if (minSubstr) break;
+    }
+
+    result[i] = minSubstr;
+  }
+
+  return result;
+
+  function isUnique(substr, strIdx) {
+    for (let i = 0; i < n; i++) {
+      if (i !== strIdx && arr[i].includes(substr)) {
+        return false;
+      }
+    }
+    return true;
+  }
+};

From 4e64eea1e676bc856ff125a9438cd20c280bee16 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 00:30:29 -0500
Subject: [PATCH 482/571] Add solution #3079

---
 README.md                                     |  1 +
 ...3079-find-the-sum-of-encrypted-integers.js | 41 +++++++++++++++++++
 2 files changed, 42 insertions(+)
 create mode 100644 solutions/3079-find-the-sum-of-encrypted-integers.js

diff --git a/README.md b/README.md
index 72e021ec..47af3b8a 100644
--- a/README.md
+++ b/README.md
@@ -2160,6 +2160,7 @@
 3074|[Apple Redistribution into Boxes](./solutions/3074-apple-redistribution-into-boxes.js)|Easy|
 3075|[Maximize Happiness of Selected Children](./solutions/3075-maximize-happiness-of-selected-children.js)|Medium|
 3076|[Shortest Uncommon Substring in an Array](./solutions/3076-shortest-uncommon-substring-in-an-array.js)|Medium|
+3079|[Find the Sum of Encrypted Integers](./solutions/3079-find-the-sum-of-encrypted-integers.js)|Easy|
 3105|[Longest Strictly Increasing or Strictly Decreasing Subarray](./solutions/3105-longest-strictly-increasing-or-strictly-decreasing-subarray.js)|Easy|
 3108|[Minimum Cost Walk in Weighted Graph](./solutions/3108-minimum-cost-walk-in-weighted-graph.js)|Hard|
 3110|[Score of a String](./solutions/3110-score-of-a-string.js)|Easy|
diff --git a/solutions/3079-find-the-sum-of-encrypted-integers.js b/solutions/3079-find-the-sum-of-encrypted-integers.js
new file mode 100644
index 00000000..8bdaf881
--- /dev/null
+++ b/solutions/3079-find-the-sum-of-encrypted-integers.js
@@ -0,0 +1,41 @@
+/**
+ * 3079. Find the Sum of Encrypted Integers
+ * https://leetcode.com/problems/find-the-sum-of-encrypted-integers/
+ * Difficulty: Easy
+ *
+ * You are given an integer array nums containing positive integers. We define a function
+ * encrypt such that encrypt(x) replaces every digit in x with the largest digit in x.
+ * For example, encrypt(523) = 555 and encrypt(213) = 333.
+ *
+ * Return the sum of encrypted elements.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var sumOfEncryptedInt = function(nums) {
+  let result = 0;
+
+  for (const num of nums) {
+    let maxDigit = 0;
+    let temp = num;
+    let digitCount = 0;
+
+    while (temp > 0) {
+      maxDigit = Math.max(maxDigit, temp % 10);
+      temp = Math.floor(temp / 10);
+      digitCount++;
+    }
+
+    let encrypted = 0;
+    while (digitCount > 0) {
+      encrypted = encrypted * 10 + maxDigit;
+      digitCount--;
+    }
+
+    result += encrypted;
+  }
+
+  return result;
+};

From 268db1b632067c7c0fc10eba55f54a77f3596ce1 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 00:31:22 -0500
Subject: [PATCH 483/571] Add solution #3083

---
 README.md                                     |  1 +
 ...a-substring-in-a-string-and-its-reverse.js | 26 +++++++++++++++++++
 2 files changed, 27 insertions(+)
 create mode 100644 solutions/3083-existence-of-a-substring-in-a-string-and-its-reverse.js

diff --git a/README.md b/README.md
index 47af3b8a..7b7dcf53 100644
--- a/README.md
+++ b/README.md
@@ -2161,6 +2161,7 @@
 3075|[Maximize Happiness of Selected Children](./solutions/3075-maximize-happiness-of-selected-children.js)|Medium|
 3076|[Shortest Uncommon Substring in an Array](./solutions/3076-shortest-uncommon-substring-in-an-array.js)|Medium|
 3079|[Find the Sum of Encrypted Integers](./solutions/3079-find-the-sum-of-encrypted-integers.js)|Easy|
+3083|[Existence of a Substring in a String and Its Reverse](./solutions/3083-existence-of-a-substring-in-a-string-and-its-reverse.js)|Easy|
 3105|[Longest Strictly Increasing or Strictly Decreasing Subarray](./solutions/3105-longest-strictly-increasing-or-strictly-decreasing-subarray.js)|Easy|
 3108|[Minimum Cost Walk in Weighted Graph](./solutions/3108-minimum-cost-walk-in-weighted-graph.js)|Hard|
 3110|[Score of a String](./solutions/3110-score-of-a-string.js)|Easy|
diff --git a/solutions/3083-existence-of-a-substring-in-a-string-and-its-reverse.js b/solutions/3083-existence-of-a-substring-in-a-string-and-its-reverse.js
new file mode 100644
index 00000000..8af3eb50
--- /dev/null
+++ b/solutions/3083-existence-of-a-substring-in-a-string-and-its-reverse.js
@@ -0,0 +1,26 @@
+/**
+ * 3083. Existence of a Substring in a String and Its Reverse
+ * https://leetcode.com/problems/existence-of-a-substring-in-a-string-and-its-reverse/
+ * Difficulty: Easy
+ *
+ * Given a string s, find any substring of length 2 which is also present in the reverse of s.
+ *
+ * Return true if such a substring exists, and false otherwise.
+ */
+
+/**
+ * @param {string} s
+ * @return {boolean}
+ */
+var isSubstringPresent = function(s) {
+  const reversed = s.split('').reverse().join('');
+
+  for (let i = 0; i < s.length - 1; i++) {
+    const substr = s.slice(i, i + 2);
+    if (reversed.includes(substr)) {
+      return true;
+    }
+  }
+
+  return false;
+};

From ccddc4126af9e72410514a763dcece27f52a3182 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 00:32:39 -0500
Subject: [PATCH 484/571] Add solution #3084

---
 README.md                                     |  1 +
 ...tarting-and-ending-with-given-character.js | 21 +++++++++++++++++++
 2 files changed, 22 insertions(+)
 create mode 100644 solutions/3084-count-substrings-starting-and-ending-with-given-character.js

diff --git a/README.md b/README.md
index 7b7dcf53..32715922 100644
--- a/README.md
+++ b/README.md
@@ -2162,6 +2162,7 @@
 3076|[Shortest Uncommon Substring in an Array](./solutions/3076-shortest-uncommon-substring-in-an-array.js)|Medium|
 3079|[Find the Sum of Encrypted Integers](./solutions/3079-find-the-sum-of-encrypted-integers.js)|Easy|
 3083|[Existence of a Substring in a String and Its Reverse](./solutions/3083-existence-of-a-substring-in-a-string-and-its-reverse.js)|Easy|
+3084|[Count Substrings Starting and Ending with Given Character](./solutions/3084-count-substrings-starting-and-ending-with-given-character.js)|Medium|
 3105|[Longest Strictly Increasing or Strictly Decreasing Subarray](./solutions/3105-longest-strictly-increasing-or-strictly-decreasing-subarray.js)|Easy|
 3108|[Minimum Cost Walk in Weighted Graph](./solutions/3108-minimum-cost-walk-in-weighted-graph.js)|Hard|
 3110|[Score of a String](./solutions/3110-score-of-a-string.js)|Easy|
diff --git a/solutions/3084-count-substrings-starting-and-ending-with-given-character.js b/solutions/3084-count-substrings-starting-and-ending-with-given-character.js
new file mode 100644
index 00000000..be6b8bc2
--- /dev/null
+++ b/solutions/3084-count-substrings-starting-and-ending-with-given-character.js
@@ -0,0 +1,21 @@
+/**
+ * 3084. Count Substrings Starting and Ending with Given Character
+ * https://leetcode.com/problems/count-substrings-starting-and-ending-with-given-character/
+ * Difficulty: Medium
+ *
+ * You are given a string s and a character c. Return the total number of substrings of s
+ * that start and end with c.
+ */
+
+/**
+ * @param {string} s
+ * @param {character} c
+ * @return {number}
+ */
+var countSubstrings = function(s, c) {
+  let count = 0;
+  for (const char of s) {
+    if (char === c) count++;
+  }
+  return (count * (count + 1)) / 2;
+};

From c51cab88dfbe49798cc17b85133ef941a6454ca3 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 00:35:26 -0500
Subject: [PATCH 485/571] Add solution #3085

---
 README.md                                     |  1 +
 ...imum-deletions-to-make-string-k-special.js | 45 +++++++++++++++++++
 2 files changed, 46 insertions(+)
 create mode 100644 solutions/3085-minimum-deletions-to-make-string-k-special.js

diff --git a/README.md b/README.md
index 32715922..5815b93a 100644
--- a/README.md
+++ b/README.md
@@ -2163,6 +2163,7 @@
 3079|[Find the Sum of Encrypted Integers](./solutions/3079-find-the-sum-of-encrypted-integers.js)|Easy|
 3083|[Existence of a Substring in a String and Its Reverse](./solutions/3083-existence-of-a-substring-in-a-string-and-its-reverse.js)|Easy|
 3084|[Count Substrings Starting and Ending with Given Character](./solutions/3084-count-substrings-starting-and-ending-with-given-character.js)|Medium|
+3085|[Minimum Deletions to Make String K-Special](./solutions/3085-minimum-deletions-to-make-string-k-special.js)|Medium|
 3105|[Longest Strictly Increasing or Strictly Decreasing Subarray](./solutions/3105-longest-strictly-increasing-or-strictly-decreasing-subarray.js)|Easy|
 3108|[Minimum Cost Walk in Weighted Graph](./solutions/3108-minimum-cost-walk-in-weighted-graph.js)|Hard|
 3110|[Score of a String](./solutions/3110-score-of-a-string.js)|Easy|
diff --git a/solutions/3085-minimum-deletions-to-make-string-k-special.js b/solutions/3085-minimum-deletions-to-make-string-k-special.js
new file mode 100644
index 00000000..98db902e
--- /dev/null
+++ b/solutions/3085-minimum-deletions-to-make-string-k-special.js
@@ -0,0 +1,45 @@
+/**
+ * 3085. Minimum Deletions to Make String K-Special
+ * https://leetcode.com/problems/minimum-deletions-to-make-string-k-special/
+ * Difficulty: Medium
+ *
+ * You are given a string word and an integer k.
+ *
+ * We consider word to be k-special if |freq(word[i]) - freq(word[j])| <= k for all indices i
+ * and j in the string.
+ *
+ * Here, freq(x) denotes the frequency of the character x in word, and |y| denotes the absolute
+ * value of y.
+ *
+ * Return the minimum number of characters you need to delete to make word k-special.
+ */
+
+/**
+ * @param {string} word
+ * @param {number} k
+ * @return {number}
+ */
+var minimumDeletions = function(word, k) {
+  const freq = new Array(26).fill(0);
+
+  for (const char of word) {
+    freq[char.charCodeAt(0) - 97]++;
+  }
+
+  const counts = freq.filter(x => x > 0).sort((a, b) => a - b);
+  let minDeletions = Infinity;
+  for (let i = 0; i < counts.length; i++) {
+    let deletions = 0;
+    for (let j = 0; j < i; j++) {
+      deletions += counts[j];
+    }
+    for (let j = i; j < counts.length; j++) {
+      if (counts[j] - counts[i] > k) {
+        deletions += counts[j] - (counts[i] + k);
+      }
+    }
+    minDeletions = Math.min(minDeletions, deletions);
+  }
+
+  return minDeletions;
+};

From 26f419f85867486a8ff90b6930fd70876fd03e92 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 00:37:09 -0500
Subject: [PATCH 486/571] Add solution #3090

---
 README.md                                     |  1 +
 ...m-length-substring-with-two-occurrences.js | 31 +++++++++++++++++++
 2 files changed, 32 insertions(+)
 create mode 100644 solutions/3090-maximum-length-substring-with-two-occurrences.js

diff --git a/README.md b/README.md
index 5815b93a..79079f1f 100644
--- a/README.md
+++ b/README.md
@@ -2164,6 +2164,7 @@
 3083|[Existence of a Substring in a String and Its Reverse](./solutions/3083-existence-of-a-substring-in-a-string-and-its-reverse.js)|Easy|
 3084|[Count Substrings Starting and Ending with Given Character](./solutions/3084-count-substrings-starting-and-ending-with-given-character.js)|Medium|
 3085|[Minimum Deletions to Make String K-Special](./solutions/3085-minimum-deletions-to-make-string-k-special.js)|Medium|
+3090|[Maximum Length Substring With Two Occurrences](./solutions/3090-maximum-length-substring-with-two-occurrences.js)|Easy|
 3105|[Longest Strictly Increasing or Strictly Decreasing Subarray](./solutions/3105-longest-strictly-increasing-or-strictly-decreasing-subarray.js)|Easy|
 3108|[Minimum Cost Walk in Weighted Graph](./solutions/3108-minimum-cost-walk-in-weighted-graph.js)|Hard|
 3110|[Score of a String](./solutions/3110-score-of-a-string.js)|Easy|
diff --git a/solutions/3090-maximum-length-substring-with-two-occurrences.js b/solutions/3090-maximum-length-substring-with-two-occurrences.js
new file mode 100644
index 00000000..84003cd8
--- /dev/null
+++ b/solutions/3090-maximum-length-substring-with-two-occurrences.js
@@ -0,0 +1,31 @@
+/**
+ * 3090. Maximum Length Substring With Two Occurrences
+ * https://leetcode.com/problems/maximum-length-substring-with-two-occurrences/
+ * Difficulty: Easy
+ *
+ * Given a string s, return the maximum length of a substring such that it contains at most
+ * two occurrences of each character.
+ */
+
+/**
+ * @param {string} s
+ * @return {number}
+ */
+var maximumLengthSubstring = function(s) {
+  let result = 0;
+  const map = new Map();
+
+  for (let left = 0, right = 0; right < s.length; right++) {
+    map.set(s[right], (map.get(s[right]) || 0) + 1);
+
+    while (map.get(s[right]) > 2) {
+      map.set(s[left], map.get(s[left]) - 1);
+      if (map.get(s[left]) === 0) map.delete(s[left]);
+      left++;
+    }
+
+    result = Math.max(result, right - left + 1);
+  }
+
+  return result;
+};

From 4263c309164aa4d4475c47673a3cbb114d35f76d Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 00:41:57 -0500
Subject: [PATCH 487/571] Add solution #3091

---
 README.md                                     |  1 +
 ...sum-of-array-greater-than-or-equal-to-k.js | 33 +++++++++++++++++++
 2 files changed, 34 insertions(+)
 create mode 100644 solutions/3091-apply-operations-to-make-sum-of-array-greater-than-or-equal-to-k.js

diff --git a/README.md b/README.md
index 79079f1f..0c888523 100644
--- a/README.md
+++ b/README.md
@@ -2165,6 +2165,7 @@
 3084|[Count Substrings Starting and Ending with Given Character](./solutions/3084-count-substrings-starting-and-ending-with-given-character.js)|Medium|
 3085|[Minimum Deletions to Make String K-Special](./solutions/3085-minimum-deletions-to-make-string-k-special.js)|Medium|
 3090|[Maximum Length Substring With Two Occurrences](./solutions/3090-maximum-length-substring-with-two-occurrences.js)|Easy|
+3091|[Apply Operations to Make Sum of Array Greater Than or Equal to k](./solutions/3091-apply-operations-to-make-sum-of-array-greater-than-or-equal-to-k.js)|Medium|
 3105|[Longest Strictly Increasing or Strictly Decreasing Subarray](./solutions/3105-longest-strictly-increasing-or-strictly-decreasing-subarray.js)|Easy|
 3108|[Minimum Cost Walk in Weighted Graph](./solutions/3108-minimum-cost-walk-in-weighted-graph.js)|Hard|
 3110|[Score of a String](./solutions/3110-score-of-a-string.js)|Easy|
diff --git a/solutions/3091-apply-operations-to-make-sum-of-array-greater-than-or-equal-to-k.js b/solutions/3091-apply-operations-to-make-sum-of-array-greater-than-or-equal-to-k.js
new file mode 100644
index 00000000..a1c50bd6
--- /dev/null
+++ b/solutions/3091-apply-operations-to-make-sum-of-array-greater-than-or-equal-to-k.js
@@ -0,0 +1,33 @@
+/**
+ * 3091. Apply Operations to Make Sum of Array Greater Than or Equal to k
+ * https://leetcode.com/problems/apply-operations-to-make-sum-of-array-greater-than-or-equal-to-k/
+ * Difficulty: Medium
+ *
+ * You are given a positive integer k. Initially, you have an array nums = [1].
+ *
+ * You can perform any of the following operations on the array any number of times (possibly zero):
+ * - Choose any element in the array and increase its value by 1.
+ * - Duplicate any element in the array and add it to the end of the array.
+ *
+ * Return the minimum number of operations required to make the sum of elements of the final array
+ * greater than or equal to k.
+ */
+
+/**
+ * @param {number} k
+ * @return {number}
+ */
+var minOperations = function(k) {
+  if (k === 1) return 0;
+
+  let result = Infinity;
+  for (let increments = 0; increments <= Math.ceil(Math.sqrt(k)); increments++) {
+    const value = 1 + increments;
+    const duplicates = Math.ceil(k / value) - 1;
+    if (duplicates >= 0) {
+      result = Math.min(result, increments + duplicates);
+    }
+  }
+
+  return result;
+};

From 62a53f151a46ac48955994739c19e07469a375ab Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 00:42:47 -0500
Subject: [PATCH 488/571] Add solution #3095

---
 README.md                                     |  1 +
 ...-shortest-subarray-with-or-at-least-k-i.js | 35 +++++++++++++++++++
 2 files changed, 36 insertions(+)
 create mode 100644 solutions/3095-shortest-subarray-with-or-at-least-k-i.js

diff --git a/README.md b/README.md
index 0c888523..8b62326e 100644
--- a/README.md
+++ b/README.md
@@ -2166,6 +2166,7 @@
 3085|[Minimum Deletions to Make String K-Special](./solutions/3085-minimum-deletions-to-make-string-k-special.js)|Medium|
 3090|[Maximum Length Substring With Two Occurrences](./solutions/3090-maximum-length-substring-with-two-occurrences.js)|Easy|
 3091|[Apply Operations to Make Sum of Array Greater Than or Equal to k](./solutions/3091-apply-operations-to-make-sum-of-array-greater-than-or-equal-to-k.js)|Medium|
+3095|[Shortest Subarray With OR at Least K I](./solutions/3095-shortest-subarray-with-or-at-least-k-i.js)|Easy|
 3105|[Longest Strictly Increasing or Strictly Decreasing Subarray](./solutions/3105-longest-strictly-increasing-or-strictly-decreasing-subarray.js)|Easy|
 3108|[Minimum Cost Walk in Weighted Graph](./solutions/3108-minimum-cost-walk-in-weighted-graph.js)|Hard|
 3110|[Score of a String](./solutions/3110-score-of-a-string.js)|Easy|
diff --git a/solutions/3095-shortest-subarray-with-or-at-least-k-i.js b/solutions/3095-shortest-subarray-with-or-at-least-k-i.js
new file mode 100644
index 00000000..0f03aa97
--- /dev/null
+++ b/solutions/3095-shortest-subarray-with-or-at-least-k-i.js
@@ -0,0 +1,35 @@
+/**
+ * 3095. Shortest Subarray With OR at Least K I
+ * https://leetcode.com/problems/shortest-subarray-with-or-at-least-k-i/
+ * Difficulty: Easy
+ *
+ * You are given an array nums of non-negative integers and an integer k.
+ *
+ * An array is called special if the bitwise OR of all of its elements is at least k.
+ *
+ * Return the length of the shortest special non-empty subarray of nums, or return -1 if
+ * no special subarray exists.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} k
+ * @return {number}
+ */
+var minimumSubarrayLength = function(nums, k) {
+  if (k === 0) return 1;
+
+  let minLength = Infinity;
+  for (let start = 0; start < nums.length; start++) {
+    let orResult = 0;
+    for (let end = start; end < nums.length; end++) {
+      orResult |= nums[end];
+      if (orResult >= k) {
+        minLength = Math.min(minLength, end - start + 1);
+        break;
+      }
+    }
+  }
+
+  return minLength === Infinity ? -1 : minLength;
+};

From f094b28dfaa56fbe52714cb1c81cdcf4e4a64a64 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 00:44:06 -0500
Subject: [PATCH 489/571] Add solution #3097

---
 README.md                                     |  1 +
 ...shortest-subarray-with-or-at-least-k-ii.js | 48 +++++++++++++++++++
 2 files changed, 49 insertions(+)
 create mode 100644 solutions/3097-shortest-subarray-with-or-at-least-k-ii.js

diff --git a/README.md b/README.md
index 8b62326e..9c303f81 100644
--- a/README.md
+++ b/README.md
@@ -2167,6 +2167,7 @@
 3090|[Maximum Length Substring With Two Occurrences](./solutions/3090-maximum-length-substring-with-two-occurrences.js)|Easy|
 3091|[Apply Operations to Make Sum of Array Greater Than or Equal to k](./solutions/3091-apply-operations-to-make-sum-of-array-greater-than-or-equal-to-k.js)|Medium|
 3095|[Shortest Subarray With OR at Least K I](./solutions/3095-shortest-subarray-with-or-at-least-k-i.js)|Easy|
+3097|[Shortest Subarray With OR at Least K II](./solutions/3097-shortest-subarray-with-or-at-least-k-ii.js)|Medium|
 3105|[Longest Strictly Increasing or Strictly Decreasing Subarray](./solutions/3105-longest-strictly-increasing-or-strictly-decreasing-subarray.js)|Easy|
 3108|[Minimum Cost Walk in Weighted Graph](./solutions/3108-minimum-cost-walk-in-weighted-graph.js)|Hard|
 3110|[Score of a String](./solutions/3110-score-of-a-string.js)|Easy|
diff --git a/solutions/3097-shortest-subarray-with-or-at-least-k-ii.js b/solutions/3097-shortest-subarray-with-or-at-least-k-ii.js
new file mode 100644
index 00000000..f85c9879
--- /dev/null
+++ b/solutions/3097-shortest-subarray-with-or-at-least-k-ii.js
@@ -0,0 +1,48 @@
+/**
+ * 3097. Shortest Subarray With OR at Least K II
+ * https://leetcode.com/problems/shortest-subarray-with-or-at-least-k-ii/
+ * Difficulty: Medium
+ *
+ * You are given an array nums of non-negative integers and an integer k.
+ *
+ * An array is called special if the bitwise OR of all of its elements is at least k.
+ *
+ * Return the length of the shortest special non-empty subarray of nums, or return -1 if no
+ * special subarray exists.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} k
+ * @return {number}
+ */
+var minimumSubarrayLength = function(nums, k) {
+  if (k === 0) return 1;
+
+  const bitCounts = new Array(32).fill(0);
+  let minLength = Infinity;
+  let orValue = 0;
+  let left = 0;
+
+  for (let right = 0; right < nums.length; right++) {
+    const num = nums[right];
+    for (let bit = 0; bit < 32; bit++) {
+      if (num & (1 << bit)) bitCounts[bit]++;
+      if (bitCounts[bit] > 0) orValue |= 1 << bit;
+    }
+
+    while (orValue >= k && left <= right) {
+      minLength = Math.min(minLength, right - left + 1);
+      const leftNum = nums[left];
+      for (let bit = 0; bit < 32; bit++) {
+        if (leftNum & (1 << bit)) {
+          bitCounts[bit]--;
+          if (bitCounts[bit] === 0) orValue &= ~(1 << bit);
+        }
+      }
+      left++;
+    }
+  }
+
+  return minLength === Infinity ? -1 : minLength;
+};

From bd03519917a620e1006ef514c64a9f9f61260f7e Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 00:44:53 -0500
Subject: [PATCH 490/571] Add solution #3099

---
 README.md                        |  1 +
 solutions/3099-harshad-number.js | 22 ++++++++++++++++++++++
 2 files changed, 23 insertions(+)
 create mode 100644 solutions/3099-harshad-number.js

diff --git a/README.md b/README.md
index 9c303f81..d1dcd732 100644
--- a/README.md
+++ b/README.md
@@ -2168,6 +2168,7 @@
 3091|[Apply Operations to Make Sum of Array Greater Than or Equal to k](./solutions/3091-apply-operations-to-make-sum-of-array-greater-than-or-equal-to-k.js)|Medium|
 3095|[Shortest Subarray With OR at Least K I](./solutions/3095-shortest-subarray-with-or-at-least-k-i.js)|Easy|
 3097|[Shortest Subarray With OR at Least K II](./solutions/3097-shortest-subarray-with-or-at-least-k-ii.js)|Medium|
+3099|[Harshad Number](./solutions/3099-harshad-number.js)|Easy|
 3105|[Longest Strictly Increasing or Strictly Decreasing Subarray](./solutions/3105-longest-strictly-increasing-or-strictly-decreasing-subarray.js)|Easy|
 3108|[Minimum Cost Walk in Weighted Graph](./solutions/3108-minimum-cost-walk-in-weighted-graph.js)|Hard|
 3110|[Score of a String](./solutions/3110-score-of-a-string.js)|Easy|
diff --git a/solutions/3099-harshad-number.js b/solutions/3099-harshad-number.js
new file mode 100644
index 00000000..f096f4c8
--- /dev/null
+++ b/solutions/3099-harshad-number.js
@@ -0,0 +1,22 @@
+/**
+ * 3099. Harshad Number
+ * https://leetcode.com/problems/harshad-number/
+ * Difficulty: Easy
+ *
+ * An integer divisible by the sum of its digits is said to be a Harshad number. You are given
+ * an integer x. Return the sum of the digits of x if x is a Harshad number, otherwise, return -1.
+ */
+
+/**
+ * @param {number} x
+ * @return {number}
+ */
+var sumOfTheDigitsOfHarshadNumber = function(x) {
+  let digitSum = 0;
+  let num = x;
+  while (num > 0) {
+    digitSum += num % 10;
+    num = Math.floor(num / 10);
+  }
+  return x % digitSum === 0 ? digitSum : -1;
+};

From ac4268814dbf772f44d89b0105eae043e2af2f3a Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 00:46:39 -0500
Subject: [PATCH 491/571] Add solution #3100

---
 README.md                          |  1 +
 solutions/3100-water-bottles-ii.js | 43 ++++++++++++++++++++++++++++++
 2 files changed, 44 insertions(+)
 create mode 100644 solutions/3100-water-bottles-ii.js

diff --git a/README.md b/README.md
index d1dcd732..0fa62b03 100644
--- a/README.md
+++ b/README.md
@@ -2169,6 +2169,7 @@
 3095|[Shortest Subarray With OR at Least K I](./solutions/3095-shortest-subarray-with-or-at-least-k-i.js)|Easy|
 3097|[Shortest Subarray With OR at Least K II](./solutions/3097-shortest-subarray-with-or-at-least-k-ii.js)|Medium|
 3099|[Harshad Number](./solutions/3099-harshad-number.js)|Easy|
+3100|[Water Bottles II](./solutions/3100-water-bottles-ii.js)|Medium|
 3105|[Longest Strictly Increasing or Strictly Decreasing Subarray](./solutions/3105-longest-strictly-increasing-or-strictly-decreasing-subarray.js)|Easy|
 3108|[Minimum Cost Walk in Weighted Graph](./solutions/3108-minimum-cost-walk-in-weighted-graph.js)|Hard|
 3110|[Score of a String](./solutions/3110-score-of-a-string.js)|Easy|
diff --git a/solutions/3100-water-bottles-ii.js b/solutions/3100-water-bottles-ii.js
new file mode 100644
index 00000000..a251d5d6
--- /dev/null
+++ b/solutions/3100-water-bottles-ii.js
@@ -0,0 +1,43 @@
+/**
+ * 3100. Water Bottles II
+ * https://leetcode.com/problems/water-bottles-ii/
+ * Difficulty: Medium
+ *
+ * You are given two integers numBottles and numExchange.
+ *
+ * numBottles represents the number of full water bottles that you initially have. In one
+ * operation, you can perform one of the following operations:
+ * - Drink any number of full water bottles turning them into empty bottles.
+ * - Exchange numExchange empty bottles with one full water bottle. Then, increase
+ *   numExchange by one.
+ *
+ * Note that you cannot exchange multiple batches of empty bottles for the same value of
+ * numExchange. For example, if numBottles == 3 and numExchange == 1, you cannot exchange
+ * 3 empty water bottles for 3 full bottles.
+ *
+ * Return the maximum number of water bottles you can drink.
+ */
+
+/**
+ * @param {number} numBottles
+ * @param {number} numExchange
+ * @return {number}
+ */
+var maxBottlesDrunk = function(numBottles, numExchange) {
+  let result = 0;
+  let full = numBottles;
+  let empty = 0;
+
+  while (full > 0) {
+    result += full;
+    empty += full;
+    full = 0;
+    if (empty >= numExchange) {
+      full = 1;
+      empty -= numExchange;
+      numExchange++;
+    }
+  }
+
+  return result;
+};

From a0f002d29b1a26803d1b451f53e11ed24bedf9a6 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 18:32:01 -0500
Subject: [PATCH 492/571] Add solution #156

---
 README.md                                 |  1 +
 solutions/0156-binary-tree-upside-down.js | 39 +++++++++++++++++++++++
 2 files changed, 40 insertions(+)
 create mode 100644 solutions/0156-binary-tree-upside-down.js

diff --git a/README.md b/README.md
index 0fa62b03..b58ed613 100644
--- a/README.md
+++ b/README.md
@@ -161,6 +161,7 @@
 153|[Find Minimum in Rotated Sorted Array](./solutions/0153-find-minimum-in-rotated-sorted-array.js)|Medium|
 154|[Find Minimum in Rotated Sorted Array II](./solutions/0154-find-minimum-in-rotated-sorted-array-ii.js)|Hard|
 155|[Min Stack](./solutions/0155-min-stack.js)|Medium|
+156|[Binary Tree Upside Down](./solutions/0156-binary-tree-upside-down.js)|Medium|
 160|[Intersection of Two Linked Lists](./solutions/0160-intersection-of-two-linked-lists.js)|Medium|
 162|[Find Peak Element](./solutions/0162-find-peak-element.js)|Medium|
 164|[Maximum Gap](./solutions/0164-maximum-gap.js)|Medium|
diff --git a/solutions/0156-binary-tree-upside-down.js b/solutions/0156-binary-tree-upside-down.js
new file mode 100644
index 00000000..77bfd8ce
--- /dev/null
+++ b/solutions/0156-binary-tree-upside-down.js
@@ -0,0 +1,39 @@
+/**
+ * 156. Binary Tree Upside Down
+ * https://leetcode.com/problems/binary-tree-upside-down/
+ * Difficulty: Medium
+ *
+ * Given the root of a binary tree, turn the tree upside down and return the new root.
+ *
+ * You can turn a binary tree upside down with the following steps:
+ * - The original left child becomes the new root.
+ * - The original root becomes the new right child.
+ * - The original right child becomes the new left child.
+ *
+ * The mentioned steps are done level by level. It is guaranteed that every right node has
+ * a sibling (a left node with the same parent) and has no children.
+ */
+
+/**
+ * Definition for a binary tree node.
+ * function TreeNode(val, left, right) {
+ *     this.val = (val===undefined ? 0 : val)
+ *     this.left = (left===undefined ? null : left)
+ *     this.right = (right===undefined ? null : right)
+ * }
+ */
+/**
+ * @param {TreeNode} root
+ * @return {TreeNode}
+ */
+var upsideDownBinaryTree = function(root) {
+  if (!root || !root.left) return root;
+
+  const newRoot = upsideDownBinaryTree(root.left);
+  root.left.left = root.right;
+  root.left.right = root;
+  root.left = null;
+  root.right = null;
+
+  return newRoot;
+};

From 271a933af5d3479dc65c3c5887a875d073460006 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 18:33:47 -0500
Subject: [PATCH 493/571] Add solution #157

---
 README.md                                     |  1 +
 .../0157-read-n-characters-given-read4.js     | 48 +++++++++++++++++++
 2 files changed, 49 insertions(+)
 create mode 100644 solutions/0157-read-n-characters-given-read4.js

diff --git a/README.md b/README.md
index b58ed613..1fad1130 100644
--- a/README.md
+++ b/README.md
@@ -162,6 +162,7 @@
 154|[Find Minimum in Rotated Sorted Array II](./solutions/0154-find-minimum-in-rotated-sorted-array-ii.js)|Hard|
 155|[Min Stack](./solutions/0155-min-stack.js)|Medium|
 156|[Binary Tree Upside Down](./solutions/0156-binary-tree-upside-down.js)|Medium|
+157|[Read N Characters Given Read4](./solutions/0157-read-n-characters-given-read4.js)|Easy|
 160|[Intersection of Two Linked Lists](./solutions/0160-intersection-of-two-linked-lists.js)|Medium|
 162|[Find Peak Element](./solutions/0162-find-peak-element.js)|Medium|
 164|[Maximum Gap](./solutions/0164-maximum-gap.js)|Medium|
diff --git a/solutions/0157-read-n-characters-given-read4.js b/solutions/0157-read-n-characters-given-read4.js
new file mode 100644
index 00000000..0074fec8
--- /dev/null
+++ b/solutions/0157-read-n-characters-given-read4.js
@@ -0,0 +1,48 @@
+/**
+ * 157. Read N Characters Given Read4
+ * https://leetcode.com/problems/read-n-characters-given-read4/
+ * Difficulty: Easy
+ *
+ * Given a file and assume that you can only read the file using a given method read4, implement
+ * a method to read n characters.
+ *
+ * Method read4:
+ * - The API read4 reads four consecutive characters from file, then writes those characters into
+ *   the buffer array buf4.
+ *
+ * The return value is the number of actual characters read.
+ *
+ * Note that read4() has its own file pointer, much like FILE *fp in C.
+ */
+
+/**
+ * @param {function} read4()
+ * @return {function}
+ */
+var solution = function(read4) {
+  let cache = [];
+  let cacheIndex = 0;
+  let cacheSize = 0;
+
+  /**
+    * @param {character[]} buf Destination buffer
+    * @param {number} n Number of characters to read
+    * @return {number} The number of actual characters read
+    */
+  return function(buf, n) {
+    let charsRead = 0;
+
+    while (charsRead < n) {
+      if (cacheIndex >= cacheSize) {
+        cache = new Array(4);
+        cacheSize = read4(cache);
+        cacheIndex = 0;
+        if (cacheSize === 0) break;
+      }
+
+      buf[charsRead++] = cache[cacheIndex++];
+    }
+
+    return charsRead;
+  };
+};

From d46baa0a9aa3e2d3896f1c9d74ffefe9e1511442 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 18:43:10 -0500
Subject: [PATCH 494/571] Add solution #158

---
 README.md                                     |  1 +
 ...ters-given-read4-ii-call-multiple-times.js | 48 +++++++++++++++++++
 2 files changed, 49 insertions(+)
 create mode 100644 solutions/0158-read-n-characters-given-read4-ii-call-multiple-times.js

diff --git a/README.md b/README.md
index 1fad1130..521ee4bd 100644
--- a/README.md
+++ b/README.md
@@ -163,6 +163,7 @@
 155|[Min Stack](./solutions/0155-min-stack.js)|Medium|
 156|[Binary Tree Upside Down](./solutions/0156-binary-tree-upside-down.js)|Medium|
 157|[Read N Characters Given Read4](./solutions/0157-read-n-characters-given-read4.js)|Easy|
+158|[Read N Characters Given read4 II - Call Multiple Times](./solutions/0158-read-n-characters-given-read4-ii-call-multiple-times.js)|Hard|
 160|[Intersection of Two Linked Lists](./solutions/0160-intersection-of-two-linked-lists.js)|Medium|
 162|[Find Peak Element](./solutions/0162-find-peak-element.js)|Medium|
 164|[Maximum Gap](./solutions/0164-maximum-gap.js)|Medium|
diff --git a/solutions/0158-read-n-characters-given-read4-ii-call-multiple-times.js b/solutions/0158-read-n-characters-given-read4-ii-call-multiple-times.js
new file mode 100644
index 00000000..9fdd7b54
--- /dev/null
+++ b/solutions/0158-read-n-characters-given-read4-ii-call-multiple-times.js
@@ -0,0 +1,48 @@
+/**
+ * 158. Read N Characters Given read4 II - Call Multiple Times
+ * https://leetcode.com/problems/read-n-characters-given-read4-ii-call-multiple-times/
+ * Difficulty: Hard
+ *
+ * Given a file and assume that you can only read the file using a given method read4, implement
+ * a method read to read n characters. Your method read may be called multiple times.
+ *
+ * Method read4:
+ * - The API read4 reads four consecutive characters from file, then writes those characters into
+ *   the buffer array buf4.
+ *
+ * The return value is the number of actual characters read.
+ *
+ * Note that read4() has its own file pointer, much like FILE *fp in C.
+ */
+
+/**
+ * @param {function} read4()
+ * @return {function}
+ */
+var solution = function(read4) {
+  let cache = [];
+  let cacheIndex = 0;
+  let cacheSize = 0;
+
+  /**
+    * @param {character[]} buf Destination buffer
+    * @param {number} n Number of characters to read
+    * @return {number} The number of actual characters read
+    */
+  return function(buf, n) {
+    let charsRead = 0;
+
+    while (charsRead < n) {
+      if (cacheIndex >= cacheSize) {
+        cache = new Array(4);
+        cacheSize = read4(cache);
+        cacheIndex = 0;
+        if (cacheSize === 0) break;
+      }
+
+      buf[charsRead++] = cache[cacheIndex++];
+    }
+
+    return charsRead;
+  };
+};

From 58deb62546b78c4ca383bb6051b7c7de8865de07 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 18:44:08 -0500
Subject: [PATCH 495/571] Add solution #159

---
 README.md                                     |  1 +
 ...ng-with-at-most-two-distinct-characters.js | 34 +++++++++++++++++++
 2 files changed, 35 insertions(+)
 create mode 100644 solutions/0159-longest-substring-with-at-most-two-distinct-characters.js

diff --git a/README.md b/README.md
index 521ee4bd..37806dff 100644
--- a/README.md
+++ b/README.md
@@ -164,6 +164,7 @@
 156|[Binary Tree Upside Down](./solutions/0156-binary-tree-upside-down.js)|Medium|
 157|[Read N Characters Given Read4](./solutions/0157-read-n-characters-given-read4.js)|Easy|
 158|[Read N Characters Given read4 II - Call Multiple Times](./solutions/0158-read-n-characters-given-read4-ii-call-multiple-times.js)|Hard|
+159|[Longest Substring with At Most Two Distinct Characters](./solutions/0159-longest-substring-with-at-most-two-distinct-characters.js)|Medium|
 160|[Intersection of Two Linked Lists](./solutions/0160-intersection-of-two-linked-lists.js)|Medium|
 162|[Find Peak Element](./solutions/0162-find-peak-element.js)|Medium|
 164|[Maximum Gap](./solutions/0164-maximum-gap.js)|Medium|
diff --git a/solutions/0159-longest-substring-with-at-most-two-distinct-characters.js b/solutions/0159-longest-substring-with-at-most-two-distinct-characters.js
new file mode 100644
index 00000000..8e023114
--- /dev/null
+++ b/solutions/0159-longest-substring-with-at-most-two-distinct-characters.js
@@ -0,0 +1,34 @@
+/**
+ * 159. Longest Substring with At Most Two Distinct Characters
+ * https://leetcode.com/problems/longest-substring-with-at-most-two-distinct-characters/
+ * Difficulty: Medium
+ *
+ * Given a string s, return the length of the longest substring that contains at most two
+ * distinct characters.
+ */
+
+/**
+ * @param {string} s
+ * @return {number}
+ */
+var lengthOfLongestSubstringTwoDistinct = function(s) {
+  const map = new Map();
+  let maxLength = 0;
+  let start = 0;
+
+  for (let end = 0; end < s.length; end++) {
+    map.set(s[end], (map.get(s[end]) || 0) + 1);
+
+    while (map.size > 2) {
+      map.set(s[start], map.get(s[start]) - 1);
+      if (map.get(s[start]) === 0) {
+        map.delete(s[start]);
+      }
+      start++;
+    }
+
+    maxLength = Math.max(maxLength, end - start + 1);
+  }
+
+  return maxLength;
+};

From dfd2d68c8537cd5e66be0825b61eb7ece99eb057 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 18:49:29 -0500
Subject: [PATCH 496/571] Add solution #161

---
 README.md                           |  1 +
 solutions/0161-one-edit-distance.js | 36 +++++++++++++++++++++++++++++
 2 files changed, 37 insertions(+)
 create mode 100644 solutions/0161-one-edit-distance.js

diff --git a/README.md b/README.md
index 37806dff..be959ba1 100644
--- a/README.md
+++ b/README.md
@@ -166,6 +166,7 @@
 158|[Read N Characters Given read4 II - Call Multiple Times](./solutions/0158-read-n-characters-given-read4-ii-call-multiple-times.js)|Hard|
 159|[Longest Substring with At Most Two Distinct Characters](./solutions/0159-longest-substring-with-at-most-two-distinct-characters.js)|Medium|
 160|[Intersection of Two Linked Lists](./solutions/0160-intersection-of-two-linked-lists.js)|Medium|
+161|[One Edit Distance](./solutions/0161-one-edit-distance.js)|Medium|
 162|[Find Peak Element](./solutions/0162-find-peak-element.js)|Medium|
 164|[Maximum Gap](./solutions/0164-maximum-gap.js)|Medium|
 165|[Compare Version Numbers](./solutions/0165-compare-version-numbers.js)|Medium|
diff --git a/solutions/0161-one-edit-distance.js b/solutions/0161-one-edit-distance.js
new file mode 100644
index 00000000..cb69f9ec
--- /dev/null
+++ b/solutions/0161-one-edit-distance.js
@@ -0,0 +1,36 @@
+/**
+ * 161. One Edit Distance
+ * https://leetcode.com/problems/one-edit-distance/
+ * Difficulty: Medium
+ *
+ * Given two strings s and t, return true if they are both one edit distance apart, otherwise
+ * return false.
+ *
+ * A string s is said to be one distance apart from a string t if you can:
+ * - Insert exactly one character into s to get t.
+ * - Delete exactly one character from s to get t.
+ * - Replace exactly one character of s with a different character to get t.
+ */
+
+/**
+ * @param {string} s
+ * @param {string} t
+ * @return {boolean}
+ */
+var isOneEditDistance = function(s, t) {
+  if (s === t) return false;
+  const sLength = s.length;
+  const tLength = t.length;
+  if (Math.abs(sLength - tLength) > 1) return false;
+
+  if (sLength > tLength) return isOneEditDistance(t, s);
+
+  let i = 0;
+  while (i < sLength && s[i] === t[i]) i++;
+
+  if (sLength === tLength) {
+    return i < sLength && s.slice(i + 1) === t.slice(i + 1);
+  }
+
+  return s.slice(i) === t.slice(i + 1);
+};

From c58201ea69b03b0527234f9677aff158651b54fe Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 18:51:15 -0500
Subject: [PATCH 497/571] Add solution #163

---
 README.md                        |  1 +
 solutions/0163-missing-ranges.js | 35 ++++++++++++++++++++++++++++++++
 2 files changed, 36 insertions(+)
 create mode 100644 solutions/0163-missing-ranges.js

diff --git a/README.md b/README.md
index be959ba1..f9f4c4ea 100644
--- a/README.md
+++ b/README.md
@@ -168,6 +168,7 @@
 160|[Intersection of Two Linked Lists](./solutions/0160-intersection-of-two-linked-lists.js)|Medium|
 161|[One Edit Distance](./solutions/0161-one-edit-distance.js)|Medium|
 162|[Find Peak Element](./solutions/0162-find-peak-element.js)|Medium|
+163|[Missing Ranges](./solutions/0163-missing-ranges.js)|Easy|
 164|[Maximum Gap](./solutions/0164-maximum-gap.js)|Medium|
 165|[Compare Version Numbers](./solutions/0165-compare-version-numbers.js)|Medium|
 166|[Fraction to Recurring Decimal](./solutions/0166-fraction-to-recurring-decimal.js)|Medium|
diff --git a/solutions/0163-missing-ranges.js b/solutions/0163-missing-ranges.js
new file mode 100644
index 00000000..717b6edb
--- /dev/null
+++ b/solutions/0163-missing-ranges.js
@@ -0,0 +1,35 @@
+/**
+ * 163. Missing Ranges
+ * https://leetcode.com/problems/missing-ranges/
+ * Difficulty: Easy
+ *
+ * You are given an inclusive range [lower, upper] and a sorted unique integer array nums,
+ * where all elements are within the inclusive range.
+ *
+ * A number x is considered missing if x is in the range [lower, upper] and x is not in nums.
+ *
+ * Return the shortest sorted list of ranges that exactly covers all the missing numbers.
+ * That is, no element of nums is included in any of the ranges, and each missing number
+ * is covered by one of the ranges.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} lower
+ * @param {number} upper
+ * @return {number[][]}
+ */
+var findMissingRanges = function(nums, lower, upper) {
+  const result = [];
+  let prev = lower - 1;
+
+  for (let i = 0; i <= nums.length; i++) {
+    const curr = i < nums.length ? nums[i] : upper + 1;
+    if (curr - prev > 1) {
+      result.push([prev + 1, curr - 1]);
+    }
+    prev = curr;
+  }
+
+  return result;
+};

From 80e2eb6dd3f929098f26c1572b5fe8d944a4a473 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 18:53:41 -0500
Subject: [PATCH 498/571] Add solution #170

---
 README.md                                     |  1 +
 .../0170-two-sum-iii-data-structure-design.js | 42 +++++++++++++++++++
 2 files changed, 43 insertions(+)
 create mode 100644 solutions/0170-two-sum-iii-data-structure-design.js

diff --git a/README.md b/README.md
index f9f4c4ea..076d25c9 100644
--- a/README.md
+++ b/README.md
@@ -175,6 +175,7 @@
 167|[Two Sum II - Input Array Is Sorted](./solutions/0167-two-sum-ii-input-array-is-sorted.js)|Easy|
 168|[Excel Sheet Column Title](./solutions/0168-excel-sheet-column-title.js)|Easy|
 169|[Majority Element](./solutions/0169-majority-element.js)|Easy|
+170|[Two Sum III - Data structure design](./solutions/0170-two-sum-iii-data-structure-design.js)|Easy|
 171|[Excel Sheet Column Number](./solutions/0171-excel-sheet-column-number.js)|Easy|
 172|[Factorial Trailing Zeroes](./solutions/0172-factorial-trailing-zeroes.js)|Medium|
 173|[Binary Search Tree Iterator](./solutions/0173-binary-search-tree-iterator.js)|Medium|
diff --git a/solutions/0170-two-sum-iii-data-structure-design.js b/solutions/0170-two-sum-iii-data-structure-design.js
new file mode 100644
index 00000000..f0cd8777
--- /dev/null
+++ b/solutions/0170-two-sum-iii-data-structure-design.js
@@ -0,0 +1,42 @@
+/**
+ * 170. Two Sum III - Data structure design
+ * https://leetcode.com/problems/two-sum-iii-data-structure-design/
+ * Difficulty: Easy
+ *
+ * Design a data structure that accepts a stream of integers and checks if it has a pair of
+ * integers that sum up to a particular value.
+ *
+ * Implement the TwoSum class:
+ * - TwoSum() Initializes the TwoSum object, with an empty array initially.
+ * - void add(int number) Adds number to the data structure.
+ * - boolean find(int value) Returns true if there exists any pair of numbers whose sum is equal
+ *   to value, otherwise, it returns false.
+ */
+
+var TwoSum = function() {
+  this.numCount = new Map();
+};
+
+/**
+ * @param {number} number
+ * @return {void}
+ */
+TwoSum.prototype.add = function(number) {
+  this.numCount.set(number, (this.numCount.get(number) || 0) + 1);
+};
+
+/**
+ * @param {number} value
+ * @return {boolean}
+ */
+TwoSum.prototype.find = function(value) {
+  for (const num of this.numCount.keys()) {
+    const complement = value - num;
+    if (complement === num) {
+      if (this.numCount.get(num) > 1) return true;
+    } else if (this.numCount.has(complement)) {
+      return true;
+    }
+  }
+  return false;
+};

From 1295bfa53221ed57c921531896ca1a5b55e30cf3 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 18:54:37 -0500
Subject: [PATCH 499/571] Add solution #186

---
 README.md                                     |  1 +
 .../0186-reverse-words-in-a-string-ii.js      | 40 +++++++++++++++++++
 2 files changed, 41 insertions(+)
 create mode 100644 solutions/0186-reverse-words-in-a-string-ii.js

diff --git a/README.md b/README.md
index 076d25c9..a178ce3e 100644
--- a/README.md
+++ b/README.md
@@ -181,6 +181,7 @@
 173|[Binary Search Tree Iterator](./solutions/0173-binary-search-tree-iterator.js)|Medium|
 174|[Dungeon Game](./solutions/0174-dungeon-game.js)|Hard|
 179|[Largest Number](./solutions/0179-largest-number.js)|Medium|
+186|[Reverse Words in a String II](./solutions/0186-reverse-words-in-a-string-ii.js)|Medium|
 187|[Repeated DNA Sequences](./solutions/0187-repeated-dna-sequences.js)|Medium|
 188|[Best Time to Buy and Sell Stock IV](./solutions/0188-best-time-to-buy-and-sell-stock-iv.js)|Hard|
 189|[Rotate Array](./solutions/0189-rotate-array.js)|Medium|
diff --git a/solutions/0186-reverse-words-in-a-string-ii.js b/solutions/0186-reverse-words-in-a-string-ii.js
new file mode 100644
index 00000000..ebc713fa
--- /dev/null
+++ b/solutions/0186-reverse-words-in-a-string-ii.js
@@ -0,0 +1,40 @@
+/**
+ * 186. Reverse Words in a String II
+ * https://leetcode.com/problems/reverse-words-in-a-string-ii/
+ * Difficulty: Medium
+ *
+ * Given a character array s, reverse the order of the words.
+ *
+ * A word is defined as a sequence of non-space characters. The words in s will be separated
+ * by a single space.
+ *
+ * Your code must solve the problem in-place, i.e. without allocating extra space.
+ */
+
+/**
+ * @param {character[]} s
+ * @return {void} Do not return anything, modify s in-place instead.
+ */
+var reverseWords = function(s) {
+  let left = 0;
+  let right = s.length - 1;
+
+  while (left < right) {
+    [s[left], s[right]] = [s[right], s[left]];
+    left++;
+    right--;
+  }
+
+  left = 0;
+  for (let i = 0; i <= s.length; i++) {
+    if (i === s.length || s[i] === ' ') {
+      right = i - 1;
+      while (left < right) {
+        [s[left], s[right]] = [s[right], s[left]];
+        left++;
+        right--;
+      }
+      left = i + 1;
+    }
+  }
+};

From 1989e556c4c5e8a5aa30dac82e703106b5345359 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 18:55:32 -0500
Subject: [PATCH 500/571] Add solution #243

---
 README.md                                |  1 +
 solutions/0243-shortest-word-distance.js | 36 ++++++++++++++++++++++++
 2 files changed, 37 insertions(+)
 create mode 100644 solutions/0243-shortest-word-distance.js

diff --git a/README.md b/README.md
index a178ce3e..74934875 100644
--- a/README.md
+++ b/README.md
@@ -232,6 +232,7 @@
 240|[Search a 2D Matrix II](./solutions/0240-search-a-2d-matrix-ii.js)|Medium|
 241|[Different Ways to Add Parentheses](./solutions/0241-different-ways-to-add-parentheses.js)|Medium|
 242|[Valid Anagram](./solutions/0242-valid-anagram.js)|Easy|
+243|[Shortest Word Distance](./solutions/0243-shortest-word-distance.js)|Easy|
 257|[Binary Tree Paths](./solutions/0257-binary-tree-paths.js)|Easy|
 258|[Add Digits](./solutions/0258-add-digits.js)|Easy|
 260|[Single Number III](./solutions/0260-single-number-iii.js)|Medium|
diff --git a/solutions/0243-shortest-word-distance.js b/solutions/0243-shortest-word-distance.js
new file mode 100644
index 00000000..d05ac820
--- /dev/null
+++ b/solutions/0243-shortest-word-distance.js
@@ -0,0 +1,36 @@
+/**
+ * 243. Shortest Word Distance
+ * https://leetcode.com/problems/shortest-word-distance/
+ * Difficulty: Easy
+ *
+ * Given an array of strings wordsDict and two different strings that already exist in the array
+ * word1 and word2, return the shortest distance between these two words in the list.
+ */
+
+/**
+ * @param {string[]} wordsDict
+ * @param {string} word1
+ * @param {string} word2
+ * @return {number}
+ */
+var shortestDistance = function(wordsDict, word1, word2) {
+  let result = Infinity;
+  let index1 = -1;
+  let index2 = -1;
+
+  for (let i = 0; i < wordsDict.length; i++) {
+    if (wordsDict[i] === word1) {
+      index1 = i;
+      if (index2 !== -1) {
+        result = Math.min(result, index1 - index2);
+      }
+    } else if (wordsDict[i] === word2) {
+      index2 = i;
+      if (index1 !== -1) {
+        result = Math.min(result, index2 - index1);
+      }
+    }
+  }
+
+  return result;
+};

From ea7c0cde4e285e76ec9e1f38dcde9df5ba1aa701 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 18:56:54 -0500
Subject: [PATCH 501/571] Add solution #244

---
 README.md                                   |  1 +
 solutions/0244-shortest-word-distance-ii.js | 50 +++++++++++++++++++++
 2 files changed, 51 insertions(+)
 create mode 100644 solutions/0244-shortest-word-distance-ii.js

diff --git a/README.md b/README.md
index 74934875..717769ed 100644
--- a/README.md
+++ b/README.md
@@ -233,6 +233,7 @@
 241|[Different Ways to Add Parentheses](./solutions/0241-different-ways-to-add-parentheses.js)|Medium|
 242|[Valid Anagram](./solutions/0242-valid-anagram.js)|Easy|
 243|[Shortest Word Distance](./solutions/0243-shortest-word-distance.js)|Easy|
+244|[Shortest Word Distance II](./solutions/0244-shortest-word-distance-ii.js)|Medium|
 257|[Binary Tree Paths](./solutions/0257-binary-tree-paths.js)|Easy|
 258|[Add Digits](./solutions/0258-add-digits.js)|Easy|
 260|[Single Number III](./solutions/0260-single-number-iii.js)|Medium|
diff --git a/solutions/0244-shortest-word-distance-ii.js b/solutions/0244-shortest-word-distance-ii.js
new file mode 100644
index 00000000..3d66d604
--- /dev/null
+++ b/solutions/0244-shortest-word-distance-ii.js
@@ -0,0 +1,50 @@
+/**
+ * 244. Shortest Word Distance II
+ * https://leetcode.com/problems/shortest-word-distance-ii/
+ * Difficulty: Medium
+ *
+ * Design a data structure that will be initialized with a string array, and then it should
+ * answer queries of the shortest distance between two different strings from the array.
+ *
+ * Implement the WordDistance class:
+ * - WordDistance(String[] wordsDict) initializes the object with the strings array wordsDict.
+ * - int shortest(String word1, String word2) returns the shortest distance between word1 and
+ *   word2 in the array wordsDict.
+ */
+
+/**
+ * @param {string[]} wordsDict
+ */
+var WordDistance = function(wordsDict) {
+  this.wordIndices = new Map();
+  for (let i = 0; i < wordsDict.length; i++) {
+    if (!this.wordIndices.has(wordsDict[i])) {
+      this.wordIndices.set(wordsDict[i], []);
+    }
+    this.wordIndices.get(wordsDict[i]).push(i);
+  }
+};
+
+/**
+ * @param {string} word1
+ * @param {string} word2
+ * @return {number}
+ */
+WordDistance.prototype.shortest = function(word1, word2) {
+  const indices1 = this.wordIndices.get(word1);
+  const indices2 = this.wordIndices.get(word2);
+  let minDistance = Infinity;
+  let i = 0;
+  let j = 0;
+
+  while (i < indices1.length && j < indices2.length) {
+    minDistance = Math.min(minDistance, Math.abs(indices1[i] - indices2[j]));
+    if (indices1[i] < indices2[j]) {
+      i++;
+    } else {
+      j++;
+    }
+  }
+
+  return minDistance;
+};

From 51091d3b92e9beba6325a1388767f9831717509b Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 20:29:15 -0500
Subject: [PATCH 502/571] Add solution #2636

---
 README.md                      |  1 +
 solutions/2636-promise-pool.js | 32 ++++++++++++++++++++++++++++++++
 2 files changed, 33 insertions(+)
 create mode 100644 solutions/2636-promise-pool.js

diff --git a/README.md b/README.md
index 717769ed..c55a5172 100644
--- a/README.md
+++ b/README.md
@@ -1976,6 +1976,7 @@
 2631|[Group By](./solutions/2631-group-by.js)|Medium|
 2634|[Filter Elements from Array](./solutions/2634-filter-elements-from-array.js)|Easy|
 2635|[Apply Transform Over Each Element in Array](./solutions/2635-apply-transform-over-each-element-in-array.js)|Easy|
+2636|[Promise Pool](./solutions/2636-promise-pool.js)|Medium|
 2637|[Promise Time Limit](./solutions/2637-promise-time-limit.js)|Medium|
 2639|[Find the Width of Columns of a Grid](./solutions/2639-find-the-width-of-columns-of-a-grid.js)|Easy|
 2640|[Find the Score of All Prefixes of an Array](./solutions/2640-find-the-score-of-all-prefixes-of-an-array.js)|Medium|
diff --git a/solutions/2636-promise-pool.js b/solutions/2636-promise-pool.js
new file mode 100644
index 00000000..c2bde850
--- /dev/null
+++ b/solutions/2636-promise-pool.js
@@ -0,0 +1,32 @@
+/**
+ * 2636. Promise Pool
+ * https://leetcode.com/problems/promise-pool/
+ * Difficulty: Medium
+ *
+ * Given an array of asynchronous functions functions and a pool limit n, return an asynchronous
+ * function promisePool. It should return a promise that resolves when all the input functions
+ * resolve.
+ *
+ * Pool limit is defined as the maximum number promises that can be pending at once. promisePool
+ * should begin execution of as many functions as possible and continue executing new functions
+ * when old promises resolve. promisePool should execute functions[i] then functions[i + 1] then
+ * functions[i + 2], etc. When the last promise resolves, promisePool should also resolve.
+ *
+ * For example, if n = 1, promisePool will execute one function at a time in series. However,
+ * if n = 2, it first executes two functions. When either of the two functions resolve, a 3rd
+ * function should be executed (if available), and so on until there are no functions left to
+ * execute.
+ *
+ * You can assume all functions never reject. It is acceptable for promisePool to return a promise
+ * that resolves any value.
+ */
+
+/**
+ * @param {Function[]} functions
+ * @param {number} n
+ * @return {Promise}
+ */
+var promisePool = async function(functions, n) {
+  const next = () => functions[n++]?.().then(next);
+  return Promise.all(functions.slice(0, n).map(f => f().then(next)));
+};

From b1d45cf0c9a6390a73dfce34d1ea025947061217 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 20:31:03 -0500
Subject: [PATCH 503/571] Add solution #2676

---
 README.md                  |  1 +
 solutions/2676-throttle.js | 55 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 56 insertions(+)
 create mode 100644 solutions/2676-throttle.js

diff --git a/README.md b/README.md
index c55a5172..bd988ca4 100644
--- a/README.md
+++ b/README.md
@@ -2000,6 +2000,7 @@
 2670|[Find the Distinct Difference Array](./solutions/2670-find-the-distinct-difference-array.js)|Easy|
 2672|[Number of Adjacent Elements With the Same Color](./solutions/2672-number-of-adjacent-elements-with-the-same-color.js)|Medium|
 2673|[Make Costs of Paths Equal in a Binary Tree](./solutions/2673-make-costs-of-paths-equal-in-a-binary-tree.js)|Medium|
+2676|[Throttle](./solutions/2676-throttle.js)|Medium|
 2677|[Chunk Array](./solutions/2677-chunk-array.js)|Easy|
 2678|[Number of Senior Citizens](./solutions/2678-number-of-senior-citizens.js)|Easy|
 2680|[Maximum OR](./solutions/2680-maximum-or.js)|Medium|
diff --git a/solutions/2676-throttle.js b/solutions/2676-throttle.js
new file mode 100644
index 00000000..a17f27b2
--- /dev/null
+++ b/solutions/2676-throttle.js
@@ -0,0 +1,55 @@
+/**
+ * 2676. Throttle
+ * https://leetcode.com/problems/throttle/
+ * Difficulty: Medium
+ *
+ * Given a function fn and a time in milliseconds t, return a throttled version of that
+ * function.
+ *
+ * A throttled function is first called without delay and then, for a time interval of
+ * t milliseconds, can't be executed but should store the latest function arguments provided
+ * to call fn with them after the end of the delay.
+ *
+ * For instance, t = 50ms, and the function was called at 30ms, 40ms, and 60ms.
+ *
+ * At 30ms, without delay, the throttled function fn should be called with the arguments,
+ * and calling the throttled function fn should be blocked for the following t milliseconds.
+ *
+ * At 40ms, the function should just save arguments.
+ *
+ * At 60ms, arguments should overwrite currently stored arguments from the second call because
+ * the second and third calls are made before 80ms. Once the delay has passed, the throttled
+ * function fn should be called with the latest arguments provided during the delay period,
+ * and it should also create another delay period of 80ms + t.
+ */
+
+/**
+ * @param {Function} fn
+ * @param {number} t
+ * @return {Function}
+ */
+var throttle = function(fn, t) {
+  let isThrottled = false;
+  let nextArgs = null;
+
+  function invoke() {
+    if (nextArgs) {
+      fn(...nextArgs);
+      nextArgs = null;
+      setTimeout(invoke, t);
+    } else {
+      isThrottled = false;
+    }
+  }
+
+  return function(...args) {
+    if (isThrottled) {
+      nextArgs = args;
+      return;
+    }
+
+    fn(...args);
+    isThrottled = true;
+    setTimeout(invoke, t);
+  };
+};

From e486edb97e0872a2e45376b92204e01aab03a487 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 20:32:21 -0500
Subject: [PATCH 504/571] Add solution #2632

---
 README.md               |  1 +
 solutions/2632-curry.js | 28 ++++++++++++++++++++++++++++
 2 files changed, 29 insertions(+)
 create mode 100644 solutions/2632-curry.js

diff --git a/README.md b/README.md
index bd988ca4..d606e3e9 100644
--- a/README.md
+++ b/README.md
@@ -1974,6 +1974,7 @@
 2629|[Function Composition](./solutions/2629-function-composition.js)|Easy|
 2630|[Memoize II](./solutions/2630-memoize-ii.js)|Hard|
 2631|[Group By](./solutions/2631-group-by.js)|Medium|
+2632|[Curry](./solutions/2632-curry.js)|Medium|
 2634|[Filter Elements from Array](./solutions/2634-filter-elements-from-array.js)|Easy|
 2635|[Apply Transform Over Each Element in Array](./solutions/2635-apply-transform-over-each-element-in-array.js)|Easy|
 2636|[Promise Pool](./solutions/2636-promise-pool.js)|Medium|
diff --git a/solutions/2632-curry.js b/solutions/2632-curry.js
new file mode 100644
index 00000000..23b54c9f
--- /dev/null
+++ b/solutions/2632-curry.js
@@ -0,0 +1,28 @@
+/**
+ * 2632. Curry
+ * https://leetcode.com/problems/curry/
+ * Difficulty: Medium
+ *
+ * Given a function fn, return a curried version of that function.
+ *
+ * A curried function is a function that accepts fewer or an equal number of parameters as the
+ * original function and returns either another curried function or the same value the original
+ * function would have returned.
+ *
+ * In practical terms, if you called the original function like sum(1,2,3), you would call the
+ * curried version like csum(1)(2)(3), csum(1)(2,3), csum(1,2)(3), or csum(1,2,3). All these
+ * methods of calling the curried function should return the same value as the original.
+ */
+
+/**
+ * @param {Function} fn
+ * @return {Function}
+ */
+var curry = function(fn) {
+  return function curried(...args) {
+    if (args.length >= fn.length) {
+      return fn(...args);
+    }
+    return (...nextArgs) => curried(...args, ...nextArgs);
+  };
+};

From 6f25e2430fb752b4ce251422b9ab163a7616a119 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 20:34:14 -0500
Subject: [PATCH 505/571] Add solution #2628

---
 README.md                         |  1 +
 solutions/2628-json-deep-equal.js | 43 +++++++++++++++++++++++++++++++
 2 files changed, 44 insertions(+)
 create mode 100644 solutions/2628-json-deep-equal.js

diff --git a/README.md b/README.md
index d606e3e9..1b6a992f 100644
--- a/README.md
+++ b/README.md
@@ -1971,6 +1971,7 @@
 2625|[Flatten Deeply Nested Array](./solutions/2625-flatten-deeply-nested-array.js)|Medium|
 2626|[Array Reduce Transformation](./solutions/2626-array-reduce-transformation.js)|Easy|
 2627|[Debounce](./solutions/2627-debounce.js)|Medium|
+2628|[JSON Deep Equal](./solutions/2628-json-deep-equal.js)|Medium|
 2629|[Function Composition](./solutions/2629-function-composition.js)|Easy|
 2630|[Memoize II](./solutions/2630-memoize-ii.js)|Hard|
 2631|[Group By](./solutions/2631-group-by.js)|Medium|
diff --git a/solutions/2628-json-deep-equal.js b/solutions/2628-json-deep-equal.js
new file mode 100644
index 00000000..2f0cf372
--- /dev/null
+++ b/solutions/2628-json-deep-equal.js
@@ -0,0 +1,43 @@
+/**
+ * 2628. JSON Deep Equal
+ * https://leetcode.com/problems/json-deep-equal/
+ * Difficulty: Medium
+ *
+ * Given two values o1 and o2, return a boolean value indicating whether two values, o1 and o2,
+ * are deeply equal.
+ *
+ * For two values to be deeply equal, the following conditions must be met:
+ * - If both values are primitive types, they are deeply equal if they pass the === equality check.
+ * - If both values are arrays, they are deeply equal if they have the same elements in the same
+ *   order, and each element is also deeply equal according to these conditions.
+ * - If both values are objects, they are deeply equal if they have the same keys, and the
+ *   associated values for each key are also deeply equal according to these conditions.
+ *
+ * You may assume both values are the output of JSON.parse. In other words, they are valid JSON.
+ *
+ * Please solve it without using lodash's _.isEqual() function
+ */
+
+/**
+ * @param {null|boolean|number|string|Array|Object} o1
+ * @param {null|boolean|number|string|Array|Object} o2
+ * @return {boolean}
+ */
+var areDeeplyEqual = function(o1, o2) {
+  if (o1 === o2) return true;
+  if (o1 == null || o2 == null) return false;
+  if (typeof o1 !== 'object' || typeof o2 !== 'object') return false;
+
+  if (Array.isArray(o1) !== Array.isArray(o2)) return false;
+
+  if (Array.isArray(o1)) {
+    if (o1.length !== o2.length) return false;
+    return o1.every((item, index) => areDeeplyEqual(item, o2[index]));
+  }
+
+  const keys1 = Object.keys(o1);
+  const keys2 = Object.keys(o2);
+  if (keys1.length !== keys2.length) return false;
+
+  return keys1.every(key => keys2.includes(key) && areDeeplyEqual(o1[key], o2[key]));
+};

From 8c3c2f77cefb288e4b31b717dfd1b7d7f1e4c3ae Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 20:37:39 -0500
Subject: [PATCH 506/571] Add solution #2633

---
 README.md                                     |  1 +
 .../2633-convert-object-to-json-string.js     | 29 +++++++++++++++++++
 2 files changed, 30 insertions(+)
 create mode 100644 solutions/2633-convert-object-to-json-string.js

diff --git a/README.md b/README.md
index 1b6a992f..6af6cc1f 100644
--- a/README.md
+++ b/README.md
@@ -1976,6 +1976,7 @@
 2630|[Memoize II](./solutions/2630-memoize-ii.js)|Hard|
 2631|[Group By](./solutions/2631-group-by.js)|Medium|
 2632|[Curry](./solutions/2632-curry.js)|Medium|
+2633|[Convert Object to JSON String](./solutions/2633-convert-object-to-json-string.js)|Medium|
 2634|[Filter Elements from Array](./solutions/2634-filter-elements-from-array.js)|Easy|
 2635|[Apply Transform Over Each Element in Array](./solutions/2635-apply-transform-over-each-element-in-array.js)|Easy|
 2636|[Promise Pool](./solutions/2636-promise-pool.js)|Medium|
diff --git a/solutions/2633-convert-object-to-json-string.js b/solutions/2633-convert-object-to-json-string.js
new file mode 100644
index 00000000..90fd0f2e
--- /dev/null
+++ b/solutions/2633-convert-object-to-json-string.js
@@ -0,0 +1,29 @@
+/**
+ * 2633. Convert Object to JSON String
+ * https://leetcode.com/problems/convert-object-to-json-string/
+ * Difficulty: Medium
+ *
+ * Given a value, return a valid JSON string of that value. The value can be a string, number,
+ * array, object, boolean, or null. The returned string should not include extra spaces. The
+ * order of keys should be the same as the order returned by Object.keys().
+ *
+ * Please solve it without using the built-in JSON.stringify method.
+ */
+
+/**
+ * @param {null|boolean|number|string|Array|Object} object
+ * @return {string}
+ */
+var jsonStringify = function(object) {
+  if (object === null) return 'null';
+  if (typeof object === 'boolean' || typeof object === 'number') return String(object);
+  if (typeof object === 'string') return `"${object}"`;
+
+  if (Array.isArray(object)) {
+    const elements = object.map(item => jsonStringify(item));
+    return `[${elements.join(',')}]`;
+  }
+
+  const pairs = Object.keys(object).map(key => `"${key}":${jsonStringify(object[key])}`);
+  return `{${pairs.join(',')}}`;
+};

From 1be86642961b2026762f67aff930769f764d5312 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 22:54:56 -0500
Subject: [PATCH 507/571] Add solution #245

---
 README.md                                    |  1 +
 solutions/0245-shortest-word-distance-iii.js | 46 ++++++++++++++++++++
 2 files changed, 47 insertions(+)
 create mode 100644 solutions/0245-shortest-word-distance-iii.js

diff --git a/README.md b/README.md
index 6af6cc1f..ce1d26be 100644
--- a/README.md
+++ b/README.md
@@ -234,6 +234,7 @@
 242|[Valid Anagram](./solutions/0242-valid-anagram.js)|Easy|
 243|[Shortest Word Distance](./solutions/0243-shortest-word-distance.js)|Easy|
 244|[Shortest Word Distance II](./solutions/0244-shortest-word-distance-ii.js)|Medium|
+245|[Shortest Word Distance III](./solutions/0245-shortest-word-distance-iii.js)|Medium|
 257|[Binary Tree Paths](./solutions/0257-binary-tree-paths.js)|Easy|
 258|[Add Digits](./solutions/0258-add-digits.js)|Easy|
 260|[Single Number III](./solutions/0260-single-number-iii.js)|Medium|
diff --git a/solutions/0245-shortest-word-distance-iii.js b/solutions/0245-shortest-word-distance-iii.js
new file mode 100644
index 00000000..0e1c24f5
--- /dev/null
+++ b/solutions/0245-shortest-word-distance-iii.js
@@ -0,0 +1,46 @@
+/**
+ * 245. Shortest Word Distance III
+ * https://leetcode.com/problems/shortest-word-distance-iii/
+ * Difficulty: Medium
+ *
+ * Given an array of strings wordsDict and two strings that already exist in the array word1
+ * and word2, return the shortest distance between the occurrence of these two words in the list.
+ *
+ * Note that word1 and word2 may be the same. It is guaranteed that they represent two individual
+ * words in the list.
+ */
+
+/**
+ * @param {string[]} wordsDict
+ * @param {string} word1
+ * @param {string} word2
+ * @return {number}
+ */
+var shortestWordDistance = function(wordsDict, word1, word2) {
+  let result = Infinity;
+  let lastWord1Index = -1;
+  let lastWord2Index = -1;
+  const areSameWords = word1 === word2;
+
+  for (let index = 0; index < wordsDict.length; index++) {
+    const currentWord = wordsDict[index];
+
+    if (currentWord === word1) {
+      if (areSameWords) {
+        if (lastWord1Index !== -1) {
+          result = Math.min(result, index - lastWord1Index);
+        }
+      } else if (lastWord2Index !== -1) {
+        result = Math.min(result, index - lastWord2Index);
+      }
+      lastWord1Index = index;
+    } else if (!areSameWords && currentWord === word2) {
+      if (lastWord1Index !== -1) {
+        result = Math.min(result, index - lastWord1Index);
+      }
+      lastWord2Index = index;
+    }
+  }
+
+  return result;
+};

From d185181a712677f80e9603fc069f131e42c5d8a0 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 22:55:56 -0500
Subject: [PATCH 508/571] Add solution #246

---
 README.md                                |  1 +
 solutions/0246-strobogrammatic-number.js | 40 ++++++++++++++++++++++++
 2 files changed, 41 insertions(+)
 create mode 100644 solutions/0246-strobogrammatic-number.js

diff --git a/README.md b/README.md
index ce1d26be..05e7c420 100644
--- a/README.md
+++ b/README.md
@@ -235,6 +235,7 @@
 243|[Shortest Word Distance](./solutions/0243-shortest-word-distance.js)|Easy|
 244|[Shortest Word Distance II](./solutions/0244-shortest-word-distance-ii.js)|Medium|
 245|[Shortest Word Distance III](./solutions/0245-shortest-word-distance-iii.js)|Medium|
+246|[Strobogrammatic Number](./solutions/0246-strobogrammatic-number.js)|Easy|
 257|[Binary Tree Paths](./solutions/0257-binary-tree-paths.js)|Easy|
 258|[Add Digits](./solutions/0258-add-digits.js)|Easy|
 260|[Single Number III](./solutions/0260-single-number-iii.js)|Medium|
diff --git a/solutions/0246-strobogrammatic-number.js b/solutions/0246-strobogrammatic-number.js
new file mode 100644
index 00000000..19c3ab46
--- /dev/null
+++ b/solutions/0246-strobogrammatic-number.js
@@ -0,0 +1,40 @@
+/**
+ * 246. Strobogrammatic Number
+ * https://leetcode.com/problems/strobogrammatic-number/
+ * Difficulty: Easy
+ *
+ * Given a string num which represents an integer, return true if num is a strobogrammatic number.
+ *
+ * A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at
+ * upside down).
+ */
+
+/**
+ * @param {string} num
+ * @return {boolean}
+ */
+var isStrobogrammatic = function(num) {
+  const validPairs = new Map([
+    ['0', '0'],
+    ['1', '1'],
+    ['6', '9'],
+    ['8', '8'],
+    ['9', '6']
+  ]);
+  let left = 0;
+  let right = num.length - 1;
+
+  while (left <= right) {
+    const leftDigit = num[left];
+    const rightDigit = num[right];
+
+    if (!validPairs.has(leftDigit) || validPairs.get(leftDigit) !== rightDigit) {
+      return false;
+    }
+
+    left++;
+    right--;
+  }
+
+  return true;
+};

From 5a3caf19b4d2e279f385a20f36a953945fd0129d Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 22:56:56 -0500
Subject: [PATCH 509/571] Add solution #247

---
 README.md                                   |  1 +
 solutions/0247-strobogrammatic-number-ii.js | 43 +++++++++++++++++++++
 2 files changed, 44 insertions(+)
 create mode 100644 solutions/0247-strobogrammatic-number-ii.js

diff --git a/README.md b/README.md
index 05e7c420..5c8b989e 100644
--- a/README.md
+++ b/README.md
@@ -236,6 +236,7 @@
 244|[Shortest Word Distance II](./solutions/0244-shortest-word-distance-ii.js)|Medium|
 245|[Shortest Word Distance III](./solutions/0245-shortest-word-distance-iii.js)|Medium|
 246|[Strobogrammatic Number](./solutions/0246-strobogrammatic-number.js)|Easy|
+247|[Strobogrammatic Number II](./solutions/0247-strobogrammatic-number-ii.js)|Medium|
 257|[Binary Tree Paths](./solutions/0257-binary-tree-paths.js)|Easy|
 258|[Add Digits](./solutions/0258-add-digits.js)|Easy|
 260|[Single Number III](./solutions/0260-single-number-iii.js)|Medium|
diff --git a/solutions/0247-strobogrammatic-number-ii.js b/solutions/0247-strobogrammatic-number-ii.js
new file mode 100644
index 00000000..d8ebf09a
--- /dev/null
+++ b/solutions/0247-strobogrammatic-number-ii.js
@@ -0,0 +1,43 @@
+/**
+ * 247. Strobogrammatic Number II
+ * https://leetcode.com/problems/strobogrammatic-number-ii/
+ * Difficulty: Medium
+ *
+ * Given an integer n, return all the strobogrammatic numbers that are of length n. You may
+ * return the answer in any order.
+ *
+ * A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked
+ * at upside down).
+ */
+
+/**
+ * @param {number} n
+ * @return {string[]}
+ */
+var findStrobogrammatic = function(n) {
+  const pairs = [
+    ['0', '0'],
+    ['1', '1'],
+    ['6', '9'],
+    ['8', '8'],
+    ['9', '6']
+  ];
+
+  return generateStrobogrammatic(n, n);
+
+  function generateStrobogrammatic(length, finalLength) {
+    if (length === 0) return [''];
+    if (length === 1) return ['0', '1', '8'];
+
+    const result = [];
+    const subNumbers = generateStrobogrammatic(length - 2, finalLength);
+    for (const [left, right] of pairs) {
+      for (const sub of subNumbers) {
+        if (length === finalLength && left === '0') continue;
+        result.push(left + sub + right);
+      }
+    }
+
+    return result;
+  }
+};

From c67cbf0263f057db819e31375cd95f0491e90a15 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 22:58:27 -0500
Subject: [PATCH 510/571] Add solution #248

---
 README.md                                    |  1 +
 solutions/0248-strobogrammatic-number-iii.js | 65 ++++++++++++++++++++
 2 files changed, 66 insertions(+)
 create mode 100644 solutions/0248-strobogrammatic-number-iii.js

diff --git a/README.md b/README.md
index 5c8b989e..f0f56a9e 100644
--- a/README.md
+++ b/README.md
@@ -237,6 +237,7 @@
 245|[Shortest Word Distance III](./solutions/0245-shortest-word-distance-iii.js)|Medium|
 246|[Strobogrammatic Number](./solutions/0246-strobogrammatic-number.js)|Easy|
 247|[Strobogrammatic Number II](./solutions/0247-strobogrammatic-number-ii.js)|Medium|
+248|[Strobogrammatic Number III](./solutions/0248-strobogrammatic-number-iii.js)|Hard|
 257|[Binary Tree Paths](./solutions/0257-binary-tree-paths.js)|Easy|
 258|[Add Digits](./solutions/0258-add-digits.js)|Easy|
 260|[Single Number III](./solutions/0260-single-number-iii.js)|Medium|
diff --git a/solutions/0248-strobogrammatic-number-iii.js b/solutions/0248-strobogrammatic-number-iii.js
new file mode 100644
index 00000000..d20b8dda
--- /dev/null
+++ b/solutions/0248-strobogrammatic-number-iii.js
@@ -0,0 +1,65 @@
+/**
+ * 248. Strobogrammatic Number III
+ * https://leetcode.com/problems/strobogrammatic-number-iii/
+ * Difficulty: Hard
+ *
+ * Given two strings low and high that represent two integers low and high where low <= high,
+ * return the number of strobogrammatic numbers in the range [low, high].
+ *
+ * A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked
+ * at upside down).
+ */
+
+/**
+ * @param {string} low
+ * @param {string} high
+ * @return {number}
+ */
+var strobogrammaticInRange = function(low, high) {
+  const pairs = [
+    ['0', '0'],
+    ['1', '1'],
+    ['6', '9'],
+    ['8', '8'],
+    ['9', '6']
+  ];
+
+  function generateStrobogrammatic(length, isOuter) {
+    if (length === 0) return [''];
+    if (length === 1) return ['0', '1', '8'];
+
+    const result = [];
+    const subNumbers = generateStrobogrammatic(length - 2, false);
+
+    for (const [left, right] of pairs) {
+      for (const sub of subNumbers) {
+        if (isOuter && left === '0') continue;
+        result.push(left + sub + right);
+      }
+    }
+
+    return result;
+  }
+
+  function countInRange(num, lowVal, highVal) {
+    if (num.length < lowVal.length || num.length > highVal.length) return false;
+    if (num.length === lowVal.length && num < lowVal) return false;
+    if (num.length === highVal.length && num > highVal) return false;
+    return true;
+  }
+
+  let count = 0;
+  const lowLength = low.length;
+  const highLength = high.length;
+
+  for (let len = lowLength; len <= highLength; len++) {
+    const numbers = generateStrobogrammatic(len, true);
+    for (const num of numbers) {
+      if (countInRange(num, low, high)) {
+        count++;
+      }
+    }
+  }
+
+  return count;
+};

From 07784bdbec8550f51340cc33a3b4cce749820aad Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 8 Jun 2025 23:00:17 -0500
Subject: [PATCH 511/571] Add solution #249

---
 README.md                               |  1 +
 solutions/0249-group-shifted-strings.js | 49 +++++++++++++++++++++++++
 2 files changed, 50 insertions(+)
 create mode 100644 solutions/0249-group-shifted-strings.js

diff --git a/README.md b/README.md
index f0f56a9e..fcad0802 100644
--- a/README.md
+++ b/README.md
@@ -238,6 +238,7 @@
 246|[Strobogrammatic Number](./solutions/0246-strobogrammatic-number.js)|Easy|
 247|[Strobogrammatic Number II](./solutions/0247-strobogrammatic-number-ii.js)|Medium|
 248|[Strobogrammatic Number III](./solutions/0248-strobogrammatic-number-iii.js)|Hard|
+249|[Group Shifted Strings](./solutions/0249-group-shifted-strings.js)|Medium|
 257|[Binary Tree Paths](./solutions/0257-binary-tree-paths.js)|Easy|
 258|[Add Digits](./solutions/0258-add-digits.js)|Easy|
 260|[Single Number III](./solutions/0260-single-number-iii.js)|Medium|
diff --git a/solutions/0249-group-shifted-strings.js b/solutions/0249-group-shifted-strings.js
new file mode 100644
index 00000000..cbcfaf26
--- /dev/null
+++ b/solutions/0249-group-shifted-strings.js
@@ -0,0 +1,49 @@
+/**
+ * 249. Group Shifted Strings
+ * https://leetcode.com/problems/group-shifted-strings/
+ * Difficulty: Medium
+ *
+ * Perform the following shift operations on a string:
+ * - Right shift: Replace every letter with the successive letter of the English alphabet, where
+ *   'z' is replaced by 'a'. For example, "abc" can be right-shifted to "bcd" or "xyz" can be
+ *   right-shifted to "yza".
+ * - Left shift: Replace every letter with the preceding letter of the English alphabet, where
+ *   'a' is replaced by 'z'. For example, "bcd" can be left-shifted to "abc" or "yza" can be
+ *   left-shifted to "xyz".
+ *
+ * We can keep shifting the string in both directions to form an endless shifting sequence.
+ * - For example, shift "abc" to form the sequence: ... <-> "abc" <-> "bcd" <-> ... <-> "xyz"
+ *   <-> "yza" <-> .... <-> "zab" <-> "abc" <-> ...
+ *
+ * You are given an array of strings strings, group together all strings[i] that belong to the same
+ * shifting sequence. You may return the answer in any order.
+ */
+
+/**
+ * @param {string[]} strings
+ * @return {string[][]}
+ */
+var groupStrings = function(strings) {
+  const groups = new Map();
+
+  for (const str of strings) {
+    const key = getShiftKey(str);
+    if (!groups.has(key)) {
+      groups.set(key, []);
+    }
+    groups.get(key).push(str);
+  }
+
+  return Array.from(groups.values());
+
+  function getShiftKey(str) {
+    if (str.length === 1) return 'single';
+    const key = [];
+    for (let i = 1; i < str.length; i++) {
+      let diff = str.charCodeAt(i) - str.charCodeAt(i - 1);
+      if (diff < 0) diff += 26;
+      key.push(diff);
+    }
+    return key.join(',');
+  }
+};

From 78226951755d3737afcfd2cff95ab7cc87c30023 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Mon, 9 Jun 2025 23:38:10 -0500
Subject: [PATCH 512/571] Add solution #250

---
 README.md                                 |  1 +
 solutions/0250-count-univalue-subtrees.js | 44 +++++++++++++++++++++++
 2 files changed, 45 insertions(+)
 create mode 100644 solutions/0250-count-univalue-subtrees.js

diff --git a/README.md b/README.md
index fcad0802..0c92dcf0 100644
--- a/README.md
+++ b/README.md
@@ -239,6 +239,7 @@
 247|[Strobogrammatic Number II](./solutions/0247-strobogrammatic-number-ii.js)|Medium|
 248|[Strobogrammatic Number III](./solutions/0248-strobogrammatic-number-iii.js)|Hard|
 249|[Group Shifted Strings](./solutions/0249-group-shifted-strings.js)|Medium|
+250|[Count Univalue Subtrees](./solutions/0250-count-univalue-subtrees.js)|Medium|
 257|[Binary Tree Paths](./solutions/0257-binary-tree-paths.js)|Easy|
 258|[Add Digits](./solutions/0258-add-digits.js)|Easy|
 260|[Single Number III](./solutions/0260-single-number-iii.js)|Medium|
diff --git a/solutions/0250-count-univalue-subtrees.js b/solutions/0250-count-univalue-subtrees.js
new file mode 100644
index 00000000..8a8e14ff
--- /dev/null
+++ b/solutions/0250-count-univalue-subtrees.js
@@ -0,0 +1,44 @@
+/**
+ * 250. Count Univalue Subtrees
+ * https://leetcode.com/problems/count-univalue-subtrees/
+ * Difficulty: Medium
+ *
+ * Given the root of a binary tree, return the number of uni-value subtrees.
+ *
+ * A uni-value subtree means all nodes of the subtree have the same value.
+ */
+
+/**
+ * Definition for a binary tree node.
+ * function TreeNode(val, left, right) {
+ *     this.val = (val===undefined ? 0 : val)
+ *     this.left = (left===undefined ? null : left)
+ *     this.right = (right===undefined ? null : right)
+ * }
+ */
+/**
+ * @param {TreeNode} root
+ * @return {number}
+ */
+var countUnivalSubtrees = function(root) {
+  let count = 0;
+  traverse(root);
+  return count;
+
+  function isUnival(node, value) {
+    if (!node) return true;
+
+    if (node.val !== value) return false;
+
+    return isUnival(node.left, value) && isUnival(node.right, value);
+  }
+
+  function traverse(node) {
+    if (!node) return;
+
+    if (isUnival(node, node.val)) count++;
+
+    traverse(node.left);
+    traverse(node.right);
+  }
+};

From e2a514394a2ca4aee648b7067f5b64a2a2c9290d Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 10 Jun 2025 21:49:19 -0500
Subject: [PATCH 513/571] Add solution #3442

---
 README.md                                     |  1 +
 ...erence-between-even-and-odd-frequency-i.js | 39 +++++++++++++++++++
 2 files changed, 40 insertions(+)
 create mode 100644 solutions/3442-maximum-difference-between-even-and-odd-frequency-i.js

diff --git a/README.md b/README.md
index 0c92dcf0..c0a41c70 100644
--- a/README.md
+++ b/README.md
@@ -2222,6 +2222,7 @@
 3397|[Maximum Number of Distinct Elements After Operations](./solutions/3397-maximum-number-of-distinct-elements-after-operations.js)|Medium|
 3402|[Minimum Operations to Make Columns Strictly Increasing](./solutions/3402-minimum-operations-to-make-columns-strictly-increasing.js)|Easy|
 3403|[Find the Lexicographically Largest String From the Box I](./solutions/3403-find-the-lexicographically-largest-string-from-the-box-i.js)|Medium|
+3442|[Maximum Difference Between Even and Odd Frequency I](./solutions/3442-maximum-difference-between-even-and-odd-frequency-i.js)|Easy|
 3452|[Sum of Good Numbers](./solutions/3452-sum-of-good-numbers.js)|Easy|
 3461|[Check If Digits Are Equal in String After Operations I](./solutions/3461-check-if-digits-are-equal-in-string-after-operations-i.js)|Easy|
 3462|[Maximum Sum With at Most K Elements](./solutions/3462-maximum-sum-with-at-most-k-elements.js)|Medium|
diff --git a/solutions/3442-maximum-difference-between-even-and-odd-frequency-i.js b/solutions/3442-maximum-difference-between-even-and-odd-frequency-i.js
new file mode 100644
index 00000000..313d3fb5
--- /dev/null
+++ b/solutions/3442-maximum-difference-between-even-and-odd-frequency-i.js
@@ -0,0 +1,39 @@
+/**
+ * 3442. Maximum Difference Between Even and Odd Frequency I
+ * https://leetcode.com/problems/maximum-difference-between-even-and-odd-frequency-i/
+ * Difficulty: Easy
+ *
+ * You are given a string s consisting of lowercase English letters.
+ *
+ * Your task is to find the maximum difference diff = freq(a1) - freq(a2) between the frequency
+ * of characters a1 and a2 in the string such that:
+ * - a1 has an odd frequency in the string.
+ * - a2 has an even frequency in the string.
+ *
+ * Return this maximum difference.
+ */
+
+/**
+ * @param {string} s
+ * @return {number}
+ */
+var maxDifference = function(s) {
+  const map = new Map();
+
+  for (const char of s) {
+    map.set(char, (map.get(char) || 0) + 1);
+  }
+
+  let maxOdd = 0;
+  let minEven = Infinity;
+
+  for (const freq of map.values()) {
+    if (freq % 2 === 1) {
+      maxOdd = Math.max(maxOdd, freq);
+    } else {
+      minEven = Math.min(minEven, freq);
+    }
+  }
+
+  return maxOdd - minEven;
+};

From 64ed1dbdf57c5421d6b13d2e86aab9413296a962 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 10 Jun 2025 21:50:48 -0500
Subject: [PATCH 514/571] Add solution #251

---
 README.md                           |  1 +
 solutions/0251-flatten-2d-vector.js | 44 +++++++++++++++++++++++++++++
 2 files changed, 45 insertions(+)
 create mode 100644 solutions/0251-flatten-2d-vector.js

diff --git a/README.md b/README.md
index c0a41c70..d66153bb 100644
--- a/README.md
+++ b/README.md
@@ -240,6 +240,7 @@
 248|[Strobogrammatic Number III](./solutions/0248-strobogrammatic-number-iii.js)|Hard|
 249|[Group Shifted Strings](./solutions/0249-group-shifted-strings.js)|Medium|
 250|[Count Univalue Subtrees](./solutions/0250-count-univalue-subtrees.js)|Medium|
+251|[Flatten 2D Vector](./solutions/0251-flatten-2d-vector.js)|Medium|
 257|[Binary Tree Paths](./solutions/0257-binary-tree-paths.js)|Easy|
 258|[Add Digits](./solutions/0258-add-digits.js)|Easy|
 260|[Single Number III](./solutions/0260-single-number-iii.js)|Medium|
diff --git a/solutions/0251-flatten-2d-vector.js b/solutions/0251-flatten-2d-vector.js
new file mode 100644
index 00000000..612cc921
--- /dev/null
+++ b/solutions/0251-flatten-2d-vector.js
@@ -0,0 +1,44 @@
+/**
+ * 251. Flatten 2D Vector
+ * https://leetcode.com/problems/flatten-2d-vector/
+ * Difficulty: Medium
+ *
+ * Design an iterator to flatten a 2D vector. It should support the next and hasNext operations.
+ *
+ * Implement the Vector2D class:
+ * - Vector2D(int[][] vec) initializes the object with the 2D vector vec.
+ * - next() returns the next element from the 2D vector and moves the pointer one step forward.
+ *   You may assume that all the calls to next are valid.
+ * - hasNext() returns true if there are still some elements in the vector, and false otherwise.
+ */
+
+/**
+ * @param {number[][]} vec
+ */
+var Vector2D = function(vec) {
+  this.vector = vec;
+  this.row = 0;
+  this.col = 0;
+};
+
+/**
+ * @return {number}
+ */
+Vector2D.prototype.next = function() {
+  while (this.row < this.vector.length && this.col >= this.vector[this.row].length) {
+    this.row++;
+    this.col = 0;
+  }
+  return this.vector[this.row][this.col++];
+};
+
+/**
+ * @return {boolean}
+ */
+Vector2D.prototype.hasNext = function() {
+  while (this.row < this.vector.length && this.col >= this.vector[this.row].length) {
+    this.row++;
+    this.col = 0;
+  }
+  return this.row < this.vector.length;
+};

From 281d6bd6776644b6d571b731e91dab6b9c9c082d Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 10 Jun 2025 21:52:03 -0500
Subject: [PATCH 515/571] Add solution #252

---
 README.md                       |  1 +
 solutions/0252-meeting-rooms.js | 24 ++++++++++++++++++++++++
 2 files changed, 25 insertions(+)
 create mode 100644 solutions/0252-meeting-rooms.js

diff --git a/README.md b/README.md
index d66153bb..1129452e 100644
--- a/README.md
+++ b/README.md
@@ -241,6 +241,7 @@
 249|[Group Shifted Strings](./solutions/0249-group-shifted-strings.js)|Medium|
 250|[Count Univalue Subtrees](./solutions/0250-count-univalue-subtrees.js)|Medium|
 251|[Flatten 2D Vector](./solutions/0251-flatten-2d-vector.js)|Medium|
+252|[Meeting Rooms](./solutions/0252-meeting-rooms.js)|Easy|
 257|[Binary Tree Paths](./solutions/0257-binary-tree-paths.js)|Easy|
 258|[Add Digits](./solutions/0258-add-digits.js)|Easy|
 260|[Single Number III](./solutions/0260-single-number-iii.js)|Medium|
diff --git a/solutions/0252-meeting-rooms.js b/solutions/0252-meeting-rooms.js
new file mode 100644
index 00000000..09045654
--- /dev/null
+++ b/solutions/0252-meeting-rooms.js
@@ -0,0 +1,24 @@
+/**
+ * 252. Meeting Rooms
+ * https://leetcode.com/problems/meeting-rooms/
+ * Difficulty: Easy
+ *
+ * Given an array of meeting time intervals where intervals[i] = [starti, endi], determine
+ * if a person could attend all meetings.
+ */
+
+/**
+ * @param {number[][]} intervals
+ * @return {boolean}
+ */
+var canAttendMeetings = function(intervals) {
+  intervals.sort((a, b) => a[0] - b[0]);
+
+  for (let i = 1; i < intervals.length; i++) {
+    if (intervals[i][0] < intervals[i - 1][1]) {
+      return false;
+    }
+  }
+
+  return true;
+};

From dd567cc40756eddd0a419d3322358e5ee71886ad Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 10 Jun 2025 21:53:02 -0500
Subject: [PATCH 516/571] Add solution #253

---
 README.md                          |  1 +
 solutions/0253-meeting-rooms-ii.js | 34 ++++++++++++++++++++++++++++++
 2 files changed, 35 insertions(+)
 create mode 100644 solutions/0253-meeting-rooms-ii.js

diff --git a/README.md b/README.md
index 1129452e..00485098 100644
--- a/README.md
+++ b/README.md
@@ -242,6 +242,7 @@
 250|[Count Univalue Subtrees](./solutions/0250-count-univalue-subtrees.js)|Medium|
 251|[Flatten 2D Vector](./solutions/0251-flatten-2d-vector.js)|Medium|
 252|[Meeting Rooms](./solutions/0252-meeting-rooms.js)|Easy|
+253|[Meeting Rooms II](./solutions/0253-meeting-rooms-ii.js)|Medium|
 257|[Binary Tree Paths](./solutions/0257-binary-tree-paths.js)|Easy|
 258|[Add Digits](./solutions/0258-add-digits.js)|Easy|
 260|[Single Number III](./solutions/0260-single-number-iii.js)|Medium|
diff --git a/solutions/0253-meeting-rooms-ii.js b/solutions/0253-meeting-rooms-ii.js
new file mode 100644
index 00000000..2c08e7e3
--- /dev/null
+++ b/solutions/0253-meeting-rooms-ii.js
@@ -0,0 +1,34 @@
+/**
+ * 253. Meeting Rooms II
+ * https://leetcode.com/problems/meeting-rooms-ii/
+ * Difficulty: Medium
+ *
+ * Given an array of meeting time intervals intervals where intervals[i] = [starti, endi],
+ * return the minimum number of conference rooms required.
+ */
+
+/**
+ * @param {number[][]} intervals
+ * @return {number}
+ */
+var minMeetingRooms = function(intervals) {
+  const starts = intervals.map(([start]) => start).sort((a, b) => a - b);
+  const ends = intervals.map(([, end]) => end).sort((a, b) => a - b);
+  let rooms = 0;
+  let startIndex = 0;
+  let endIndex = 0;
+  let result = 0;
+
+  while (startIndex < intervals.length) {
+    if (starts[startIndex] < ends[endIndex]) {
+      rooms++;
+      result = Math.max(result, rooms);
+      startIndex++;
+    } else {
+      rooms--;
+      endIndex++;
+    }
+  }
+
+  return result;
+};

From 1781b76797d1649ca9617b2eb80df8fa7a64f146 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 10 Jun 2025 22:03:02 -0500
Subject: [PATCH 517/571] Add solution #3445

---
 README.md                                     |  1 +
 ...rence-between-even-and-odd-frequency-ii.js | 70 +++++++++++++++++++
 2 files changed, 71 insertions(+)
 create mode 100644 solutions/3445-maximum-difference-between-even-and-odd-frequency-ii.js

diff --git a/README.md b/README.md
index 00485098..c2bca6de 100644
--- a/README.md
+++ b/README.md
@@ -2226,6 +2226,7 @@
 3402|[Minimum Operations to Make Columns Strictly Increasing](./solutions/3402-minimum-operations-to-make-columns-strictly-increasing.js)|Easy|
 3403|[Find the Lexicographically Largest String From the Box I](./solutions/3403-find-the-lexicographically-largest-string-from-the-box-i.js)|Medium|
 3442|[Maximum Difference Between Even and Odd Frequency I](./solutions/3442-maximum-difference-between-even-and-odd-frequency-i.js)|Easy|
+3445|[Maximum Difference Between Even and Odd Frequency II](./solutions/3445-maximum-difference-between-even-and-odd-frequency-ii.js)|Hard|
 3452|[Sum of Good Numbers](./solutions/3452-sum-of-good-numbers.js)|Easy|
 3461|[Check If Digits Are Equal in String After Operations I](./solutions/3461-check-if-digits-are-equal-in-string-after-operations-i.js)|Easy|
 3462|[Maximum Sum With at Most K Elements](./solutions/3462-maximum-sum-with-at-most-k-elements.js)|Medium|
diff --git a/solutions/3445-maximum-difference-between-even-and-odd-frequency-ii.js b/solutions/3445-maximum-difference-between-even-and-odd-frequency-ii.js
new file mode 100644
index 00000000..3648091e
--- /dev/null
+++ b/solutions/3445-maximum-difference-between-even-and-odd-frequency-ii.js
@@ -0,0 +1,70 @@
+/**
+ * 3445. Maximum Difference Between Even and Odd Frequency II
+ * https://leetcode.com/problems/maximum-difference-between-even-and-odd-frequency-ii/
+ * Difficulty: Hard
+ *
+ * You are given a string s and an integer k. Your task is to find the maximum difference between
+ * the frequency of two characters, freq[a] - freq[b], in a substring subs of s, such that:
+ * - subs has a size of at least k.
+ * - Character a has an odd frequency in subs.
+ * - Character b has an even frequency in subs.
+ *
+ * Return the maximum difference.
+ *
+ * Note that subs can contain more than 2 distinct characters.
+ */
+
+/**
+ * @param {string} s
+ * @param {number} k
+ * @return {number}
+ */
+var maxDifference = function(s, k) {
+  const n = s.length;
+  let result = -Infinity;
+
+  const calculateParityStatus = (freqA, freqB) => {
+    return ((freqA & 1) << 1) | (freqB & 1);
+  };
+
+  for (const charA of ['0', '1', '2', '3', '4']) {
+    for (const charB of ['0', '1', '2', '3', '4']) {
+      if (charA === charB) continue;
+
+      const minDifferences = [Infinity, Infinity, Infinity, Infinity];
+      let currentFreqA = 0;
+      let currentFreqB = 0;
+      let prefixFreqA = 0;
+      let prefixFreqB = 0;
+      let leftBoundary = -1;
+
+      for (let rightIndex = 0; rightIndex < n; rightIndex++) {
+        currentFreqA += s[rightIndex] === charA ? 1 : 0;
+        currentFreqB += s[rightIndex] === charB ? 1 : 0;
+
+        while (rightIndex - leftBoundary >= k && currentFreqB - prefixFreqB >= 2) {
+          const prefixStatus = calculateParityStatus(prefixFreqA, prefixFreqB);
+          minDifferences[prefixStatus] = Math.min(
+            minDifferences[prefixStatus],
+            prefixFreqA - prefixFreqB
+          );
+          leftBoundary++;
+          prefixFreqA += s[leftBoundary] === charA ? 1 : 0;
+          prefixFreqB += s[leftBoundary] === charB ? 1 : 0;
+        }
+
+        const currentStatus = calculateParityStatus(currentFreqA, currentFreqB);
+        const targetStatus = currentStatus ^ 0b10;
+
+        if (minDifferences[targetStatus] !== Infinity) {
+          result = Math.max(
+            result,
+            currentFreqA - currentFreqB - minDifferences[targetStatus]
+          );
+        }
+      }
+    }
+  }
+
+  return result;
+};

From b6b62b7af6bdce7a89b62f14c1f047c65e886d24 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 10 Jun 2025 22:29:20 -0500
Subject: [PATCH 518/571] Add solution #254

---
 README.md                             |  1 +
 solutions/0254-factor-combinations.js | 36 +++++++++++++++++++++++++++
 2 files changed, 37 insertions(+)
 create mode 100644 solutions/0254-factor-combinations.js

diff --git a/README.md b/README.md
index c2bca6de..7e653c64 100644
--- a/README.md
+++ b/README.md
@@ -243,6 +243,7 @@
 251|[Flatten 2D Vector](./solutions/0251-flatten-2d-vector.js)|Medium|
 252|[Meeting Rooms](./solutions/0252-meeting-rooms.js)|Easy|
 253|[Meeting Rooms II](./solutions/0253-meeting-rooms-ii.js)|Medium|
+254|[Factor Combinations](./solutions/0254-factor-combinations.js)|Medium|
 257|[Binary Tree Paths](./solutions/0257-binary-tree-paths.js)|Easy|
 258|[Add Digits](./solutions/0258-add-digits.js)|Easy|
 260|[Single Number III](./solutions/0260-single-number-iii.js)|Medium|
diff --git a/solutions/0254-factor-combinations.js b/solutions/0254-factor-combinations.js
new file mode 100644
index 00000000..ab66abba
--- /dev/null
+++ b/solutions/0254-factor-combinations.js
@@ -0,0 +1,36 @@
+/**
+ * 254. Factor Combinations
+ * https://leetcode.com/problems/factor-combinations/
+ * Difficulty: Medium
+ *
+ * Numbers can be regarded as the product of their factors.
+ *
+ * For example, 8 = 2 x 2 x 2 = 2 x 4.
+ *
+ * Given an integer n, return all possible combinations of its factors. You may return the
+ * answer in any order.
+ *
+ * Note that the factors should be in the range [2, n - 1].
+ */
+
+/**
+ * @param {number} n
+ * @return {number[][]}
+ */
+var getFactors = function(n) {
+  const result = [];
+  findFactors(n, 2, []);
+  return result;
+
+  function findFactors(currentNum, start, combination) {
+    for (let i = start; i * i <= currentNum; i++) {
+      if (currentNum % i === 0) {
+        const nextNum = currentNum / i;
+        if (nextNum >= i && nextNum < currentNum) {
+          result.push([...combination, i, nextNum]);
+          findFactors(nextNum, i, [...combination, i]);
+        }
+      }
+    }
+  }
+};

From c28a804ed5fc33607bd9910e9002a8a961538059 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 10 Jun 2025 22:30:17 -0500
Subject: [PATCH 519/571] Add solution #255

---
 README.md                                     |  1 +
 ...preorder-sequence-in-binary-search-tree.js | 27 +++++++++++++++++++
 2 files changed, 28 insertions(+)
 create mode 100644 solutions/0255-verify-preorder-sequence-in-binary-search-tree.js

diff --git a/README.md b/README.md
index 7e653c64..7c5c7d9a 100644
--- a/README.md
+++ b/README.md
@@ -244,6 +244,7 @@
 252|[Meeting Rooms](./solutions/0252-meeting-rooms.js)|Easy|
 253|[Meeting Rooms II](./solutions/0253-meeting-rooms-ii.js)|Medium|
 254|[Factor Combinations](./solutions/0254-factor-combinations.js)|Medium|
+255|[Verify Preorder Sequence in Binary Search Tree](./solutions/0255-verify-preorder-sequence-in-binary-search-tree.js)|Medium|
 257|[Binary Tree Paths](./solutions/0257-binary-tree-paths.js)|Easy|
 258|[Add Digits](./solutions/0258-add-digits.js)|Easy|
 260|[Single Number III](./solutions/0260-single-number-iii.js)|Medium|
diff --git a/solutions/0255-verify-preorder-sequence-in-binary-search-tree.js b/solutions/0255-verify-preorder-sequence-in-binary-search-tree.js
new file mode 100644
index 00000000..2e502211
--- /dev/null
+++ b/solutions/0255-verify-preorder-sequence-in-binary-search-tree.js
@@ -0,0 +1,27 @@
+/**
+ * 255. Verify Preorder Sequence in Binary Search Tree
+ * https://leetcode.com/problems/verify-preorder-sequence-in-binary-search-tree/
+ * Difficulty: Medium
+ *
+ * Given an array of unique integers preorder, return true if it is the correct preorder
+ * traversal sequence of a binary search tree.
+ */
+
+/**
+ * @param {number[]} preorder
+ * @return {boolean}
+ */
+var verifyPreorder = function(preorder) {
+  let minLimit = -Infinity;
+  const stack = [];
+
+  for (const value of preorder) {
+    while (stack.length && stack[stack.length - 1] < value) {
+      minLimit = stack.pop();
+    }
+    if (value <= minLimit) return false;
+    stack.push(value);
+  }
+
+  return true;
+};

From 8514d2214466e223b3466c413ac4cbc43d897407 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 10 Jun 2025 22:32:06 -0500
Subject: [PATCH 520/571] Add solution #256

---
 README.md                     |  1 +
 solutions/0256-paint-house.js | 34 ++++++++++++++++++++++++++++++++++
 2 files changed, 35 insertions(+)
 create mode 100644 solutions/0256-paint-house.js

diff --git a/README.md b/README.md
index 7c5c7d9a..f46e3c67 100644
--- a/README.md
+++ b/README.md
@@ -245,6 +245,7 @@
 253|[Meeting Rooms II](./solutions/0253-meeting-rooms-ii.js)|Medium|
 254|[Factor Combinations](./solutions/0254-factor-combinations.js)|Medium|
 255|[Verify Preorder Sequence in Binary Search Tree](./solutions/0255-verify-preorder-sequence-in-binary-search-tree.js)|Medium|
+256|[Paint House](./solutions/0256-paint-house.js)|Medium|
 257|[Binary Tree Paths](./solutions/0257-binary-tree-paths.js)|Easy|
 258|[Add Digits](./solutions/0258-add-digits.js)|Easy|
 260|[Single Number III](./solutions/0260-single-number-iii.js)|Medium|
diff --git a/solutions/0256-paint-house.js b/solutions/0256-paint-house.js
new file mode 100644
index 00000000..c37cc991
--- /dev/null
+++ b/solutions/0256-paint-house.js
@@ -0,0 +1,34 @@
+/**
+ * 256. Paint House
+ * https://leetcode.com/problems/paint-house/
+ * Difficulty: Medium
+ *
+ * There is a row of n houses, where each house can be painted one of three colors: red, blue,
+ * or green. The cost of painting each house with a certain color is different. You have to
+ * paint all the houses such that no two adjacent houses have the same color.
+ *
+ * The cost of painting each house with a certain color is represented by an n x 3 cost matrix
+ * costs.
+ * - For example, costs[0][0] is the cost of painting house 0 with the color red; costs[1][2]
+ *   is the cost of painting house 1 with color green, and so on...
+ *
+ * Return the minimum cost to paint all houses.
+ */
+
+/**
+ * @param {number[][]} costs
+ * @return {number}
+ */
+var minCost = function(costs) {
+  let prev = [...costs[0]];
+
+  for (let i = 1; i < costs.length; i++) {
+    prev = [
+      costs[i][0] + Math.min(prev[1], prev[2]),
+      costs[i][1] + Math.min(prev[0], prev[2]),
+      costs[i][2] + Math.min(prev[0], prev[1])
+    ];
+  }
+
+  return Math.min(...prev);
+};

From 34bce6d304df5bfc3b7fc6430f19cac95d531b46 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 10 Jun 2025 22:33:01 -0500
Subject: [PATCH 521/571] Add solution #259

---
 README.md                      |  1 +
 solutions/0259-3sum-smaller.js | 36 ++++++++++++++++++++++++++++++++++
 2 files changed, 37 insertions(+)
 create mode 100644 solutions/0259-3sum-smaller.js

diff --git a/README.md b/README.md
index f46e3c67..8868f4a2 100644
--- a/README.md
+++ b/README.md
@@ -248,6 +248,7 @@
 256|[Paint House](./solutions/0256-paint-house.js)|Medium|
 257|[Binary Tree Paths](./solutions/0257-binary-tree-paths.js)|Easy|
 258|[Add Digits](./solutions/0258-add-digits.js)|Easy|
+259|[3Sum Smaller](./solutions/0259-3sum-smaller.js)|Medium|
 260|[Single Number III](./solutions/0260-single-number-iii.js)|Medium|
 263|[Ugly Number](./solutions/0263-ugly-number.js)|Easy|
 264|[Ugly Number II](./solutions/0264-ugly-number-ii.js)|Medium|
diff --git a/solutions/0259-3sum-smaller.js b/solutions/0259-3sum-smaller.js
new file mode 100644
index 00000000..89e0d4b5
--- /dev/null
+++ b/solutions/0259-3sum-smaller.js
@@ -0,0 +1,36 @@
+/**
+ * 259. 3Sum Smaller
+ * https://leetcode.com/problems/3sum-smaller/
+ * Difficulty: Medium
+ *
+ * Given an array of n integers nums and an integer target, find the number of index triplets
+ * i, j, k with 0 <= i < j < k < n that satisfy the condition nums[i] + nums[j] + nums[k] < target.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} target
+ * @return {number}
+ */
+var threeSumSmaller = function(nums, target) {
+  nums.sort((a, b) => a - b);
+  const n = nums.length;
+  let result = 0;
+
+  for (let i = 0; i < n - 2; i++) {
+    let left = i + 1;
+    let right = n - 1;
+
+    while (left < right) {
+      const sum = nums[i] + nums[left] + nums[right];
+      if (sum < target) {
+        result += right - left;
+        left++;
+      } else {
+        right--;
+      }
+    }
+  }
+
+  return result;
+};

From 204f1e04339fb3bbeb4863d837bbb96ea764486b Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 10 Jun 2025 22:45:03 -0500
Subject: [PATCH 522/571] Add solution #261

---
 README.md                          |  1 +
 solutions/0261-graph-valid-tree.js | 45 ++++++++++++++++++++++++++++++
 2 files changed, 46 insertions(+)
 create mode 100644 solutions/0261-graph-valid-tree.js

diff --git a/README.md b/README.md
index 8868f4a2..d6211ff7 100644
--- a/README.md
+++ b/README.md
@@ -250,6 +250,7 @@
 258|[Add Digits](./solutions/0258-add-digits.js)|Easy|
 259|[3Sum Smaller](./solutions/0259-3sum-smaller.js)|Medium|
 260|[Single Number III](./solutions/0260-single-number-iii.js)|Medium|
+261|[Graph Valid Tree](./solutions/0261-graph-valid-tree.js)|Medium|
 263|[Ugly Number](./solutions/0263-ugly-number.js)|Easy|
 264|[Ugly Number II](./solutions/0264-ugly-number-ii.js)|Medium|
 268|[Missing Number](./solutions/0268-missing-number.js)|Easy|
diff --git a/solutions/0261-graph-valid-tree.js b/solutions/0261-graph-valid-tree.js
new file mode 100644
index 00000000..483b2345
--- /dev/null
+++ b/solutions/0261-graph-valid-tree.js
@@ -0,0 +1,45 @@
+/**
+ * 261. Graph Valid Tree
+ * https://leetcode.com/problems/graph-valid-tree/
+ * Difficulty: Medium
+ *
+ * You have a graph of n nodes labeled from 0 to n - 1. You are given an integer n and a list of
+ * edges where edges[i] = [ai, bi] indicates that there is an undirected edge between nodes ai
+ * and bi in the graph.
+ *
+ * Return true if the edges of the given graph make up a valid tree, and false otherwise.
+ */
+
+/**
+ * @param {number} n
+ * @param {number[][]} edges
+ * @return {boolean}
+ */
+var validTree = function(n, edges) {
+  const parent = new Array(n).fill(-1);
+
+  for (const [u, v] of edges) {
+    if (!union(u, v)) return false;
+  }
+
+  let components = 0;
+  for (let i = 0; i < n; i++) {
+    if (parent[i] === -1) components++;
+    if (components > 1) return false;
+  }
+
+  return edges.length === n - 1;
+
+  function find(x) {
+    if (parent[x] === -1) return x;
+    return parent[x] = find(parent[x]);
+  }
+
+  function union(x, y) {
+    const rootX = find(x);
+    const rootY = find(y);
+    if (rootX === rootY) return false;
+    parent[rootX] = rootY;
+    return true;
+  }
+};

From 4b4ed1c5202bcfbae1aff86ad0afb92ea7b5cef0 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 10 Jun 2025 22:46:39 -0500
Subject: [PATCH 523/571] Add solution #265

---
 README.md                        |  1 +
 solutions/0265-paint-house-ii.js | 51 ++++++++++++++++++++++++++++++++
 2 files changed, 52 insertions(+)
 create mode 100644 solutions/0265-paint-house-ii.js

diff --git a/README.md b/README.md
index d6211ff7..7d565dbd 100644
--- a/README.md
+++ b/README.md
@@ -253,6 +253,7 @@
 261|[Graph Valid Tree](./solutions/0261-graph-valid-tree.js)|Medium|
 263|[Ugly Number](./solutions/0263-ugly-number.js)|Easy|
 264|[Ugly Number II](./solutions/0264-ugly-number-ii.js)|Medium|
+265|[Paint House II](./solutions/0265-paint-house-ii.js)|Hard|
 268|[Missing Number](./solutions/0268-missing-number.js)|Easy|
 273|[Integer to English Words](./solutions/0273-integer-to-english-words.js)|Hard|
 274|[H-Index](./solutions/0274-h-index.js)|Medium|
diff --git a/solutions/0265-paint-house-ii.js b/solutions/0265-paint-house-ii.js
new file mode 100644
index 00000000..6a883f10
--- /dev/null
+++ b/solutions/0265-paint-house-ii.js
@@ -0,0 +1,51 @@
+/**
+ * 265. Paint House II
+ * https://leetcode.com/problems/paint-house-ii/
+ * Difficulty: Hard
+ *
+ * There are a row of n houses, each house can be painted with one of the k colors. The cost of
+ * painting each house with a certain color is different. You have to paint all the houses such
+ * that no two adjacent houses have the same color.
+ *
+ * The cost of painting each house with a certain color is represented by an n x k cost matrix
+ * costs.
+ * - For example, costs[0][0] is the cost of painting house 0 with color 0; costs[1][2] is the
+ *   cost of painting house 1 with color 2, and so on...
+ *
+ * Return the minimum cost to paint all houses.
+ */
+
+/**
+ * @param {number[][]} costs
+ * @return {number}
+ */
+var minCostII = function(costs) {
+  const n = costs.length;
+  const k = costs[0].length;
+  let prev = [...costs[0]];
+
+  for (let i = 1; i < n; i++) {
+    const curr = new Array(k);
+    let min1 = Infinity;
+    let min2 = Infinity;
+    let index = -1;
+
+    for (let j = 0; j < k; j++) {
+      if (prev[j] < min1) {
+        min2 = min1;
+        min1 = prev[j];
+        index = j;
+      } else if (prev[j] < min2) {
+        min2 = prev[j];
+      }
+    }
+
+    for (let j = 0; j < k; j++) {
+      curr[j] = costs[i][j] + (j === index ? min2 : min1);
+    }
+
+    prev = curr;
+  }
+
+  return Math.min(...prev);
+};

From 109acf98bfb64977061cc7cb56b64742ebe85888 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 10 Jun 2025 22:47:52 -0500
Subject: [PATCH 524/571] Add solution #266

---
 README.md                                |  1 +
 solutions/0266-palindrome-permutation.js | 28 ++++++++++++++++++++++++
 2 files changed, 29 insertions(+)
 create mode 100644 solutions/0266-palindrome-permutation.js

diff --git a/README.md b/README.md
index 7d565dbd..435bbd25 100644
--- a/README.md
+++ b/README.md
@@ -254,6 +254,7 @@
 263|[Ugly Number](./solutions/0263-ugly-number.js)|Easy|
 264|[Ugly Number II](./solutions/0264-ugly-number-ii.js)|Medium|
 265|[Paint House II](./solutions/0265-paint-house-ii.js)|Hard|
+266|[Palindrome Permutation](./solutions/0266-palindrome-permutation.js)|Easy|
 268|[Missing Number](./solutions/0268-missing-number.js)|Easy|
 273|[Integer to English Words](./solutions/0273-integer-to-english-words.js)|Hard|
 274|[H-Index](./solutions/0274-h-index.js)|Medium|
diff --git a/solutions/0266-palindrome-permutation.js b/solutions/0266-palindrome-permutation.js
new file mode 100644
index 00000000..9f710d28
--- /dev/null
+++ b/solutions/0266-palindrome-permutation.js
@@ -0,0 +1,28 @@
+/**
+ * 266. Palindrome Permutation
+ * https://leetcode.com/problems/palindrome-permutation/
+ * Difficulty: Easy
+ *
+ * Given a string s, return true if a permutation of the string could form a palindrome
+ * and false otherwise.
+ */
+
+/**
+ * @param {string} s
+ * @return {boolean}
+ */
+var canPermutePalindrome = function(s) {
+  const map = new Map();
+
+  for (const char of s) {
+    map.set(char, (map.get(char) || 0) + 1);
+  }
+
+  let oddCount = 0;
+  for (const count of map.values()) {
+    if (count % 2 !== 0) oddCount++;
+    if (oddCount > 1) return false;
+  }
+
+  return true;
+};

From 83b8a8385bf6e5589f4befeeff428310fbfe0e0a Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 10 Jun 2025 22:49:49 -0500
Subject: [PATCH 525/571] Add solution #267

---
 README.md                                   |  1 +
 solutions/0267-palindrome-permutation-ii.js | 62 +++++++++++++++++++++
 2 files changed, 63 insertions(+)
 create mode 100644 solutions/0267-palindrome-permutation-ii.js

diff --git a/README.md b/README.md
index 435bbd25..e7053d3f 100644
--- a/README.md
+++ b/README.md
@@ -255,6 +255,7 @@
 264|[Ugly Number II](./solutions/0264-ugly-number-ii.js)|Medium|
 265|[Paint House II](./solutions/0265-paint-house-ii.js)|Hard|
 266|[Palindrome Permutation](./solutions/0266-palindrome-permutation.js)|Easy|
+267|[Palindrome Permutation II](./solutions/0267-palindrome-permutation-ii.js)|Medium|
 268|[Missing Number](./solutions/0268-missing-number.js)|Easy|
 273|[Integer to English Words](./solutions/0273-integer-to-english-words.js)|Hard|
 274|[H-Index](./solutions/0274-h-index.js)|Medium|
diff --git a/solutions/0267-palindrome-permutation-ii.js b/solutions/0267-palindrome-permutation-ii.js
new file mode 100644
index 00000000..6f1127c0
--- /dev/null
+++ b/solutions/0267-palindrome-permutation-ii.js
@@ -0,0 +1,62 @@
+/**
+ * 267. Palindrome Permutation II
+ * https://leetcode.com/problems/palindrome-permutation-ii/
+ * Difficulty: Medium
+ *
+ * Given a string s, return all the palindromic permutations (without duplicates) of it.
+ *
+ * You may return the answer in any order. If s has no palindromic permutation, return an
+ * empty list.
+ */
+
+/**
+ * @param {string} s
+ * @return {string[]}
+ */
+var generatePalindromes = function(s) {
+  const map = new Map();
+  for (const char of s) {
+    map.set(char, (map.get(char) || 0) + 1);
+  }
+
+  let oddChar = '';
+  const half = [];
+  let oddCount = 0;
+
+  for (const [char, count] of map) {
+    if (count % 2) {
+      oddCount++;
+      oddChar = char;
+    }
+    for (let i = 0; i < Math.floor(count / 2); i++) {
+      half.push(char);
+    }
+  }
+
+  if (oddCount > 1) return [];
+
+  const result = new Set();
+
+  half.sort();
+  permute(half, [], new Array(half.length).fill(false));
+  return Array.from(result);
+
+  function permute(chars, current, used) {
+    if (current.length === chars.length) {
+      const palindrome = current.join('') + oddChar + current.reverse().join('');
+      result.add(palindrome);
+      current.reverse();
+      return;
+    }
+
+    for (let i = 0; i < chars.length; i++) {
+      if (!used[i] && (i === 0 || chars[i] !== chars[i - 1] || used[i - 1])) {
+        used[i] = true;
+        current.push(chars[i]);
+        permute(chars, current, used);
+        current.pop();
+        used[i] = false;
+      }
+    }
+  }
+};

From 5b3ba9844209f81e1f0e190173fbd63c656ae66d Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Tue, 10 Jun 2025 22:55:46 -0500
Subject: [PATCH 526/571] Add solution #269

---
 README.md                          |  1 +
 solutions/0269-alien-dictionary.js | 73 ++++++++++++++++++++++++++++++
 2 files changed, 74 insertions(+)
 create mode 100644 solutions/0269-alien-dictionary.js

diff --git a/README.md b/README.md
index e7053d3f..80fb4078 100644
--- a/README.md
+++ b/README.md
@@ -257,6 +257,7 @@
 266|[Palindrome Permutation](./solutions/0266-palindrome-permutation.js)|Easy|
 267|[Palindrome Permutation II](./solutions/0267-palindrome-permutation-ii.js)|Medium|
 268|[Missing Number](./solutions/0268-missing-number.js)|Easy|
+269|[Alien Dictionary](./solutions/0269-alien-dictionary.js)|Hard|
 273|[Integer to English Words](./solutions/0273-integer-to-english-words.js)|Hard|
 274|[H-Index](./solutions/0274-h-index.js)|Medium|
 275|[H-Index II](./solutions/0275-h-index-ii.js)|Medium|
diff --git a/solutions/0269-alien-dictionary.js b/solutions/0269-alien-dictionary.js
new file mode 100644
index 00000000..00e19ca3
--- /dev/null
+++ b/solutions/0269-alien-dictionary.js
@@ -0,0 +1,73 @@
+/**
+ * 269. Alien Dictionary
+ * https://leetcode.com/problems/alien-dictionary/
+ * Difficulty: Hard
+ *
+ * There is a new alien language that uses the English alphabet. However, the order of the
+ * letters is unknown to you.
+ *
+ * You are given a list of strings words from the alien language's dictionary. Now it is
+ * claimed that the strings in words are sorted lexicographically by the rules of this new
+ * language.
+ *
+ * If this claim is incorrect, and the given arrangement of string in words cannot correspond
+ * to any order of letters, return "".
+ *
+ * Otherwise, return a string of the unique letters in the new alien language sorted in
+ * lexicographically increasing order by the new language's rules. If there are multiple
+ * solutions, return any of them.
+ */
+
+/**
+ * @param {string[]} words
+ * @return {string}
+ */
+var alienOrder = function(words) {
+  const graph = new Map();
+  const inDegree = new Map();
+
+  for (const word of words) {
+    for (const char of word) {
+      if (!graph.has(char)) {
+        graph.set(char, new Set());
+        inDegree.set(char, 0);
+      }
+    }
+  }
+
+  for (let i = 1; i < words.length; i++) {
+    const prev = words[i - 1];
+    const curr = words[i];
+    const minLen = Math.min(prev.length, curr.length);
+
+    if (prev.length > curr.length && prev.startsWith(curr)) return '';
+
+    for (let j = 0; j < minLen; j++) {
+      if (prev[j] !== curr[j]) {
+        if (!graph.get(prev[j]).has(curr[j])) {
+          graph.get(prev[j]).add(curr[j]);
+          inDegree.set(curr[j], inDegree.get(curr[j]) + 1);
+        }
+        break;
+      }
+    }
+  }
+
+  const queue = [];
+  for (const [char, degree] of inDegree) {
+    if (degree === 0) queue.push(char);
+  }
+
+  let result = '';
+  while (queue.length) {
+    const char = queue.shift();
+    result += char;
+
+    for (const next of graph.get(char)) {
+      inDegree.set(next, inDegree.get(next) - 1);
+      if (inDegree.get(next) === 0) queue.push(next);
+    }
+  }
+
+  return result.length === graph.size ? result : '';
+};

From 154f2745b71e8b71270f5adab993da88316206ce Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 11 Jun 2025 22:52:58 -0500
Subject: [PATCH 527/571] Add solution #3423

---
 README.md                                     |  1 +
 ...n-adjacent-elements-in-a-circular-array.js | 25 +++++++++++++++++++
 2 files changed, 26 insertions(+)
 create mode 100644 solutions/3423-maximum-difference-between-adjacent-elements-in-a-circular-array.js

diff --git a/README.md b/README.md
index 80fb4078..874bc8d7 100644
--- a/README.md
+++ b/README.md
@@ -2234,6 +2234,7 @@
 3397|[Maximum Number of Distinct Elements After Operations](./solutions/3397-maximum-number-of-distinct-elements-after-operations.js)|Medium|
 3402|[Minimum Operations to Make Columns Strictly Increasing](./solutions/3402-minimum-operations-to-make-columns-strictly-increasing.js)|Easy|
 3403|[Find the Lexicographically Largest String From the Box I](./solutions/3403-find-the-lexicographically-largest-string-from-the-box-i.js)|Medium|
+3423|[Maximum Difference Between Adjacent Elements in a Circular Array](./solutions/3423-maximum-difference-between-adjacent-elements-in-a-circular-array.js)|Easy|
 3442|[Maximum Difference Between Even and Odd Frequency I](./solutions/3442-maximum-difference-between-even-and-odd-frequency-i.js)|Easy|
 3445|[Maximum Difference Between Even and Odd Frequency II](./solutions/3445-maximum-difference-between-even-and-odd-frequency-ii.js)|Hard|
 3452|[Sum of Good Numbers](./solutions/3452-sum-of-good-numbers.js)|Easy|
diff --git a/solutions/3423-maximum-difference-between-adjacent-elements-in-a-circular-array.js b/solutions/3423-maximum-difference-between-adjacent-elements-in-a-circular-array.js
new file mode 100644
index 00000000..dae3e36c
--- /dev/null
+++ b/solutions/3423-maximum-difference-between-adjacent-elements-in-a-circular-array.js
@@ -0,0 +1,25 @@
+/**
+ * 3423. Maximum Difference Between Adjacent Elements in a Circular Array
+ * https://leetcode.com/problems/maximum-difference-between-adjacent-elements-in-a-circular-array/
+ * Difficulty: Easy
+ *
+ * Given a circular array nums, find the maximum absolute difference between adjacent elements.
+ *
+ * Note: In a circular array, the first and last elements are adjacent.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {number}
+ */
+var maxAdjacentDistance = function(nums) {
+  let result = 0;
+
+  for (let i = 0; i < nums.length; i++) {
+    const next = (i + 1) % nums.length;
+    const diff = Math.abs(nums[i] - nums[next]);
+    result = Math.max(result, diff);
+  }
+
+  return result;
+};

From e25fe3ddd8bbc65d5fe52b0489c5fa9e4bb31392 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 11 Jun 2025 22:58:41 -0500
Subject: [PATCH 528/571] Add solution #270

---
 README.md                                     |  1 +
 .../0270-closest-binary-search-tree-value.js  | 36 +++++++++++++++++++
 2 files changed, 37 insertions(+)
 create mode 100644 solutions/0270-closest-binary-search-tree-value.js

diff --git a/README.md b/README.md
index 874bc8d7..003c38e7 100644
--- a/README.md
+++ b/README.md
@@ -258,6 +258,7 @@
 267|[Palindrome Permutation II](./solutions/0267-palindrome-permutation-ii.js)|Medium|
 268|[Missing Number](./solutions/0268-missing-number.js)|Easy|
 269|[Alien Dictionary](./solutions/0269-alien-dictionary.js)|Hard|
+270|[Closest Binary Search Tree Value](./solutions/0270-closest-binary-search-tree-value.js)|Easy|
 273|[Integer to English Words](./solutions/0273-integer-to-english-words.js)|Hard|
 274|[H-Index](./solutions/0274-h-index.js)|Medium|
 275|[H-Index II](./solutions/0275-h-index-ii.js)|Medium|
diff --git a/solutions/0270-closest-binary-search-tree-value.js b/solutions/0270-closest-binary-search-tree-value.js
new file mode 100644
index 00000000..b0e78a8e
--- /dev/null
+++ b/solutions/0270-closest-binary-search-tree-value.js
@@ -0,0 +1,36 @@
+/**
+ * 270. Closest Binary Search Tree Value
+ * https://leetcode.com/problems/closest-binary-search-tree-value/
+ * Difficulty: Easy
+ *
+ * Given the root of a binary search tree and a target value, return the value in the BST that
+ * is closest to the target. If there are multiple answers, print the smallest.
+ */
+
+/**
+ * Definition for a binary tree node.
+ * function TreeNode(val, left, right) {
+ *     this.val = (val===undefined ? 0 : val)
+ *     this.left = (left===undefined ? null : left)
+ *     this.right = (right===undefined ? null : right)
+ * }
+ */
+/**
+ * @param {TreeNode} root
+ * @param {number} target
+ * @return {number}
+ */
+var closestValue = function(root, target) {
+  let closest = root.val;
+
+  while (root) {
+    closest = Math.abs(root.val - target) < Math.abs(closest - target)
+      || (Math.abs(root.val - target) === Math.abs(closest - target) && root.val < closest)
+      ? root.val
+      : closest;
+
+    root = target < root.val ? root.left : root.right;
+  }
+
+  return closest;
+};

From b8924677cce0f5294934778e5d7d8c9d0febdcaa Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 11 Jun 2025 23:00:40 -0500
Subject: [PATCH 529/571] Add solution #271

---
 README.md                                   |  1 +
 solutions/0271-encode-and-decode-strings.js | 58 +++++++++++++++++++++
 2 files changed, 59 insertions(+)
 create mode 100644 solutions/0271-encode-and-decode-strings.js

diff --git a/README.md b/README.md
index 003c38e7..ac585788 100644
--- a/README.md
+++ b/README.md
@@ -259,6 +259,7 @@
 268|[Missing Number](./solutions/0268-missing-number.js)|Easy|
 269|[Alien Dictionary](./solutions/0269-alien-dictionary.js)|Hard|
 270|[Closest Binary Search Tree Value](./solutions/0270-closest-binary-search-tree-value.js)|Easy|
+271|[Encode and Decode Strings](./solutions/0271-encode-and-decode-strings.js)|Medium|
 273|[Integer to English Words](./solutions/0273-integer-to-english-words.js)|Hard|
 274|[H-Index](./solutions/0274-h-index.js)|Medium|
 275|[H-Index II](./solutions/0275-h-index-ii.js)|Medium|
diff --git a/solutions/0271-encode-and-decode-strings.js b/solutions/0271-encode-and-decode-strings.js
new file mode 100644
index 00000000..e32296b3
--- /dev/null
+++ b/solutions/0271-encode-and-decode-strings.js
@@ -0,0 +1,58 @@
+/**
+ * 271. Encode and Decode Strings
+ * https://leetcode.com/problems/encode-and-decode-strings/
+ * Difficulty: Medium
+ *
+ * Design an algorithm to encode a list of strings to a string. The encoded string is then sent over
+ * the network and is decoded back to the original list of strings.
+ *
+ * Machine 1 (sender) has the function:
+ * string encode(vector strs) {
+ *   // ... your code
+ *   return encoded_string;
+ * }
+ * Machine 2 (receiver) has the function:
+ * vector decode(string s) {
+ *   //... your code
+ *   return strs;
+ * }
+ * So Machine 1 does:
+ * string encoded_string = encode(strs);
+ * and Machine 2 does:
+ * vector strs2 = decode(encoded_string);
+ * strs2 in Machine 2 should be the same as strs in Machine 1.
+ *
+ * Implement the encode and decode methods.
+ *
+ * You are not allowed to solve the problem using any serialize methods (such as eval).
+ */
+
+/**
+ * Encodes a list of strings to a single string.
+ *
+ * @param {string[]} strs
+ * @return {string}
+ */
+var encode = function(strs) {
+  return strs.map(str => `${str.length}:${str}`).join('');
+};
+
+/**
+ * Decodes a single string to a list of strings.
+ *
+ * @param {string} s
+ * @return {string[]}
+ */
+var decode = function(s) {
+  const result = [];
+  let i = 0;
+
+  while (i < s.length) {
+    const colon = s.indexOf(':', i);
+    const len = parseInt(s.slice(i, colon));
+    result.push(s.slice(colon + 1, colon + 1 + len));
+    i = colon + 1 + len;
+  }
+
+  return result;
+};

From d8bc15dfc5fb7b87b63fdbeda3fc96a78da4f917 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 11 Jun 2025 23:01:52 -0500
Subject: [PATCH 530/571] Add solution #272

---
 README.md                                     |  1 +
 ...272-closest-binary-search-tree-value-ii.js | 41 +++++++++++++++++++
 2 files changed, 42 insertions(+)
 create mode 100644 solutions/0272-closest-binary-search-tree-value-ii.js

diff --git a/README.md b/README.md
index ac585788..b0e85585 100644
--- a/README.md
+++ b/README.md
@@ -260,6 +260,7 @@
 269|[Alien Dictionary](./solutions/0269-alien-dictionary.js)|Hard|
 270|[Closest Binary Search Tree Value](./solutions/0270-closest-binary-search-tree-value.js)|Easy|
 271|[Encode and Decode Strings](./solutions/0271-encode-and-decode-strings.js)|Medium|
+272|[Closest Binary Search Tree Value II](./solutions/0272-closest-binary-search-tree-value-ii.js)|Hard|
 273|[Integer to English Words](./solutions/0273-integer-to-english-words.js)|Hard|
 274|[H-Index](./solutions/0274-h-index.js)|Medium|
 275|[H-Index II](./solutions/0275-h-index-ii.js)|Medium|
diff --git a/solutions/0272-closest-binary-search-tree-value-ii.js b/solutions/0272-closest-binary-search-tree-value-ii.js
new file mode 100644
index 00000000..b3a6b27b
--- /dev/null
+++ b/solutions/0272-closest-binary-search-tree-value-ii.js
@@ -0,0 +1,41 @@
+/**
+ * 272. Closest Binary Search Tree Value II
+ * https://leetcode.com/problems/closest-binary-search-tree-value-ii/
+ * Difficulty: Hard
+ *
+ * Given the root of a binary search tree, a target value, and an integer k, return the k values
+ * in the BST that are closest to the target. You may return the answer in any order.
+ *
+ * You are guaranteed to have only one unique set of k values in the BST that are closest to the
+ * target.
+ */
+
+/**
+ * Definition for a binary tree node.
+ * function TreeNode(val, left, right) {
+ *     this.val = (val===undefined ? 0 : val)
+ *     this.left = (left===undefined ? null : left)
+ *     this.right = (right===undefined ? null : right)
+ * }
+ */
+/**
+ * @param {TreeNode} root
+ * @param {number} target
+ * @param {number} k
+ * @return {number[]}
+ */
+var closestKValues = function(root, target, k) {
+  const values = [];
+
+  inOrder(root);
+
+  values.sort((a, b) => Math.abs(a - target) - Math.abs(b - target));
+  return values.slice(0, k);
+
+  function inOrder(node) {
+    if (!node) return;
+    inOrder(node.left);
+    values.push(node.val);
+    inOrder(node.right);
+  }
+};

From 4e00bead7edd9ff2d416769a92b0978d49b6f185 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 11 Jun 2025 23:03:12 -0500
Subject: [PATCH 531/571] Add solution #276

---
 README.md                     |  1 +
 solutions/0276-paint-fence.js | 33 +++++++++++++++++++++++++++++++++
 2 files changed, 34 insertions(+)
 create mode 100644 solutions/0276-paint-fence.js

diff --git a/README.md b/README.md
index b0e85585..e390381f 100644
--- a/README.md
+++ b/README.md
@@ -264,6 +264,7 @@
 273|[Integer to English Words](./solutions/0273-integer-to-english-words.js)|Hard|
 274|[H-Index](./solutions/0274-h-index.js)|Medium|
 275|[H-Index II](./solutions/0275-h-index-ii.js)|Medium|
+276|[Paint Fence](./solutions/0276-paint-fence.js)|Medium|
 278|[First Bad Version](./solutions/0278-first-bad-version.js)|Medium|
 279|[Perfect Squares](./solutions/0279-perfect-squares.js)|Medium|
 282|[Expression Add Operators](./solutions/0282-expression-add-operators.js)|Hard|
diff --git a/solutions/0276-paint-fence.js b/solutions/0276-paint-fence.js
new file mode 100644
index 00000000..c19bb08a
--- /dev/null
+++ b/solutions/0276-paint-fence.js
@@ -0,0 +1,33 @@
+/**
+ * 276. Paint Fence
+ * https://leetcode.com/problems/paint-fence/
+ * Difficulty: Medium
+ *
+ * You are painting a fence of n posts with k different colors. You must paint the posts following
+ * these rules:
+ * - Every post must be painted exactly one color.
+ * - There cannot be three or more consecutive posts with the same color.
+ *
+ * Given the two integers n and k, return the number of ways you can paint the fence.
+ */
+
+/**
+ * @param {number} n
+ * @param {number} k
+ * @return {number}
+ */
+var numWays = function(n, k) {
+  if (n === 1) return k;
+  if (n === 2) return k * k;
+
+  let same = k;
+  let diff = k * (k - 1);
+
+  for (let i = 3; i <= n; i++) {
+    const prevSame = same;
+    same = diff;
+    diff = (prevSame + diff) * (k - 1);
+  }
+
+  return same + diff;
+};

From e72809206acbc640a9ff5d66986d3730cd71831d Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 11 Jun 2025 23:06:17 -0500
Subject: [PATCH 532/571] Add solution #277

---
 README.md                            |  1 +
 solutions/0277-find-the-celebrity.js | 53 ++++++++++++++++++++++++++++
 2 files changed, 54 insertions(+)
 create mode 100644 solutions/0277-find-the-celebrity.js

diff --git a/README.md b/README.md
index e390381f..561fcfb3 100644
--- a/README.md
+++ b/README.md
@@ -265,6 +265,7 @@
 274|[H-Index](./solutions/0274-h-index.js)|Medium|
 275|[H-Index II](./solutions/0275-h-index-ii.js)|Medium|
 276|[Paint Fence](./solutions/0276-paint-fence.js)|Medium|
+277|[Find the Celebrity](./solutions/0277-find-the-celebrity.js)|Medium|
 278|[First Bad Version](./solutions/0278-first-bad-version.js)|Medium|
 279|[Perfect Squares](./solutions/0279-perfect-squares.js)|Medium|
 282|[Expression Add Operators](./solutions/0282-expression-add-operators.js)|Hard|
diff --git a/solutions/0277-find-the-celebrity.js b/solutions/0277-find-the-celebrity.js
new file mode 100644
index 00000000..ad6f71a4
--- /dev/null
+++ b/solutions/0277-find-the-celebrity.js
@@ -0,0 +1,53 @@
+/**
+ * 277. Find the Celebrity
+ * https://leetcode.com/problems/find-the-celebrity/
+ * Difficulty: Medium
+ *
+ * Suppose you are at a party with n people labeled from 0 to n - 1 and among them, there may
+ * exist one celebrity. The definition of a celebrity is that all the other n - 1 people know
+ * the celebrity, but the celebrity does not know any of them.
+ *
+ * Now you want to find out who the celebrity is or verify that there is not one. You are only
+ * allowed to ask questions like: "Hi, A. Do you know B?" to get information about whether A
+ * knows B. You need to find out the celebrity (or verify there is not one) by asking as few
+ * questions as possible (in the asymptotic sense).
+ *
+ * You are given an integer n and a helper function bool knows(a, b) that tells you whether a
+ * knows b. Implement a function int findCelebrity(n). There will be exactly one celebrity if
+ * they are at the party.
+ *
+ * Return the celebrity's label if there is a celebrity at the party. If there is no celebrity,
+ * return -1.
+ *
+ * Note that the n x n 2D array graph given as input is not directly available to you, and
+ * instead only accessible through the helper function knows. graph[i][j] == 1 represents
+ * person i knows person j, wherease graph[i][j] == 0 represents person j does not know person i.
+ */
+
+/**
+ * @param {function} knows()
+ * @return {function}
+ */
+var solution = function(knows) {
+  /**
+   * @param {integer} n Total people
+   * @return {integer} The celebrity
+   */
+  return function(n) {
+    let candidate = 0;
+
+    for (let i = 1; i < n; i++) {
+      if (knows(candidate, i)) {
+        candidate = i;
+      }
+    }
+
+    for (let i = 0; i < n; i++) {
+      if (i !== candidate && (knows(candidate, i) || !knows(i, candidate))) {
+        return -1;
+      }
+    }
+
+    return candidate;
+  };
+};

From f7fbf71d8335a7fbc8ae8897bdb475308247482a Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 11 Jun 2025 23:07:03 -0500
Subject: [PATCH 533/571] Add solution #280

---
 README.md                     |  1 +
 solutions/0280-wiggle-sort.js | 25 +++++++++++++++++++++++++
 2 files changed, 26 insertions(+)
 create mode 100644 solutions/0280-wiggle-sort.js

diff --git a/README.md b/README.md
index 561fcfb3..4e73effc 100644
--- a/README.md
+++ b/README.md
@@ -268,6 +268,7 @@
 277|[Find the Celebrity](./solutions/0277-find-the-celebrity.js)|Medium|
 278|[First Bad Version](./solutions/0278-first-bad-version.js)|Medium|
 279|[Perfect Squares](./solutions/0279-perfect-squares.js)|Medium|
+280|[Wiggle Sort](./solutions/0280-wiggle-sort.js)|Medium|
 282|[Expression Add Operators](./solutions/0282-expression-add-operators.js)|Hard|
 283|[Move Zeroes](./solutions/0283-move-zeroes.js)|Easy|
 284|[Peeking Iterator](./solutions/0284-peeking-iterator.js)|Medium|
diff --git a/solutions/0280-wiggle-sort.js b/solutions/0280-wiggle-sort.js
new file mode 100644
index 00000000..2f2aee91
--- /dev/null
+++ b/solutions/0280-wiggle-sort.js
@@ -0,0 +1,25 @@
+/**
+ * 280. Wiggle Sort
+ * https://leetcode.com/problems/wiggle-sort/
+ * Difficulty: Medium
+ *
+ * Given an integer array nums, reorder it such that nums[0] <= nums[1] >= nums[2] <= nums[3]....
+ *
+ * You may assume the input array always has a valid answer.
+ */
+
+/**
+ * @param {number[]} nums
+ * @return {void} Do not return anything, modify nums in-place instead.
+ */
+var wiggleSort = function(nums) {
+  const n = nums.length;
+
+  for (let i = 0; i < n - 1; i++) {
+    if (i % 2 === 0 && nums[i] > nums[i + 1]) {
+      [nums[i], nums[i + 1]] = [nums[i + 1], nums[i]];
+    } else if (i % 2 === 1 && nums[i] < nums[i + 1]) {
+      [nums[i], nums[i + 1]] = [nums[i + 1], nums[i]];
+    }
+  }
+};

From a51bbdb6b2a9bb95f9a2bca25f1412a89d8bc62d Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 11 Jun 2025 23:08:41 -0500
Subject: [PATCH 534/571] Add solution #281

---
 README.md                         |  1 +
 solutions/0281-zigzag-iterator.js | 49 +++++++++++++++++++++++++++++++
 2 files changed, 50 insertions(+)
 create mode 100644 solutions/0281-zigzag-iterator.js

diff --git a/README.md b/README.md
index 4e73effc..9bc63b4b 100644
--- a/README.md
+++ b/README.md
@@ -269,6 +269,7 @@
 278|[First Bad Version](./solutions/0278-first-bad-version.js)|Medium|
 279|[Perfect Squares](./solutions/0279-perfect-squares.js)|Medium|
 280|[Wiggle Sort](./solutions/0280-wiggle-sort.js)|Medium|
+281|[Zigzag Iterator](./solutions/0281-zigzag-iterator.js)|Medium|
 282|[Expression Add Operators](./solutions/0282-expression-add-operators.js)|Hard|
 283|[Move Zeroes](./solutions/0283-move-zeroes.js)|Easy|
 284|[Peeking Iterator](./solutions/0284-peeking-iterator.js)|Medium|
diff --git a/solutions/0281-zigzag-iterator.js b/solutions/0281-zigzag-iterator.js
new file mode 100644
index 00000000..ce71c1d5
--- /dev/null
+++ b/solutions/0281-zigzag-iterator.js
@@ -0,0 +1,49 @@
+/**
+ * 281. Zigzag Iterator
+ * https://leetcode.com/problems/zigzag-iterator/
+ * Difficulty: Medium
+ *
+ * Given two vectors of integers v1 and v2, implement an iterator to return their elements
+ * alternately.
+ *
+ * Implement the ZigzagIterator class:
+ * - ZigzagIterator(List v1, List v2) initializes the object with the two vectors
+ *   v1 and v2.
+ * - boolean hasNext() returns true if the iterator still has elements, and false otherwise.
+ * - int next() returns the current element of the iterator and moves the iterator to the
+ *   next element.
+ */
+
+/**
+ * @constructor
+ * @param {Integer[]} v1
+ * @param {Integer[]} v2
+ */
+var ZigzagIterator = function ZigzagIterator(v1, v2) {
+  this.queue = [];
+  if (v1.length) this.queue.push([v1, 0]);
+  if (v2.length) this.queue.push([v2, 0]);
+};
+
+/**
+ * @this ZigzagIterator
+ * @returns {boolean}
+ */
+ZigzagIterator.prototype.hasNext = function hasNext() {
+  return this.queue.length > 0;
+};
+
+/**
+ * @this ZigzagIterator
+ * @returns {integer}
+ */
+ZigzagIterator.prototype.next = function next() {
+  const [vector, index] = this.queue.shift();
+  const value = vector[index];
+
+  if (index + 1 < vector.length) {
+    this.queue.push([vector, index + 1]);
+  }
+
+  return value;
+};

From 34ffe1866abc7b7b22e981f6dab04f5431ff9792 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 11 Jun 2025 23:09:38 -0500
Subject: [PATCH 535/571] Add solution #285

---
 README.md                                  |  1 +
 solutions/0285-inorder-successor-in-bst.js | 35 ++++++++++++++++++++++
 2 files changed, 36 insertions(+)
 create mode 100644 solutions/0285-inorder-successor-in-bst.js

diff --git a/README.md b/README.md
index 9bc63b4b..d7c0da0d 100644
--- a/README.md
+++ b/README.md
@@ -273,6 +273,7 @@
 282|[Expression Add Operators](./solutions/0282-expression-add-operators.js)|Hard|
 283|[Move Zeroes](./solutions/0283-move-zeroes.js)|Easy|
 284|[Peeking Iterator](./solutions/0284-peeking-iterator.js)|Medium|
+285|[Inorder Successor in BST](./solutions/0285-inorder-successor-in-bst.js)|Medium|
 287|[Find the Duplicate Number](./solutions/0287-find-the-duplicate-number.js)|Medium|
 289|[Game of Life](./solutions/0289-game-of-life.js)|Medium|
 290|[Word Pattern](./solutions/0290-word-pattern.js)|Easy|
diff --git a/solutions/0285-inorder-successor-in-bst.js b/solutions/0285-inorder-successor-in-bst.js
new file mode 100644
index 00000000..d589f0e4
--- /dev/null
+++ b/solutions/0285-inorder-successor-in-bst.js
@@ -0,0 +1,35 @@
+/**
+ * 285. Inorder Successor in BST
+ * https://leetcode.com/problems/inorder-successor-in-bst/
+ * Difficulty: Medium
+ *
+ * Given the root of a binary search tree and a node p in it, return the in-order successor of
+ * that node in the BST. If the given node has no in-order successor in the tree, return null.
+ *
+ * The successor of a node p is the node with the smallest key greater than p.val.
+ */
+
+/**
+ * Definition for a binary tree node.
+ * function TreeNode(val) {
+ *     this.val = val;
+ *     this.left = this.right = null;
+ * }
+ */
+/**
+ * @param {TreeNode} root
+ * @param {TreeNode} p
+ * @return {TreeNode}
+ */
+var inorderSuccessor = function(root, p) {
+  let successor = null;
+  while (root) {
+    if (p.val < root.val) {
+      successor = root;
+      root = root.left;
+    } else {
+      root = root.right;
+    }
+  }
+  return successor;
+};

From 08324bf1c2d4da410809e23b1fe680fd4bafa16b Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 11 Jun 2025 23:10:58 -0500
Subject: [PATCH 536/571] Add solution #286

---
 README.md                         |  1 +
 solutions/0286-walls-and-gates.js | 49 +++++++++++++++++++++++++++++++
 2 files changed, 50 insertions(+)
 create mode 100644 solutions/0286-walls-and-gates.js

diff --git a/README.md b/README.md
index d7c0da0d..24e55714 100644
--- a/README.md
+++ b/README.md
@@ -274,6 +274,7 @@
 283|[Move Zeroes](./solutions/0283-move-zeroes.js)|Easy|
 284|[Peeking Iterator](./solutions/0284-peeking-iterator.js)|Medium|
 285|[Inorder Successor in BST](./solutions/0285-inorder-successor-in-bst.js)|Medium|
+286|[Walls and Gates](./solutions/0286-walls-and-gates.js)|Medium|
 287|[Find the Duplicate Number](./solutions/0287-find-the-duplicate-number.js)|Medium|
 289|[Game of Life](./solutions/0289-game-of-life.js)|Medium|
 290|[Word Pattern](./solutions/0290-word-pattern.js)|Easy|
diff --git a/solutions/0286-walls-and-gates.js b/solutions/0286-walls-and-gates.js
new file mode 100644
index 00000000..13440941
--- /dev/null
+++ b/solutions/0286-walls-and-gates.js
@@ -0,0 +1,49 @@
+/**
+ * 286. Walls and Gates
+ * https://leetcode.com/problems/walls-and-gates/
+ * Difficulty: Medium
+ *
+ * You are given an m x n grid rooms initialized with these three possible values.
+ * - -1 A wall or an obstacle.
+ * - 0 A gate.
+ * - INF Infinity means an empty room. We use the value 231 - 1 = 2147483647 to represent INF
+ *   as you may assume that the distance to a gate is less than 2147483647.
+ *
+ * Fill each empty room with the distance to its nearest gate. If it is impossible to reach
+ * a gate, it should be filled with INF.
+ */
+
+/**
+ * @param {number[][]} rooms
+ * @return {void} Do not return anything, modify rooms in-place instead.
+ */
+var wallsAndGates = function(rooms) {
+  const rows = rooms.length;
+  const cols = rooms[0].length;
+  const queue = [];
+  const INF = 2147483647;
+
+  for (let i = 0; i < rows; i++) {
+    for (let j = 0; j < cols; j++) {
+      if (rooms[i][j] === 0) {
+        queue.push([i, j]);
+      }
+    }
+  }
+
+  const directions = [[0, 1], [1, 0], [0, -1], [-1, 0]];
+  while (queue.length) {
+    const [row, col] = queue.shift();
+
+    for (const [dr, dc] of directions) {
+      const newRow = row + dr;
+      const newCol = col + dc;
+
+      if (newRow >= 0 && newRow < rows && newCol >= 0 && newCol < cols
+          && rooms[newRow][newCol] === INF) {
+        rooms[newRow][newCol] = rooms[row][col] + 1;
+        queue.push([newRow, newCol]);
+      }
+    }
+  }
+};

From 74c38195d589c710c46fb796b139ff56be1d24ed Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 11 Jun 2025 23:23:56 -0500
Subject: [PATCH 537/571] Add solution #288

---
 README.md                                  |  1 +
 solutions/0288-unique-word-abbreviation.js | 57 ++++++++++++++++++++++
 2 files changed, 58 insertions(+)
 create mode 100644 solutions/0288-unique-word-abbreviation.js

diff --git a/README.md b/README.md
index 24e55714..4ae8e33d 100644
--- a/README.md
+++ b/README.md
@@ -276,6 +276,7 @@
 285|[Inorder Successor in BST](./solutions/0285-inorder-successor-in-bst.js)|Medium|
 286|[Walls and Gates](./solutions/0286-walls-and-gates.js)|Medium|
 287|[Find the Duplicate Number](./solutions/0287-find-the-duplicate-number.js)|Medium|
+288|[Unique Word Abbreviation](./solutions/0288-unique-word-abbreviation.js)|Medium|
 289|[Game of Life](./solutions/0289-game-of-life.js)|Medium|
 290|[Word Pattern](./solutions/0290-word-pattern.js)|Easy|
 292|[Nim Game](./solutions/0292-nim-game.js)|Easy|
diff --git a/solutions/0288-unique-word-abbreviation.js b/solutions/0288-unique-word-abbreviation.js
new file mode 100644
index 00000000..886f3b29
--- /dev/null
+++ b/solutions/0288-unique-word-abbreviation.js
@@ -0,0 +1,57 @@
+/**
+ * 288. Unique Word Abbreviation
+ * https://leetcode.com/problems/unique-word-abbreviation/
+ * Difficulty: Medium
+ *
+ * The abbreviation of a word is a concatenation of its first letter, the number of characters
+ * between the first and last letter, and its last letter. If a word has only two characters,
+ * then it is an abbreviation of itself.
+ *
+ * For example:
+ * - dog --> d1g because there is one letter between the first letter 'd' and the last letter 'g'.
+ * - internationalization --> i18n because there are 18 letters between the first letter 'i' and
+ *   the last letter 'n'.
+ * - it --> it because any word with only two characters is an abbreviation of itself.
+ *
+ * Implement the ValidWordAbbr class:
+ * - ValidWordAbbr(String[] dictionary) Initializes the object with a dictionary of words.
+ * - boolean isUnique(string word) Returns true if either of the following conditions are met
+ *   (otherwise returns false):
+ *   - There is no word in dictionary whose abbreviation is equal to word's abbreviation.
+ *   - For any word in dictionary whose abbreviation is equal to word's abbreviation, that word
+ *     and word are the same.
+ */
+
+/**
+ * @param {string[]} dictionary
+ */
+var ValidWordAbbr = function(dictionary) {
+  this.abbrMap = new Map();
+
+  for (const word of dictionary) {
+    const abbr = this.getAbbreviation(word);
+    if (!this.abbrMap.has(abbr)) {
+      this.abbrMap.set(abbr, new Set());
+    }
+    this.abbrMap.get(abbr).add(word);
+  }
+};
+
+/**
+ * @param {string} word
+ * @return {string}
+ */
+ValidWordAbbr.prototype.getAbbreviation = function(word) {
+  if (word.length <= 2) return word;
+  return word[0] + (word.length - 2) + word[word.length - 1];
+};
+
+/**
+ * @param {string} word
+ * @return {boolean}
+ */
+ValidWordAbbr.prototype.isUnique = function(word) {
+  const abbr = this.getAbbreviation(word);
+  const words = this.abbrMap.get(abbr);
+  return !words || (words.size === 1 && words.has(word));
+};

From da456a357706381acb70da6589f541ea30484485 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 11 Jun 2025 23:32:39 -0500
Subject: [PATCH 538/571] Add solution #291

---
 README.md                         |  1 +
 solutions/0291-word-pattern-ii.js | 51 +++++++++++++++++++++++++++++++
 2 files changed, 52 insertions(+)
 create mode 100644 solutions/0291-word-pattern-ii.js

diff --git a/README.md b/README.md
index 4ae8e33d..c2040aa6 100644
--- a/README.md
+++ b/README.md
@@ -279,6 +279,7 @@
 288|[Unique Word Abbreviation](./solutions/0288-unique-word-abbreviation.js)|Medium|
 289|[Game of Life](./solutions/0289-game-of-life.js)|Medium|
 290|[Word Pattern](./solutions/0290-word-pattern.js)|Easy|
+291|[Word Pattern II](./solutions/0291-word-pattern-ii.js)|Medium|
 292|[Nim Game](./solutions/0292-nim-game.js)|Easy|
 295|[Find Median from Data Stream](./solutions/0295-find-median-from-data-stream.js)|Hard|
 297|[Serialize and Deserialize Binary Tree](./solutions/0297-serialize-and-deserialize-binary-tree.js)|Hard|
diff --git a/solutions/0291-word-pattern-ii.js b/solutions/0291-word-pattern-ii.js
new file mode 100644
index 00000000..83e7eca5
--- /dev/null
+++ b/solutions/0291-word-pattern-ii.js
@@ -0,0 +1,51 @@
+/**
+ * 291. Word Pattern II
+ * https://leetcode.com/problems/word-pattern-ii/
+ * Difficulty: Medium
+ *
+ * Given a pattern and a string s, return true if s matches the pattern.
+ *
+ * A string s matches a pattern if there is some bijective mapping of single characters to
+ * non-empty strings such that if each character in pattern is replaced by the string it
+ * maps to, then the resulting string is s. A bijective mapping means that no two characters
+ * map to the same string, and no character maps to two different strings.
+ */
+
+/**
+ * @param {string} pattern
+ * @param {string} s
+ * @return {boolean}
+ */
+var wordPatternMatch = function(pattern, s) {
+  const charToWord = new Map();
+  const usedWords = new Set();
+
+  return backtrack(0, 0);
+
+  function backtrack(patIndex, strIndex) {
+    if (patIndex === pattern.length && strIndex === s.length) return true;
+    if (patIndex >= pattern.length || strIndex >= s.length) return false;
+
+    const char = pattern[patIndex];
+    if (charToWord.has(char)) {
+      const word = charToWord.get(char);
+      if (!s.startsWith(word, strIndex)) return false;
+      return backtrack(patIndex + 1, strIndex + word.length);
+    }
+
+    for (let i = strIndex + 1; i <= s.length; i++) {
+      const word = s.slice(strIndex, i);
+      if (usedWords.has(word)) continue;
+
+      charToWord.set(char, word);
+      usedWords.add(word);
+
+      if (backtrack(patIndex + 1, strIndex + word.length)) return true;
+
+      charToWord.delete(char);
+      usedWords.delete(word);
+    }
+
+    return false;
+  }
+};

From 218a9b7bbd0f516842e2d413bc97536e38ca359f Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 11 Jun 2025 23:33:34 -0500
Subject: [PATCH 539/571] Add solution #293

---
 README.md                   |  1 +
 solutions/0293-flip-game.js | 32 ++++++++++++++++++++++++++++++++
 2 files changed, 33 insertions(+)
 create mode 100644 solutions/0293-flip-game.js

diff --git a/README.md b/README.md
index c2040aa6..7a374230 100644
--- a/README.md
+++ b/README.md
@@ -281,6 +281,7 @@
 290|[Word Pattern](./solutions/0290-word-pattern.js)|Easy|
 291|[Word Pattern II](./solutions/0291-word-pattern-ii.js)|Medium|
 292|[Nim Game](./solutions/0292-nim-game.js)|Easy|
+293|[Flip Game](./solutions/0293-flip-game.js)|Easy|
 295|[Find Median from Data Stream](./solutions/0295-find-median-from-data-stream.js)|Hard|
 297|[Serialize and Deserialize Binary Tree](./solutions/0297-serialize-and-deserialize-binary-tree.js)|Hard|
 299|[Bulls and Cows](./solutions/0299-bulls-and-cows.js)|Medium|
diff --git a/solutions/0293-flip-game.js b/solutions/0293-flip-game.js
new file mode 100644
index 00000000..8fe0485a
--- /dev/null
+++ b/solutions/0293-flip-game.js
@@ -0,0 +1,32 @@
+/**
+ * 293. Flip Game
+ * https://leetcode.com/problems/flip-game/
+ * Difficulty: Easy
+ *
+ * You are playing a Flip Game with your friend.
+ *
+ * You are given a string currentState that contains only '+' and '-'. You and your friend take
+ * turns to flip two consecutive "++" into "--". The game ends when a person can no longer make
+ * a move, and therefore the other person will be the winner.
+ *
+ * Return all possible states of the string currentState after one valid move. You may return
+ * the answer in any order. If there is no valid move, return an empty list [].
+ */
+
+/**
+ * @param {string} currentState
+ * @return {string[]}
+ */
+var generatePossibleNextMoves = function(currentState) {
+  const results = [];
+
+  for (let i = 0; i < currentState.length - 1; i++) {
+    if (currentState[i] === '+' && currentState[i + 1] === '+') {
+      results.push(
+        currentState.slice(0, i) + '--' + currentState.slice(i + 2)
+      );
+    }
+  }
+
+  return results;
+};

From 23129b164f933a04725437fc69325b47b5bf262b Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 11 Jun 2025 23:34:41 -0500
Subject: [PATCH 540/571] Add solution #294

---
 README.md                      |  1 +
 solutions/0294-flip-game-ii.js | 40 ++++++++++++++++++++++++++++++++++
 2 files changed, 41 insertions(+)
 create mode 100644 solutions/0294-flip-game-ii.js

diff --git a/README.md b/README.md
index 7a374230..ac0c37d0 100644
--- a/README.md
+++ b/README.md
@@ -282,6 +282,7 @@
 291|[Word Pattern II](./solutions/0291-word-pattern-ii.js)|Medium|
 292|[Nim Game](./solutions/0292-nim-game.js)|Easy|
 293|[Flip Game](./solutions/0293-flip-game.js)|Easy|
+294|[Flip Game II](./solutions/0294-flip-game-ii.js)|Medium|
 295|[Find Median from Data Stream](./solutions/0295-find-median-from-data-stream.js)|Hard|
 297|[Serialize and Deserialize Binary Tree](./solutions/0297-serialize-and-deserialize-binary-tree.js)|Hard|
 299|[Bulls and Cows](./solutions/0299-bulls-and-cows.js)|Medium|
diff --git a/solutions/0294-flip-game-ii.js b/solutions/0294-flip-game-ii.js
new file mode 100644
index 00000000..d4baf073
--- /dev/null
+++ b/solutions/0294-flip-game-ii.js
@@ -0,0 +1,40 @@
+/**
+ * 294. Flip Game II
+ * https://leetcode.com/problems/flip-game-ii/
+ * Difficulty: Medium
+ *
+ * You are playing a Flip Game with your friend.
+ *
+ * You are given a string currentState that contains only '+' and '-'. You and your friend take
+ * turns to flip two consecutive "++" into "--". The game ends when a person can no longer make
+ * a move, and therefore the other person will be the winner.
+ *
+ * Return true if the starting player can guarantee a win, and false otherwise.
+ */
+
+/**
+ * @param {string} currentState
+ * @return {boolean}
+ */
+var canWin = function(currentState) {
+  const map = new Map();
+
+  return canWinFrom(currentState);
+
+  function canWinFrom(state) {
+    if (map.has(state)) return map.get(state);
+
+    for (let i = 0; i < state.length - 1; i++) {
+      if (state[i] === '+' && state[i + 1] === '+') {
+        const nextState = state.slice(0, i) + '--' + state.slice(i + 2);
+        if (!canWinFrom(nextState)) {
+          map.set(state, true);
+          return true;
+        }
+      }
+    }
+
+    map.set(state, false);
+    return false;
+  }
+};

From 275f5bb2394922408963e908704f7bee141cba6e Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Wed, 11 Jun 2025 23:36:28 -0500
Subject: [PATCH 541/571] Add solution #296

---
 README.md                            |  3 +-
 solutions/0296-best-meeting-point.js | 42 ++++++++++++++++++++++++++++
 2 files changed, 44 insertions(+), 1 deletion(-)
 create mode 100644 solutions/0296-best-meeting-point.js

diff --git a/README.md b/README.md
index ac0c37d0..ff981607 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 2,000+ LeetCode solutions in JavaScript
+# 2,250+ LeetCode solutions in JavaScript
 
 [https://leetcodejavascript.com](https://leetcodejavascript.com)
 
@@ -284,6 +284,7 @@
 293|[Flip Game](./solutions/0293-flip-game.js)|Easy|
 294|[Flip Game II](./solutions/0294-flip-game-ii.js)|Medium|
 295|[Find Median from Data Stream](./solutions/0295-find-median-from-data-stream.js)|Hard|
+296|[Best Meeting Point](./solutions/0296-best-meeting-point.js)|Hard|
 297|[Serialize and Deserialize Binary Tree](./solutions/0297-serialize-and-deserialize-binary-tree.js)|Hard|
 299|[Bulls and Cows](./solutions/0299-bulls-and-cows.js)|Medium|
 300|[Longest Increasing Subsequence](./solutions/0300-longest-increasing-subsequence.js)|Medium|
diff --git a/solutions/0296-best-meeting-point.js b/solutions/0296-best-meeting-point.js
new file mode 100644
index 00000000..d31e660b
--- /dev/null
+++ b/solutions/0296-best-meeting-point.js
@@ -0,0 +1,42 @@
+/**
+ * 296. Best Meeting Point
+ * https://leetcode.com/problems/best-meeting-point/
+ * Difficulty: Hard
+ *
+ * Given an m x n binary grid grid where each 1 marks the home of one friend, return the minimal
+ * total travel distance.
+ *
+ * The total travel distance is the sum of the distances between the houses of the friends and
+ * the meeting point.
+ *
+ * The distance is calculated using Manhattan Distance, where
+ * distance(p1, p2) = |p2.x - p1.x| + |p2.y - p1.y|.
+ */
+
+/**
+ * @param {number[][]} grid
+ * @return {number}
+ */
+var minTotalDistance = function(grid) {
+  const rows = [];
+  const cols = [];
+
+  for (let i = 0; i < grid.length; i++) {
+    for (let j = 0; j < grid[0].length; j++) {
+      if (grid[i][j] === 1) {
+        rows.push(i);
+        cols.push(j);
+      }
+    }
+  }
+
+  rows.sort((a, b) => a - b);
+  cols.sort((a, b) => a - b);
+
+  let result = 0;
+  for (let i = 0; i < rows.length; i++) {
+    result += Math.abs(rows[i] - rows[Math.floor(rows.length / 2)]);
+    result += Math.abs(cols[i] - cols[Math.floor(cols.length / 2)]);
+  }
+  return result;
+};

From dca76338e6adb3735b1099c2d6707b9bd50ed8bb Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 12 Jun 2025 23:42:37 -0500
Subject: [PATCH 542/571] Add solution #298

---
 README.md                                     |  1 +
 ...inary-tree-longest-consecutive-sequence.js | 40 +++++++++++++++++++
 2 files changed, 41 insertions(+)
 create mode 100644 solutions/0298-binary-tree-longest-consecutive-sequence.js

diff --git a/README.md b/README.md
index ff981607..9282f49f 100644
--- a/README.md
+++ b/README.md
@@ -286,6 +286,7 @@
 295|[Find Median from Data Stream](./solutions/0295-find-median-from-data-stream.js)|Hard|
 296|[Best Meeting Point](./solutions/0296-best-meeting-point.js)|Hard|
 297|[Serialize and Deserialize Binary Tree](./solutions/0297-serialize-and-deserialize-binary-tree.js)|Hard|
+298|[Binary Tree Longest Consecutive Sequence](./solutions/0298-binary-tree-longest-consecutive-sequence.js)|Medium|
 299|[Bulls and Cows](./solutions/0299-bulls-and-cows.js)|Medium|
 300|[Longest Increasing Subsequence](./solutions/0300-longest-increasing-subsequence.js)|Medium|
 301|[Remove Invalid Parentheses](./solutions/0301-remove-invalid-parentheses.js)|Hard|
diff --git a/solutions/0298-binary-tree-longest-consecutive-sequence.js b/solutions/0298-binary-tree-longest-consecutive-sequence.js
new file mode 100644
index 00000000..642f88bc
--- /dev/null
+++ b/solutions/0298-binary-tree-longest-consecutive-sequence.js
@@ -0,0 +1,40 @@
+/**
+ * 298. Binary Tree Longest Consecutive Sequence
+ * https://leetcode.com/problems/binary-tree-longest-consecutive-sequence/
+ * Difficulty: Medium
+ *
+ * Given the root of a binary tree, return the length of the longest consecutive sequence path.
+ *
+ * A consecutive sequence path is a path where the values increase by one along the path.
+ *
+ * Note that the path can start at any node in the tree, and you cannot go from a node to its
+ * parent in the path.
+ */
+
+/**
+ * Definition for a binary tree node.
+ * function TreeNode(val, left, right) {
+ *     this.val = (val===undefined ? 0 : val)
+ *     this.left = (left===undefined ? null : left)
+ *     this.right = (right===undefined ? null : right)
+ * }
+ */
+/**
+ * @param {TreeNode} root
+ * @return {number}
+ */
+var longestConsecutive = function(root) {
+  let result = 0;
+  traverse(root, root.val - 1, 0);
+  return result;
+
+  function traverse(node, parentValue, length) {
+    if (!node) return;
+
+    const currentLength = parentValue + 1 === node.val ? length + 1 : 1;
+    result = Math.max(result, currentLength);
+
+    traverse(node.left, node.val, currentLength);
+    traverse(node.right, node.val, currentLength);
+  }
+};

From 38ea889d3822b32ea28ab47a48ad30904171c269 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 12 Jun 2025 23:47:22 -0500
Subject: [PATCH 543/571] Add solution #302

---
 README.md                                     |  1 +
 ...allest-rectangle-enclosing-black-pixels.js | 63 +++++++++++++++++++
 2 files changed, 64 insertions(+)
 create mode 100644 solutions/0302-smallest-rectangle-enclosing-black-pixels.js

diff --git a/README.md b/README.md
index 9282f49f..f1031f88 100644
--- a/README.md
+++ b/README.md
@@ -290,6 +290,7 @@
 299|[Bulls and Cows](./solutions/0299-bulls-and-cows.js)|Medium|
 300|[Longest Increasing Subsequence](./solutions/0300-longest-increasing-subsequence.js)|Medium|
 301|[Remove Invalid Parentheses](./solutions/0301-remove-invalid-parentheses.js)|Hard|
+302|[Smallest Rectangle Enclosing Black Pixels](./solutions/0302-smallest-rectangle-enclosing-black-pixels.js)|Hard|
 303|[Range Sum Query - Immutable](./solutions/0303-range-sum-query-immutable.js)|Easy|
 304|[Range Sum Query 2D - Immutable](./solutions/0304-range-sum-query-2d-immutable.js)|Medium|
 306|[Additive Number](./solutions/0306-additive-number.js)|Medium|
diff --git a/solutions/0302-smallest-rectangle-enclosing-black-pixels.js b/solutions/0302-smallest-rectangle-enclosing-black-pixels.js
new file mode 100644
index 00000000..76de7a6e
--- /dev/null
+++ b/solutions/0302-smallest-rectangle-enclosing-black-pixels.js
@@ -0,0 +1,63 @@
+/**
+ * 302. Smallest Rectangle Enclosing Black Pixels
+ * https://leetcode.com/problems/smallest-rectangle-enclosing-black-pixels/
+ * Difficulty: Hard
+ *
+ * You are given an m x n binary matrix image where 0 represents a white pixel and 1 represents
+ * a black pixel.
+ *
+ * The black pixels are connected (i.e., there is only one black region). Pixels are connected
+ * horizontally and vertically.
+ *
+ * Given two integers x and y that represents the location of one of the black pixels, return
+ * the area of the smallest (axis-aligned) rectangle that encloses all black pixels.
+ *
+ * You must write an algorithm with less than O(mn) runtime complexity
+ */
+
+/**
+ * @param {character[][]} image
+ * @param {number} x
+ * @param {number} y
+ * @return {number}
+ */
+var minArea = function(image, x, y) {
+  const rows = image.length;
+  const cols = image[0].length;
+  const top = binarySearch(0, x, true, true);
+  const bottom = binarySearch(x, rows - 1, true, false);
+  const left = binarySearch(0, y, false, true);
+  const right = binarySearch(y, cols - 1, false, false);
+
+  return (bottom - top + 1) * (right - left + 1);
+
+  function binarySearch(start, end, isRow, isMin) {
+    let result = isMin ? end : start;
+    while (start <= end) {
+      const mid = Math.floor((start + end) / 2);
+      let hasBlack = false;
+      for (let i = 0; i < (isRow ? cols : rows); i++) {
+        const pixel = isRow ? image[mid][i] : image[i][mid];
+        if (pixel === '1') {
+          hasBlack = true;
+          break;
+        }
+      }
+      if (hasBlack) {
+        result = mid;
+        if (isMin) {
+          end = mid - 1;
+        } else {
+          start = mid + 1;
+        }
+      } else {
+        if (isMin) {
+          start = mid + 1;
+        } else {
+          end = mid - 1;
+        }
+      }
+    }
+    return result;
+  }
+};

From 8a8f82a5b9f32754126e4ebfb16a2d82bd26e2a0 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 12 Jun 2025 23:48:44 -0500
Subject: [PATCH 544/571] Add solution #305

---
 README.md                              |  1 +
 solutions/0305-number-of-islands-ii.js | 86 ++++++++++++++++++++++++++
 2 files changed, 87 insertions(+)
 create mode 100644 solutions/0305-number-of-islands-ii.js

diff --git a/README.md b/README.md
index f1031f88..1688d37c 100644
--- a/README.md
+++ b/README.md
@@ -293,6 +293,7 @@
 302|[Smallest Rectangle Enclosing Black Pixels](./solutions/0302-smallest-rectangle-enclosing-black-pixels.js)|Hard|
 303|[Range Sum Query - Immutable](./solutions/0303-range-sum-query-immutable.js)|Easy|
 304|[Range Sum Query 2D - Immutable](./solutions/0304-range-sum-query-2d-immutable.js)|Medium|
+305|[Number of Islands II](./solutions/0305-number-of-islands-ii.js)|Hard|
 306|[Additive Number](./solutions/0306-additive-number.js)|Medium|
 307|[Range Sum Query - Mutable](./solutions/0307-range-sum-query-mutable.js)|Medium|
 309|[Best Time to Buy and Sell Stock with Cooldown](./solutions/0309-best-time-to-buy-and-sell-stock-with-cooldown.js)|Medium|
diff --git a/solutions/0305-number-of-islands-ii.js b/solutions/0305-number-of-islands-ii.js
new file mode 100644
index 00000000..e5f5cd28
--- /dev/null
+++ b/solutions/0305-number-of-islands-ii.js
@@ -0,0 +1,86 @@
+/**
+ * 305. Number of Islands II
+ * https://leetcode.com/problems/number-of-islands-ii/
+ * Difficulty: Hard
+ *
+ * You are given an empty 2D binary grid grid of size m x n. The grid represents a map where 0's
+ * represent water and 1's represent land. Initially, all the cells of grid are water cells
+ * (i.e., all the cells are 0's).
+ *
+ * We may perform an add land operation which turns the water at position into a land. You are
+ * given an array positions where positions[i] = [ri, ci] is the position (ri, ci) at which we
+ * should operate the ith operation.
+ *
+ * Return an array of integers answer where answer[i] is the number of islands after turning
+ * the cell (ri, ci) into a land.
+ *
+ * An island is surrounded by water and is formed by connecting adjacent lands horizontally
+ * or vertically. You may assume all four edges of the grid are all surrounded by water.
+ */
+
+/**
+ * @param {number} m
+ * @param {number} n
+ * @param {number[][]} positions
+ * @return {number[]}
+ */
+var numIslands2 = function(m, n, positions) {
+  const parent = new Map();
+  const rank = new Map();
+  const result = [];
+  const directions = [[-1, 0], [1, 0], [0, -1], [0, 1]];
+  let islandCount = 0;
+
+  for (const [row, col] of positions) {
+    const current = row * n + col;
+    if (parent.has(current)) {
+      result.push(islandCount);
+      continue;
+    }
+    islandCount++;
+    parent.set(current, current);
+    rank.set(current, 0);
+
+    for (const [dr, dc] of directions) {
+      const newRow = row + dr;
+      const newCol = col + dc;
+      if (newRow >= 0 && newRow < m && newCol >= 0 && newCol < n) {
+        const neighbor = newRow * n + newCol;
+        if (parent.has(neighbor)) {
+          union(current, neighbor);
+        }
+      }
+    }
+    result.push(islandCount);
+  }
+
+  return result;
+
+  function find(node) {
+    if (!parent.has(node)) {
+      parent.set(node, node);
+      rank.set(node, 0);
+    }
+    if (parent.get(node) !== node) {
+      parent.set(node, find(parent.get(node)));
+    }
+    return parent.get(node);
+  }
+
+  function union(node1, node2) {
+    const root1 = find(node1);
+    const root2 = find(node2);
+    if (root1 === root2) return;
+    const rank1 = rank.get(root1);
+    const rank2 = rank.get(root2);
+    if (rank1 < rank2) {
+      parent.set(root1, root2);
+    } else if (rank1 > rank2) {
+      parent.set(root2, root1);
+    } else {
+      parent.set(root2, root1);
+      rank.set(root1, rank1 + 1);
+    }
+    islandCount--;
+  }
+};

From 8bbdfc7556f325548f84578185abcda7a8b928e8 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 12 Jun 2025 23:51:12 -0500
Subject: [PATCH 545/571] Add solution #308

---
 README.md                                    |  1 +
 solutions/0308-range-sum-query-2d-mutable.js | 94 ++++++++++++++++++++
 2 files changed, 95 insertions(+)
 create mode 100644 solutions/0308-range-sum-query-2d-mutable.js

diff --git a/README.md b/README.md
index 1688d37c..044c22a2 100644
--- a/README.md
+++ b/README.md
@@ -296,6 +296,7 @@
 305|[Number of Islands II](./solutions/0305-number-of-islands-ii.js)|Hard|
 306|[Additive Number](./solutions/0306-additive-number.js)|Medium|
 307|[Range Sum Query - Mutable](./solutions/0307-range-sum-query-mutable.js)|Medium|
+308|[Range Sum Query 2D - Mutable](./solutions/0308-range-sum-query-2d-mutable.js)|Medium|
 309|[Best Time to Buy and Sell Stock with Cooldown](./solutions/0309-best-time-to-buy-and-sell-stock-with-cooldown.js)|Medium|
 310|[Minimum Height Trees](./solutions/0310-minimum-height-trees.js)|Medium|
 312|[Burst Balloons](./solutions/0312-burst-balloons.js)|Hard|
diff --git a/solutions/0308-range-sum-query-2d-mutable.js b/solutions/0308-range-sum-query-2d-mutable.js
new file mode 100644
index 00000000..670caca6
--- /dev/null
+++ b/solutions/0308-range-sum-query-2d-mutable.js
@@ -0,0 +1,94 @@
+/**
+ * 308. Range Sum Query 2D - Mutable
+ * https://leetcode.com/problems/range-sum-query-2d-mutable/
+ * Difficulty: Medium
+ *
+ * Given a 2D matrix matrix, handle multiple queries of the following types:
+ * 1. Update the value of a cell in matrix.
+ * 2. Calculate the sum of the elements of matrix inside the rectangle defined by its upper left
+ *    corner (row1, col1) and lower right corner (row2, col2).
+ *
+ * Implement the NumMatrix class:
+ * - NumMatrix(int[][] matrix) Initializes the object with the integer matrix matrix.
+ * - void update(int row, int col, int val) Updates the value of matrix[row][col] to be val.
+ * - int sumRegion(int row1, int col1, int row2, int col2) Returns the sum of the elements of
+ *   matrix inside the rectangle defined by its upper left corner (row1, col1) and lower right
+ *   corner (row2, col2).
+ */
+
+/**
+ * @param {number[][]} matrix
+ */
+var NumMatrix = function(matrix) {
+  this.rows = matrix.length;
+  this.cols = matrix[0].length;
+  this.matrix = matrix;
+  this.tree = new Array(this.rows + 1).fill().map(() => new Array(this.cols + 1).fill(0));
+
+  for (let i = 0; i < this.rows; i++) {
+    for (let j = 0; j < this.cols; j++) {
+      this.updateTree(i + 1, j + 1, matrix[i][j]);
+    }
+  }
+};
+
+/**
+ * @param {number} row
+ * @param {number} col
+ * @param {number} val
+ * @return {void}
+ */
+NumMatrix.prototype.updateTree = function(row, col, val) {
+  while (row <= this.rows) {
+    let c = col;
+    while (c <= this.cols) {
+      this.tree[row][c] += val;
+      c += c & (-c);
+    }
+    row += row & (-row);
+  }
+};
+
+/**
+ * @param {number} row
+ * @param {number} col
+ * @return {number}
+ */
+NumMatrix.prototype.getSum = function(row, col) {
+  let sum = 0;
+  while (row > 0) {
+    let c = col;
+    while (c > 0) {
+      sum += this.tree[row][c];
+      c -= c & (-c);
+    }
+    row -= row & (-row);
+  }
+  return sum;
+};
+
+/**
+ * @param {number} row
+ * @param {number} col
+ * @param {number} val
+ * @return {void}
+ */
+NumMatrix.prototype.update = function(row, col, val) {
+  const diff = val - this.matrix[row][col];
+  this.matrix[row][col] = val;
+  this.updateTree(row + 1, col + 1, diff);
+};
+
+/**
+ * @param {number} row1
+ * @param {number} col1
+ * @param {number} row2
+ * @param {number} col2
+ * @return {number}
+ */
+NumMatrix.prototype.sumRegion = function(row1, col1, row2, col2) {
+  return this.getSum(row2 + 1, col2 + 1)
+    - this.getSum(row2 + 1, col1)
+    - this.getSum(row1, col2 + 1)
+    + this.getSum(row1, col1);
+};

From 18afb13a514f88e6c3ea0b7258eab6323cb83d70 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Thu, 12 Jun 2025 23:52:00 -0500
Subject: [PATCH 546/571] Add solution #311

---
 README.md                                     |  1 +
 .../0311-sparse-matrix-multiplication.js      | 34 +++++++++++++++++++
 2 files changed, 35 insertions(+)
 create mode 100644 solutions/0311-sparse-matrix-multiplication.js

diff --git a/README.md b/README.md
index 044c22a2..6ee4efae 100644
--- a/README.md
+++ b/README.md
@@ -299,6 +299,7 @@
 308|[Range Sum Query 2D - Mutable](./solutions/0308-range-sum-query-2d-mutable.js)|Medium|
 309|[Best Time to Buy and Sell Stock with Cooldown](./solutions/0309-best-time-to-buy-and-sell-stock-with-cooldown.js)|Medium|
 310|[Minimum Height Trees](./solutions/0310-minimum-height-trees.js)|Medium|
+311|[Sparse Matrix Multiplication](./solutions/0311-sparse-matrix-multiplication.js)|Medium|
 312|[Burst Balloons](./solutions/0312-burst-balloons.js)|Hard|
 313|[Super Ugly Number](./solutions/0313-super-ugly-number.js)|Medium|
 315|[Count of Smaller Numbers After Self](./solutions/0315-count-of-smaller-numbers-after-self.js)|Hard|
diff --git a/solutions/0311-sparse-matrix-multiplication.js b/solutions/0311-sparse-matrix-multiplication.js
new file mode 100644
index 00000000..7a69dca2
--- /dev/null
+++ b/solutions/0311-sparse-matrix-multiplication.js
@@ -0,0 +1,34 @@
+/**
+ * 311. Sparse Matrix Multiplication
+ * https://leetcode.com/problems/sparse-matrix-multiplication/
+ * Difficulty: Medium
+ *
+ * Given two sparse matrices mat1 of size m x k and mat2 of size k x n, return the result of
+ * mat1 x mat2. You may assume that multiplication is always possible.
+ */
+
+/**
+ * @param {number[][]} mat1
+ * @param {number[][]} mat2
+ * @return {number[][]}
+ */
+var multiply = function(mat1, mat2) {
+  const m = mat1.length;
+  const k = mat1[0].length;
+  const n = mat2[0].length;
+  const result = new Array(m).fill().map(() => new Array(n).fill(0));
+
+  for (let i = 0; i < m; i++) {
+    for (let j = 0; j < k; j++) {
+      if (mat1[i][j] !== 0) {
+        for (let l = 0; l < n; l++) {
+          if (mat2[j][l] !== 0) {
+            result[i][l] += mat1[i][j] * mat2[j][l];
+          }
+        }
+      }
+    }
+  }
+
+  return result;
+};

From 48830a592228646f8a9852a32ac54d07a9bf6fe2 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 13 Jun 2025 18:40:57 -0500
Subject: [PATCH 547/571] Add solution #314

---
 README.md                                     |  1 +
 ...14-binary-tree-vertical-order-traversal.js | 53 +++++++++++++++++++
 2 files changed, 54 insertions(+)
 create mode 100644 solutions/0314-binary-tree-vertical-order-traversal.js

diff --git a/README.md b/README.md
index 6ee4efae..122c5057 100644
--- a/README.md
+++ b/README.md
@@ -302,6 +302,7 @@
 311|[Sparse Matrix Multiplication](./solutions/0311-sparse-matrix-multiplication.js)|Medium|
 312|[Burst Balloons](./solutions/0312-burst-balloons.js)|Hard|
 313|[Super Ugly Number](./solutions/0313-super-ugly-number.js)|Medium|
+314|[Binary Tree Vertical Order Traversal](./solutions/0314-binary-tree-vertical-order-traversal.js)|Medium|
 315|[Count of Smaller Numbers After Self](./solutions/0315-count-of-smaller-numbers-after-self.js)|Hard|
 316|[Remove Duplicate Letters](./solutions/0316-remove-duplicate-letters.js)|Medium|
 318|[Maximum Product of Word Lengths](./solutions/0318-maximum-product-of-word-lengths.js)|Medium|
diff --git a/solutions/0314-binary-tree-vertical-order-traversal.js b/solutions/0314-binary-tree-vertical-order-traversal.js
new file mode 100644
index 00000000..e93b1b43
--- /dev/null
+++ b/solutions/0314-binary-tree-vertical-order-traversal.js
@@ -0,0 +1,53 @@
+/**
+ * 314. Binary Tree Vertical Order Traversal
+ * https://leetcode.com/problems/binary-tree-vertical-order-traversal/
+ * Difficulty: Medium
+ *
+ * Given the root of a binary tree, return the vertical order traversal of its nodes' values.
+ * (i.e., from top to bottom, column by column).
+ *
+ * If two nodes are in the same row and column, the order should be from left to right.
+ */
+
+/**
+ * Definition for a binary tree node.
+ * function TreeNode(val, left, right) {
+ *     this.val = (val===undefined ? 0 : val)
+ *     this.left = (left===undefined ? null : left)
+ *     this.right = (right===undefined ? null : right)
+ * }
+ */
+/**
+ * @param {TreeNode} root
+ * @return {number[][]}
+ */
+var verticalOrder = function(root) {
+  if (!root) return [];
+
+  const columns = new Map();
+  const queue = [[root, 0]];
+  let minCol = 0;
+  let maxCol = 0;
+
+  while (queue.length) {
+    const [node, col] = queue.shift();
+    if (!columns.has(col)) columns.set(col, []);
+    columns.get(col).push(node.val);
+
+    if (node.left) {
+      queue.push([node.left, col - 1]);
+      minCol = Math.min(minCol, col - 1);
+    }
+    if (node.right) {
+      queue.push([node.right, col + 1]);
+      maxCol = Math.max(maxCol, col + 1);
+    }
+  }
+
+  const result = [];
+  for (let col = minCol; col <= maxCol; col++) {
+    if (columns.has(col)) result.push(columns.get(col));
+  }
+
+  return result;
+};

From b91a6752082f2b2a164e5b146d6b11d66f286d6e Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 13 Jun 2025 18:42:57 -0500
Subject: [PATCH 548/571] Add solution #317

---
 README.md                                     |  1 +
 ...17-shortest-distance-from-all-buildings.js | 80 +++++++++++++++++++
 2 files changed, 81 insertions(+)
 create mode 100644 solutions/0317-shortest-distance-from-all-buildings.js

diff --git a/README.md b/README.md
index 122c5057..9988dcab 100644
--- a/README.md
+++ b/README.md
@@ -305,6 +305,7 @@
 314|[Binary Tree Vertical Order Traversal](./solutions/0314-binary-tree-vertical-order-traversal.js)|Medium|
 315|[Count of Smaller Numbers After Self](./solutions/0315-count-of-smaller-numbers-after-self.js)|Hard|
 316|[Remove Duplicate Letters](./solutions/0316-remove-duplicate-letters.js)|Medium|
+317|[Shortest Distance from All Buildings](./solutions/0317-shortest-distance-from-all-buildings.js)|Hard|
 318|[Maximum Product of Word Lengths](./solutions/0318-maximum-product-of-word-lengths.js)|Medium|
 319|[Bulb Switcher](./solutions/0319-bulb-switcher.js)|Medium|
 321|[Create Maximum Number](./solutions/0321-create-maximum-number.js)|Hard|
diff --git a/solutions/0317-shortest-distance-from-all-buildings.js b/solutions/0317-shortest-distance-from-all-buildings.js
new file mode 100644
index 00000000..f699b1b0
--- /dev/null
+++ b/solutions/0317-shortest-distance-from-all-buildings.js
@@ -0,0 +1,80 @@
+/**
+ * 317. Shortest Distance from All Buildings
+ * https://leetcode.com/problems/shortest-distance-from-all-buildings/
+ * Difficulty: Hard
+ *
+ * You are given an m x n grid grid of values 0, 1, or 2, where:
+ * - each 0 marks an empty land that you can pass by freely,
+ * - each 1 marks a building that you cannot pass through, and
+ * - each 2 marks an obstacle that you cannot pass through.
+ *
+ * You want to build a house on an empty land that reaches all buildings in the shortest total
+ * travel distance. You can only move up, down, left, and right.
+ *
+ * Return the shortest travel distance for such a house. If it is not possible to build such
+ * a house according to the above rules, return -1.
+ *
+ * The total travel distance is the sum of the distances between the houses of the friends and
+ * the meeting point.
+ */
+
+/**
+ * @param {number[][]} grid
+ * @return {number}
+ */
+var shortestDistance = function(grid) {
+  const rows = grid.length;
+  const cols = grid[0].length;
+  const distances = new Array(rows).fill().map(() => new Array(cols).fill(0));
+  const reachCounts = new Array(rows).fill().map(() => new Array(cols).fill(0));
+  let buildingCount = 0;
+
+  function bfs(startRow, startCol) {
+    const queue = [[startRow, startCol]];
+    const visited = new Array(rows).fill().map(() => new Array(cols).fill(false));
+    visited[startRow][startCol] = true;
+    let distance = 0;
+
+    const directions = [[-1, 0], [1, 0], [0, -1], [0, 1]];
+
+    while (queue.length) {
+      const size = queue.length;
+      distance++;
+      for (let i = 0; i < size; i++) {
+        const [row, col] = queue.shift();
+        for (const [dr, dc] of directions) {
+          const newRow = row + dr;
+          const newCol = col + dc;
+          if (newRow >= 0 && newRow < rows && newCol >= 0 && newCol < cols
+              && !visited[newRow][newCol] && grid[newRow][newCol] !== 1
+              && grid[newRow][newCol] !== 2) {
+            queue.push([newRow, newCol]);
+            visited[newRow][newCol] = true;
+            distances[newRow][newCol] += distance;
+            reachCounts[newRow][newCol]++;
+          }
+        }
+      }
+    }
+  }
+
+  for (let i = 0; i < rows; i++) {
+    for (let j = 0; j < cols; j++) {
+      if (grid[i][j] === 1) {
+        buildingCount++;
+        bfs(i, j);
+      }
+    }
+  }
+
+  let minDistance = Infinity;
+  for (let i = 0; i < rows; i++) {
+    for (let j = 0; j < cols; j++) {
+      if (grid[i][j] === 0 && reachCounts[i][j] === buildingCount) {
+        minDistance = Math.min(minDistance, distances[i][j]);
+      }
+    }
+  }
+
+  return minDistance === Infinity ? -1 : minDistance;
+};

From a8e403a5a8b4d3b2059dac093126ffa384d9af83 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 13 Jun 2025 18:45:57 -0500
Subject: [PATCH 549/571] Add solution #320

---
 README.md                                  |  1 +
 solutions/0320-generalized-abbreviation.js | 41 ++++++++++++++++++++++
 2 files changed, 42 insertions(+)
 create mode 100644 solutions/0320-generalized-abbreviation.js

diff --git a/README.md b/README.md
index 9988dcab..8bac5eab 100644
--- a/README.md
+++ b/README.md
@@ -308,6 +308,7 @@
 317|[Shortest Distance from All Buildings](./solutions/0317-shortest-distance-from-all-buildings.js)|Hard|
 318|[Maximum Product of Word Lengths](./solutions/0318-maximum-product-of-word-lengths.js)|Medium|
 319|[Bulb Switcher](./solutions/0319-bulb-switcher.js)|Medium|
+320|[Generalized Abbreviation](./solutions/0320-generalized-abbreviation.js)|Medium|
 321|[Create Maximum Number](./solutions/0321-create-maximum-number.js)|Hard|
 322|[Coin Change](./solutions/0322-coin-change.js)|Medium|
 324|[Wiggle Sort II](./solutions/0324-wiggle-sort-ii.js)|Medium|
diff --git a/solutions/0320-generalized-abbreviation.js b/solutions/0320-generalized-abbreviation.js
new file mode 100644
index 00000000..96ab102d
--- /dev/null
+++ b/solutions/0320-generalized-abbreviation.js
@@ -0,0 +1,41 @@
+/**
+ * 320. Generalized Abbreviation
+ * https://leetcode.com/problems/generalized-abbreviation/
+ * Difficulty: Medium
+ *
+ * A word's generalized abbreviation can be constructed by taking any number of non-overlapping
+ * and non-adjacent substrings and replacing them with their respective lengths.
+ * - For example, "abcde" can be abbreviated into:
+ *   - "a3e" ("bcd" turned into "3")
+ *   - "1bcd1" ("a" and "e" both turned into "1")
+ *   - "5" ("abcde" turned into "5")
+ *   - "abcde" (no substrings replaced)
+ * - However, these abbreviations are invalid:
+ *   - "23" ("ab" turned into "2" and "cde" turned into "3") is invalid as the substrings
+ *     chosen are adjacent.
+ *   - "22de" ("ab" turned into "2" and "bc" turned into "2") is invalid as the substring
+ *     chosen overlap.
+ *
+ * Given a string word, return a list of all the possible generalized abbreviations of word.
+ * Return the answer in any order.
+ */
+
+/**
+ * @param {string} word
+ * @return {string[]}
+ */
+var generateAbbreviations = function(word) {
+  const result = [];
+  backtrack('', 0, 0);
+  return result;
+
+  function backtrack(current, pos, count) {
+    if (pos === word.length) {
+      result.push(current + (count > 0 ? count : ''));
+      return;
+    }
+
+    backtrack(current + (count > 0 ? count : '') + word[pos], pos + 1, 0);
+    backtrack(current, pos + 1, count + 1);
+  }
+};

From d6b704bf17deb31cf1bccf0526c179613b690791 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 13 Jun 2025 18:47:30 -0500
Subject: [PATCH 550/571] Add solution #323

---
 README.md                                     |  1 +
 ...ected-components-in-an-undirected-graph.js | 42 +++++++++++++++++++
 2 files changed, 43 insertions(+)
 create mode 100644 solutions/0323-number-of-connected-components-in-an-undirected-graph.js

diff --git a/README.md b/README.md
index 8bac5eab..a4e48639 100644
--- a/README.md
+++ b/README.md
@@ -311,6 +311,7 @@
 320|[Generalized Abbreviation](./solutions/0320-generalized-abbreviation.js)|Medium|
 321|[Create Maximum Number](./solutions/0321-create-maximum-number.js)|Hard|
 322|[Coin Change](./solutions/0322-coin-change.js)|Medium|
+323|[Number of Connected Components in an Undirected Graph](./solutions/0323-number-of-connected-components-in-an-undirected-graph.js)|Medium|
 324|[Wiggle Sort II](./solutions/0324-wiggle-sort-ii.js)|Medium|
 326|[Power of Three](./solutions/0326-power-of-three.js)|Easy|
 327|[Count of Range Sum](./solutions/0327-count-of-range-sum.js)|Hard|
diff --git a/solutions/0323-number-of-connected-components-in-an-undirected-graph.js b/solutions/0323-number-of-connected-components-in-an-undirected-graph.js
new file mode 100644
index 00000000..ba679b5f
--- /dev/null
+++ b/solutions/0323-number-of-connected-components-in-an-undirected-graph.js
@@ -0,0 +1,42 @@
+/**
+ * 323. Number of Connected Components in an Undirected Graph
+ * https://leetcode.com/problems/number-of-connected-components-in-an-undirected-graph/
+ * Difficulty: Medium
+ *
+ * You have a graph of n nodes. You are given an integer n and an array edges where
+ * edges[i] = [ai, bi] indicates that there is an edge between ai and bi in the graph.
+ *
+ * Return the number of connected components in the graph.
+ */
+
+/**
+ * @param {number} n
+ * @param {number[][]} edges
+ * @return {number}
+ */
+var countComponents = function(n, edges) {
+  const parent = new Array(n).fill().map((_, i) => i);
+  let components = n;
+
+  for (const [node1, node2] of edges) {
+    union(node1, node2);
+  }
+
+  return components;
+
+  function find(node) {
+    if (parent[node] !== node) {
+      parent[node] = find(parent[node]);
+    }
+    return parent[node];
+  }
+
+  function union(node1, node2) {
+    const root1 = find(node1);
+    const root2 = find(node2);
+    if (root1 !== root2) {
+      parent[root1] = root2;
+      components--;
+    }
+  }
+};

From 0df80fb7095279dad768d4bf5f98c035ba6fda39 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Fri, 13 Jun 2025 18:48:51 -0500
Subject: [PATCH 551/571] Add solution #325

---
 README.md                                     |  1 +
 ...0325-maximum-size-subarray-sum-equals-k.js | 31 +++++++++++++++++++
 2 files changed, 32 insertions(+)
 create mode 100644 solutions/0325-maximum-size-subarray-sum-equals-k.js

diff --git a/README.md b/README.md
index a4e48639..545e4daa 100644
--- a/README.md
+++ b/README.md
@@ -313,6 +313,7 @@
 322|[Coin Change](./solutions/0322-coin-change.js)|Medium|
 323|[Number of Connected Components in an Undirected Graph](./solutions/0323-number-of-connected-components-in-an-undirected-graph.js)|Medium|
 324|[Wiggle Sort II](./solutions/0324-wiggle-sort-ii.js)|Medium|
+325|[Maximum Size Subarray Sum Equals k](./solutions/0325-maximum-size-subarray-sum-equals-k.js)|Medium|
 326|[Power of Three](./solutions/0326-power-of-three.js)|Easy|
 327|[Count of Range Sum](./solutions/0327-count-of-range-sum.js)|Hard|
 328|[Odd Even Linked List](./solutions/0328-odd-even-linked-list.js)|Medium|
diff --git a/solutions/0325-maximum-size-subarray-sum-equals-k.js b/solutions/0325-maximum-size-subarray-sum-equals-k.js
new file mode 100644
index 00000000..697c3a73
--- /dev/null
+++ b/solutions/0325-maximum-size-subarray-sum-equals-k.js
@@ -0,0 +1,31 @@
+/**
+ * 325. Maximum Size Subarray Sum Equals k
+ * https://leetcode.com/problems/maximum-size-subarray-sum-equals-k/
+ * Difficulty: Medium
+ *
+ * Given an integer array nums and an integer k, return the maximum length of a subarray that
+ * sums to k. If there is not one, return 0 instead.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} k
+ * @return {number}
+ */
+var maxSubArrayLen = function(nums, k) {
+  const sumIndex = new Map([[0, -1]]);
+  let currentSum = 0;
+  let result = 0;
+
+  for (let i = 0; i < nums.length; i++) {
+    currentSum += nums[i];
+    if (sumIndex.has(currentSum - k)) {
+      result = Math.max(result, i - sumIndex.get(currentSum - k));
+    }
+    if (!sumIndex.has(currentSum)) {
+      sumIndex.set(currentSum, i);
+    }
+  }
+
+  return result;
+};

From fe9820f08f14431b4a8b28cb8d7eefb80bef2ec8 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 14 Jun 2025 00:08:45 -0500
Subject: [PATCH 552/571] Add solution #333

---
 README.md                             |  1 +
 solutions/0333-largest-bst-subtree.js | 52 +++++++++++++++++++++++++++
 2 files changed, 53 insertions(+)
 create mode 100644 solutions/0333-largest-bst-subtree.js

diff --git a/README.md b/README.md
index 545e4daa..26b957c4 100644
--- a/README.md
+++ b/README.md
@@ -321,6 +321,7 @@
 330|[Patching Array](./solutions/0330-patching-array.js)|Hard|
 331|[Verify Preorder Serialization of a Binary Tree](./solutions/0331-verify-preorder-serialization-of-a-binary-tree.js)|Medium|
 332|[Reconstruct Itinerary](./solutions/0332-reconstruct-itinerary.js)|Hard|
+333|[Largest BST Subtree](./solutions/0333-largest-bst-subtree.js)|Medium|
 334|[Increasing Triplet Subsequence](./solutions/0334-increasing-triplet-subsequence.js)|Medium|
 335|[Self Crossing](./solutions/0335-self-crossing.js)|Hard|
 336|[Palindrome Pairs](./solutions/0336-palindrome-pairs.js)|Hard|
diff --git a/solutions/0333-largest-bst-subtree.js b/solutions/0333-largest-bst-subtree.js
new file mode 100644
index 00000000..30c83e84
--- /dev/null
+++ b/solutions/0333-largest-bst-subtree.js
@@ -0,0 +1,52 @@
+/**
+ * 333. Largest BST Subtree
+ * https://leetcode.com/problems/largest-bst-subtree/
+ * Difficulty: Medium
+ *
+ * Given the root of a binary tree, find the largest subtree, which is also a Binary Search
+ * Tree (BST), where the largest means subtree has the largest number of nodes.
+ *
+ * A Binary Search Tree (BST) is a tree in which all the nodes follow the below-mentioned
+ * properties:
+ * - The left subtree values are less than the value of their parent (root) node's value.
+ * - The right subtree values are greater than the value of their parent (root) node's value.
+ *
+ * Note: A subtree must include all of its descendants.
+ */
+
+/**
+ * Definition for a binary tree node.
+ * function TreeNode(val, left, right) {
+ *     this.val = (val===undefined ? 0 : val)
+ *     this.left = (left===undefined ? null : left)
+ *     this.right = (right===undefined ? null : right)
+ * }
+ */
+/**
+ * @param {TreeNode} root
+ * @return {number}
+ */
+var largestBSTSubtree = function(root) {
+  let maxSize = 0;
+  traverse(root);
+  return maxSize;
+
+  function traverse(node) {
+    if (!node) return { isBST: true, size: 0, min: Infinity, max: -Infinity };
+
+    const left = traverse(node.left);
+    const right = traverse(node.right);
+    if (left.isBST && right.isBST && node.val > left.max && node.val < right.min) {
+      const size = left.size + right.size + 1;
+      maxSize = Math.max(maxSize, size);
+      return {
+        isBST: true,
+        size,
+        min: Math.min(left.min, node.val),
+        max: Math.max(right.max, node.val)
+      };
+    }
+
+    return { isBST: false, size: 0, min: 0, max: 0 };
+  }
+};

From 85bb78c8c418704c5198cdb76733909c88c1c6d1 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 14 Jun 2025 00:09:52 -0500
Subject: [PATCH 553/571] Add solution #339

---
 README.md                                |  1 +
 solutions/0339-nested-list-weight-sum.js | 33 ++++++++++++++++++++++++
 2 files changed, 34 insertions(+)
 create mode 100644 solutions/0339-nested-list-weight-sum.js

diff --git a/README.md b/README.md
index 26b957c4..7b61e291 100644
--- a/README.md
+++ b/README.md
@@ -327,6 +327,7 @@
 336|[Palindrome Pairs](./solutions/0336-palindrome-pairs.js)|Hard|
 337|[House Robber III](./solutions/0337-house-robber-iii.js)|Medium|
 338|[Counting Bits](./solutions/0338-counting-bits.js)|Easy|
+339|[Nested List Weight Sum](./solutions/0339-nested-list-weight-sum.js)|Medium|
 341|[Flatten Nested List Iterator](./solutions/0341-flatten-nested-list-iterator.js)|Medium|
 342|[Power of Four](./solutions/0342-power-of-four.js)|Easy|
 343|[Integer Break](./solutions/0343-integer-break.js)|Medium|
diff --git a/solutions/0339-nested-list-weight-sum.js b/solutions/0339-nested-list-weight-sum.js
new file mode 100644
index 00000000..2ca1b16b
--- /dev/null
+++ b/solutions/0339-nested-list-weight-sum.js
@@ -0,0 +1,33 @@
+/**
+ * 339. Nested List Weight Sum
+ * https://leetcode.com/problems/nested-list-weight-sum/
+ * Difficulty: Medium
+ *
+ * You are given a nested list of integers nestedList. Each element is either an integer or
+ * a list whose elements may also be integers or other lists.
+ *
+ * The depth of an integer is the number of lists that it is inside of. For example, the nested
+ * list [1,[2,2],[[3],2],1] has each integer's value set to its depth.
+ *
+ * Return the sum of each integer in nestedList multiplied by its depth.
+ */
+
+/**
+ * @param {NestedInteger[]} nestedList
+ * @return {number}
+ */
+var depthSum = function(nestedList) {
+  return calculateDepth(nestedList, 1);
+
+  function calculateDepth(list, depth) {
+    let total = 0;
+    for (const element of list) {
+      if (element.isInteger()) {
+        total += element.getInteger() * depth;
+      } else {
+        total += calculateDepth(element.getList(), depth + 1);
+      }
+    }
+    return total;
+  }
+};

From d1a09b628608d56c624d7839a0b72cc636dc8a24 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 14 Jun 2025 00:10:52 -0500
Subject: [PATCH 554/571] Add solution #340

---
 README.md                                     |  1 +
 ...ring-with-at-most-k-distinct-characters.js | 35 +++++++++++++++++++
 2 files changed, 36 insertions(+)
 create mode 100644 solutions/0340-longest-substring-with-at-most-k-distinct-characters.js

diff --git a/README.md b/README.md
index 7b61e291..56d19aa3 100644
--- a/README.md
+++ b/README.md
@@ -328,6 +328,7 @@
 337|[House Robber III](./solutions/0337-house-robber-iii.js)|Medium|
 338|[Counting Bits](./solutions/0338-counting-bits.js)|Easy|
 339|[Nested List Weight Sum](./solutions/0339-nested-list-weight-sum.js)|Medium|
+340|[Longest Substring with At Most K Distinct Characters](./solutions/0340-longest-substring-with-at-most-k-distinct-characters.js)|Medium|
 341|[Flatten Nested List Iterator](./solutions/0341-flatten-nested-list-iterator.js)|Medium|
 342|[Power of Four](./solutions/0342-power-of-four.js)|Easy|
 343|[Integer Break](./solutions/0343-integer-break.js)|Medium|
diff --git a/solutions/0340-longest-substring-with-at-most-k-distinct-characters.js b/solutions/0340-longest-substring-with-at-most-k-distinct-characters.js
new file mode 100644
index 00000000..dfd6a5c3
--- /dev/null
+++ b/solutions/0340-longest-substring-with-at-most-k-distinct-characters.js
@@ -0,0 +1,35 @@
+/**
+ * 340. Longest Substring with At Most K Distinct Characters
+ * https://leetcode.com/problems/longest-substring-with-at-most-k-distinct-characters/
+ * Difficulty: Medium
+ *
+ * Given a string s and an integer k, return the length of the longest substring of s that
+ * contains at most k distinct characters.
+ */
+
+/**
+ * @param {string} s
+ * @param {number} k
+ * @return {number}
+ */
+var lengthOfLongestSubstringKDistinct = function(s, k) {
+  const map = new Map();
+  let result = 0;
+  let left = 0;
+
+  for (let right = 0; right < s.length; right++) {
+    map.set(s[right], (map.get(s[right]) || 0) + 1);
+
+    while (map.size > k) {
+      map.set(s[left], map.get(s[left]) - 1);
+      if (map.get(s[left]) === 0) {
+        map.delete(s[left]);
+      }
+      left++;
+    }
+
+    result = Math.max(result, right - left + 1);
+  }
+
+  return result;
+};

From 754988a2540a52fd0b0b359f117789ad6268ac3b Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 14 Jun 2025 00:11:55 -0500
Subject: [PATCH 555/571] Add solution #346

---
 README.md                                     |  1 +
 .../0346-moving-average-from-data-stream.js   | 36 +++++++++++++++++++
 2 files changed, 37 insertions(+)
 create mode 100644 solutions/0346-moving-average-from-data-stream.js

diff --git a/README.md b/README.md
index 56d19aa3..5b8a6d2c 100644
--- a/README.md
+++ b/README.md
@@ -334,6 +334,7 @@
 343|[Integer Break](./solutions/0343-integer-break.js)|Medium|
 344|[Reverse String](./solutions/0344-reverse-string.js)|Easy|
 345|[Reverse Vowels of a String](./solutions/0345-reverse-vowels-of-a-string.js)|Easy|
+346|[Moving Average from Data Stream](./solutions/0346-moving-average-from-data-stream.js)|Easy|
 347|[Top K Frequent Elements](./solutions/0347-top-k-frequent-elements.js)|Medium|
 349|[Intersection of Two Arrays](./solutions/0349-intersection-of-two-arrays.js)|Easy|
 350|[Intersection of Two Arrays II](./solutions/0350-intersection-of-two-arrays-ii.js)|Easy|
diff --git a/solutions/0346-moving-average-from-data-stream.js b/solutions/0346-moving-average-from-data-stream.js
new file mode 100644
index 00000000..6c2981a8
--- /dev/null
+++ b/solutions/0346-moving-average-from-data-stream.js
@@ -0,0 +1,36 @@
+/**
+ * 346. Moving Average from Data Stream
+ * https://leetcode.com/problems/moving-average-from-data-stream/
+ * Difficulty: Easy
+ *
+ * Given a stream of integers and a window size, calculate the moving average of all integers
+ * in the sliding window.
+ *
+ * Implement the MovingAverage class:
+ * - MovingAverage(int size) Initializes the object with the size of the window size.
+ * - double next(int val) Returns the moving average of the last size values of the stream.
+ */
+
+/**
+ * @param {number} size
+ */
+var MovingAverage = function(size) {
+  this.window = [];
+  this.maxSize = size;
+  this.sum = 0;
+};
+
+/**
+ * @param {number} val
+ * @return {number}
+ */
+MovingAverage.prototype.next = function(val) {
+  this.window.push(val);
+  this.sum += val;
+
+  if (this.window.length > this.maxSize) {
+    this.sum -= this.window.shift();
+  }
+
+  return this.sum / this.window.length;
+};

From 6cabf2bcb38f741b5a09ef3ba6aa96b4852f0abc Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 14 Jun 2025 00:13:42 -0500
Subject: [PATCH 556/571] Add solution #348

---
 README.md                            |  1 +
 solutions/0348-design-tic-tac-toe.js | 59 ++++++++++++++++++++++++++++
 2 files changed, 60 insertions(+)
 create mode 100644 solutions/0348-design-tic-tac-toe.js

diff --git a/README.md b/README.md
index 5b8a6d2c..d94532c8 100644
--- a/README.md
+++ b/README.md
@@ -336,6 +336,7 @@
 345|[Reverse Vowels of a String](./solutions/0345-reverse-vowels-of-a-string.js)|Easy|
 346|[Moving Average from Data Stream](./solutions/0346-moving-average-from-data-stream.js)|Easy|
 347|[Top K Frequent Elements](./solutions/0347-top-k-frequent-elements.js)|Medium|
+348|[Design Tic-Tac-Toe](./solutions/0348-design-tic-tac-toe.js)|Medium|
 349|[Intersection of Two Arrays](./solutions/0349-intersection-of-two-arrays.js)|Easy|
 350|[Intersection of Two Arrays II](./solutions/0350-intersection-of-two-arrays-ii.js)|Easy|
 352|[Data Stream as Disjoint Intervals](./solutions/0352-data-stream-as-disjoint-intervals.js)|Hard|
diff --git a/solutions/0348-design-tic-tac-toe.js b/solutions/0348-design-tic-tac-toe.js
new file mode 100644
index 00000000..9b517913
--- /dev/null
+++ b/solutions/0348-design-tic-tac-toe.js
@@ -0,0 +1,59 @@
+/**
+ * 348. Design Tic-Tac-Toe
+ * https://leetcode.com/problems/design-tic-tac-toe/
+ * Difficulty: Medium
+ *
+ * Assume the following rules are for the tic-tac-toe game on an n x n board between two players:
+ * 1. A move is guaranteed to be valid and is placed on an empty block.
+ * 2. Once a winning condition is reached, no more moves are allowed.
+ * 3. A player who succeeds in placing n of their marks in a horizontal, vertical, or diagonal
+ *    row wins the game.
+ *
+ * Implement the TicTacToe class:
+ * - TicTacToe(int n) Initializes the object the size of the board n.
+ * - int move(int row, int col, int player) Indicates that the player with id player plays at the
+ *   cell (row, col) of the board. The move is guaranteed to be a valid move, and the two players
+ *   alternate in making moves. Return
+ *   - 0 if there is no winner after the move,
+ *   - 1 if player 1 is the winner after the move, or
+ *   - 2 if player 2 is the winner after the move.
+ */
+
+/**
+ * @param {number} n
+ */
+var TicTacToe = function(n) {
+  this.size = n;
+  this.rows = new Array(n).fill(0);
+  this.cols = new Array(n).fill(0);
+  this.diagonal = 0;
+  this.antiDiagonal = 0;
+};
+
+/**
+ * @param {number} row
+ * @param {number} col
+ * @param {number} player
+ * @return {number}
+ */
+TicTacToe.prototype.move = function(row, col, player) {
+  const value = player === 1 ? 1 : -1;
+
+  this.rows[row] += value;
+  this.cols[col] += value;
+
+  if (row === col) {
+    this.diagonal += value;
+  }
+
+  if (row + col === this.size - 1) {
+    this.antiDiagonal += value;
+  }
+
+  if (Math.abs(this.rows[row]) === this.size || Math.abs(this.cols[col]) === this.size
+    || Math.abs(this.diagonal) === this.size || Math.abs(this.antiDiagonal) === this.size) {
+    return player;
+  }
+
+  return 0;
+};

From 5228884b3a5df32cbf22ee15738ff92ff7ceaf50 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 14 Jun 2025 18:32:45 -0500
Subject: [PATCH 557/571] Add solution #351

---
 README.md                                 |  1 +
 solutions/0351-android-unlock-patterns.js | 68 +++++++++++++++++++++++
 2 files changed, 69 insertions(+)
 create mode 100644 solutions/0351-android-unlock-patterns.js

diff --git a/README.md b/README.md
index d94532c8..38794736 100644
--- a/README.md
+++ b/README.md
@@ -339,6 +339,7 @@
 348|[Design Tic-Tac-Toe](./solutions/0348-design-tic-tac-toe.js)|Medium|
 349|[Intersection of Two Arrays](./solutions/0349-intersection-of-two-arrays.js)|Easy|
 350|[Intersection of Two Arrays II](./solutions/0350-intersection-of-two-arrays-ii.js)|Easy|
+351|[Android Unlock Patterns](./solutions/0351-android-unlock-patterns.js)|Medium|
 352|[Data Stream as Disjoint Intervals](./solutions/0352-data-stream-as-disjoint-intervals.js)|Hard|
 354|[Russian Doll Envelopes](./solutions/0354-russian-doll-envelopes.js)|Hard|
 355|[Design Twitter](./solutions/0355-design-twitter.js)|Medium|
diff --git a/solutions/0351-android-unlock-patterns.js b/solutions/0351-android-unlock-patterns.js
new file mode 100644
index 00000000..ef71439d
--- /dev/null
+++ b/solutions/0351-android-unlock-patterns.js
@@ -0,0 +1,68 @@
+/**
+ * 351. Android Unlock Patterns
+ * https://leetcode.com/problems/android-unlock-patterns/
+ * Difficulty: Medium
+ *
+ * Android devices have a special lock screen with a 3 x 3 grid of dots. Users can set an
+ * "unlock pattern" by connecting the dots in a specific sequence, forming a series of joined
+ * line segments where each segment's endpoints are two consecutive dots in the sequence.
+ * A sequence of k dots is a valid unlock pattern if both of the following are true:
+ * - All the dots in the sequence are distinct.
+ * - If the line segment connecting two consecutive dots in the sequence passes through the
+ *   center of any other dot, the other dot must have previously appeared in the sequence.
+ *   No jumps through the center non-selected dots are allowed.
+ *   - For example, connecting dots 2 and 9 without dots 5 or 6 appearing beforehand is valid
+ *     because the line from dot 2 to dot 9 does not pass through the center of either dot 5 or 6.
+ *   - However, connecting dots 1 and 3 without dot 2 appearing beforehand is invalid because
+ *     the line from dot 1 to dot 3 passes through the center of dot 2.
+ *
+ * Here are some example valid and invalid unlock patterns:
+ */
+
+/**
+ * @param {number} m
+ * @param {number} n
+ * @return {number}
+ */
+var numberOfPatterns = function(m, n) {
+  const jumps = new Array(10).fill().map(() => new Array(10).fill(0));
+  jumps[1][3] = jumps[3][1] = 2;
+  jumps[1][7] = jumps[7][1] = 4;
+  jumps[3][9] = jumps[9][3] = 6;
+  jumps[7][9] = jumps[9][7] = 8;
+  jumps[1][9] = jumps[9][1] = jumps[2][8] = jumps[8][2] = jumps[3][7]
+    = jumps[7][3] = jumps[4][6] = jumps[6][4] = 5;
+
+  function backtrack(current, visited, length) {
+    if (length > n) return 0;
+    let count = length >= m ? 1 : 0;
+    if (length === n) return count;
+
+    for (let next = 1; next <= 9; next++) {
+      if (!visited.has(next)) {
+        const jump = jumps[current][next];
+        if (jump === 0 || visited.has(jump)) {
+          visited.add(next);
+          count += backtrack(next, visited, length + 1);
+          visited.delete(next);
+        }
+      }
+    }
+    return count;
+  }
+
+  let total = 0;
+  const visited = new Set();
+  visited.add(1);
+  total += backtrack(1, visited, 1) * 4;
+  visited.delete(1);
+
+  visited.add(2);
+  total += backtrack(2, visited, 1) * 4;
+  visited.delete(2);
+
+  visited.add(5);
+  total += backtrack(5, visited, 1);
+
+  return total;
+};

From e6f42ed94eb9d56f1f64e7edab5fff50d07935ff Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 14 Jun 2025 18:34:19 -0500
Subject: [PATCH 558/571] Add solution #353

---
 README.md                           |  1 +
 solutions/0353-design-snake-game.js | 82 +++++++++++++++++++++++++++++
 2 files changed, 83 insertions(+)
 create mode 100644 solutions/0353-design-snake-game.js

diff --git a/README.md b/README.md
index 38794736..dfabb272 100644
--- a/README.md
+++ b/README.md
@@ -341,6 +341,7 @@
 350|[Intersection of Two Arrays II](./solutions/0350-intersection-of-two-arrays-ii.js)|Easy|
 351|[Android Unlock Patterns](./solutions/0351-android-unlock-patterns.js)|Medium|
 352|[Data Stream as Disjoint Intervals](./solutions/0352-data-stream-as-disjoint-intervals.js)|Hard|
+353|[Design Snake Game](./solutions/0353-design-snake-game.js)|Medium|
 354|[Russian Doll Envelopes](./solutions/0354-russian-doll-envelopes.js)|Hard|
 355|[Design Twitter](./solutions/0355-design-twitter.js)|Medium|
 357|[Count Numbers with Unique Digits](./solutions/0357-count-numbers-with-unique-digits.js)|Medium|
diff --git a/solutions/0353-design-snake-game.js b/solutions/0353-design-snake-game.js
new file mode 100644
index 00000000..4f615906
--- /dev/null
+++ b/solutions/0353-design-snake-game.js
@@ -0,0 +1,82 @@
+/**
+ * 353. Design Snake Game
+ * https://leetcode.com/problems/design-snake-game/
+ * Difficulty: Medium
+ *
+ * Design a Snake game that is played on a device with screen size height x width. Play the
+ * game online if you are not familiar with the game.
+ *
+ * The snake is initially positioned at the top left corner (0, 0) with a length of 1 unit.
+ *
+ * You are given an array food where food[i] = (ri, ci) is the row and column position of a
+ * piece of food that the snake can eat. When a snake eats a piece of food, its length and
+ * the game's score both increase by 1.
+ *
+ * Each piece of food appears one by one on the screen, meaning the second piece of food will
+ * not appear until the snake eats the first piece of food.
+ *
+ * When a piece of food appears on the screen, it is guaranteed that it will not appear on a
+ * block occupied by the snake.
+ *
+ * The game is over if the snake goes out of bounds (hits a wall) or if its head occupies a
+ * space that its body occupies after moving (i.e. a snake of length 4 cannot run into itself).
+ *
+ * Implement the SnakeGame class:
+ * - SnakeGame(int width, int height, int[][] food) Initializes the object with a screen of size
+ *   height x width and the positions of the food.
+ * - int move(String direction) Returns the score of the game after applying one direction move
+ *   by the snake. If the game is over, return -1.
+ */
+
+/**
+ * @param {number} width
+ * @param {number} height
+ * @param {number[][]} food
+ */
+var SnakeGame = function(width, height, food) {
+  this.width = width;
+  this.height = height;
+  this.food = food;
+  this.foodIndex = 0;
+  this.score = 0;
+  this.snake = [[0, 0]];
+  this.bodySet = new Set(['0,0']);
+};
+
+/**
+ * @param {string} direction
+ * @return {number}
+ */
+SnakeGame.prototype.move = function(direction) {
+  const head = [...this.snake[0]];
+
+  if (direction === 'U') head[0]--;
+  else if (direction === 'D') head[0]++;
+  else if (direction === 'L') head[1]--;
+  else if (direction === 'R') head[1]++;
+
+  if (head[0] < 0 || head[0] >= this.height || head[1] < 0 || head[1] >= this.width) {
+    return -1;
+  }
+
+  const tail = this.snake.pop();
+  this.bodySet.delete(`${tail[0]},${tail[1]}`);
+
+  const headKey = `${head[0]},${head[1]}`;
+  if (this.bodySet.has(headKey)) {
+    return -1;
+  }
+
+  this.snake.unshift(head);
+  this.bodySet.add(headKey);
+
+  if (this.foodIndex < this.food.length && head[0] === this.food[this.foodIndex][0]
+      && head[1] === this.food[this.foodIndex][1]) {
+    this.snake.push(tail);
+    this.bodySet.add(`${tail[0]},${tail[1]}`);
+    this.foodIndex++;
+    this.score++;
+  }
+
+  return this.score;
+};

From f16cf7c6cdbba949d515f0d0602b96ad2a988772 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 14 Jun 2025 18:45:18 -0500
Subject: [PATCH 559/571] Add solution #356

---
 README.md                         |  1 +
 solutions/0356-line-reflection.js | 37 +++++++++++++++++++++++++++++++
 2 files changed, 38 insertions(+)
 create mode 100644 solutions/0356-line-reflection.js

diff --git a/README.md b/README.md
index dfabb272..0116f009 100644
--- a/README.md
+++ b/README.md
@@ -344,6 +344,7 @@
 353|[Design Snake Game](./solutions/0353-design-snake-game.js)|Medium|
 354|[Russian Doll Envelopes](./solutions/0354-russian-doll-envelopes.js)|Hard|
 355|[Design Twitter](./solutions/0355-design-twitter.js)|Medium|
+356|[Line Reflection](./solutions/0356-line-reflection.js)|Medium|
 357|[Count Numbers with Unique Digits](./solutions/0357-count-numbers-with-unique-digits.js)|Medium|
 363|[Max Sum of Rectangle No Larger Than K](./solutions/0363-max-sum-of-rectangle-no-larger-than-k.js)|Hard|
 365|[Water and Jug Problem](./solutions/0365-water-and-jug-problem.js)|Medium|
diff --git a/solutions/0356-line-reflection.js b/solutions/0356-line-reflection.js
new file mode 100644
index 00000000..76722159
--- /dev/null
+++ b/solutions/0356-line-reflection.js
@@ -0,0 +1,37 @@
+/**
+ * 356. Line Reflection
+ * https://leetcode.com/problems/line-reflection/
+ * Difficulty: Medium
+ *
+ * Given n points on a 2D plane, find if there is such a line parallel to the y-axis that reflects
+ * the given points symmetrically.
+ *
+ * In other words, answer whether or not if there exists a line that after reflecting all points
+ * over the given line, the original points' set is the same as the reflected ones.
+ *
+ * Note that there can be repeated points.
+ */
+
+/**
+ * @param {number[][]} points
+ * @return {boolean}
+ */
+var isReflected = function(points) {
+  const pointSet = new Set(points.map(([x, y]) => `${x},${y}`));
+  let minX = Infinity;
+  let maxX = -Infinity;
+
+  for (const [x] of points) {
+    minX = Math.min(minX, x);
+    maxX = Math.max(maxX, x);
+  }
+
+  const sum = minX + maxX;
+  for (const [x, y] of points) {
+    if (!pointSet.has(`${sum - x},${y}`)) {
+      return false;
+    }
+  }
+
+  return true;
+};

From d891f694aaff9390f786ecc2ff3112a579c9e86b Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 14 Jun 2025 18:50:55 -0500
Subject: [PATCH 560/571] Add solution #358

---
 README.md                                     |  1 +
 .../0358-rearrange-string-k-distance-apart.js | 65 +++++++++++++++++++
 2 files changed, 66 insertions(+)
 create mode 100644 solutions/0358-rearrange-string-k-distance-apart.js

diff --git a/README.md b/README.md
index 0116f009..706d525c 100644
--- a/README.md
+++ b/README.md
@@ -346,6 +346,7 @@
 355|[Design Twitter](./solutions/0355-design-twitter.js)|Medium|
 356|[Line Reflection](./solutions/0356-line-reflection.js)|Medium|
 357|[Count Numbers with Unique Digits](./solutions/0357-count-numbers-with-unique-digits.js)|Medium|
+358|[Rearrange String k Distance Apart](./solutions/0358-rearrange-string-k-distance-apart.js)|Hard|
 363|[Max Sum of Rectangle No Larger Than K](./solutions/0363-max-sum-of-rectangle-no-larger-than-k.js)|Hard|
 365|[Water and Jug Problem](./solutions/0365-water-and-jug-problem.js)|Medium|
 367|[Valid Perfect Square](./solutions/0367-valid-perfect-square.js)|Easy|
diff --git a/solutions/0358-rearrange-string-k-distance-apart.js b/solutions/0358-rearrange-string-k-distance-apart.js
new file mode 100644
index 00000000..9d498ae4
--- /dev/null
+++ b/solutions/0358-rearrange-string-k-distance-apart.js
@@ -0,0 +1,65 @@
+/**
+ * 358. Rearrange String k Distance Apart
+ * https://leetcode.com/problems/rearrange-string-k-distance-apart/
+ * Difficulty: Hard
+ *
+ * Given a string s and an integer k, rearrange s such that the same characters are at least
+ * distance k from each other. If it is not possible to rearrange the string, return an empty
+ * string "".
+ */
+
+/**
+ * @param {string} s
+ * @param {number} k
+ * @return {string}
+ */
+var rearrangeString = function(s, k) {
+  if (k <= 1) return s;
+
+  const charCount = new Array(26).fill(0);
+  for (const char of s) {
+    charCount[char.charCodeAt(0) - 97]++;
+  }
+
+  const maxHeap = [];
+  for (let i = 0; i < 26; i++) {
+    if (charCount[i] > 0) {
+      maxHeap.push([charCount[i], String.fromCharCode(i + 97)]);
+    }
+  }
+  maxHeap.sort((a, b) => b[0] - a[0]);
+
+  const maxFreq = maxHeap[0] ? maxHeap[0][0] : 0;
+  if (maxFreq > Math.ceil(s.length / k)) return '';
+
+  const result = new Array(s.length).fill('');
+  let index = 0;
+
+  while (maxHeap.length) {
+    const temp = [];
+    for (let i = 0; i < k && maxHeap.length; i++) {
+      const [count, char] = maxHeap.shift();
+      while (index < s.length && result[index] !== '') {
+        index++;
+      }
+      if (index >= s.length) index = 0;
+      result[index] = char;
+      index++;
+      if (count > 1) temp.push([count - 1, char]);
+    }
+
+    temp.sort((a, b) => b[0] - a[0]);
+    maxHeap.push(...temp);
+    maxHeap.sort((a, b) => b[0] - a[0]);
+  }
+
+  for (let i = 0; i <= s.length - k; i++) {
+    const seen = new Set();
+    for (let j = i; j < i + k; j++) {
+      if (seen.has(result[j])) return '';
+      seen.add(result[j]);
+    }
+  }
+
+  return result.join('');
+};

From 54c12c8939822ac334413a5568d140bb6864d45c Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 14 Jun 2025 18:54:30 -0500
Subject: [PATCH 561/571] Add solution #359

---
 README.md                             |  1 +
 solutions/0359-logger-rate-limiter.js | 35 +++++++++++++++++++++++++++
 2 files changed, 36 insertions(+)
 create mode 100644 solutions/0359-logger-rate-limiter.js

diff --git a/README.md b/README.md
index 706d525c..52a876ed 100644
--- a/README.md
+++ b/README.md
@@ -347,6 +347,7 @@
 356|[Line Reflection](./solutions/0356-line-reflection.js)|Medium|
 357|[Count Numbers with Unique Digits](./solutions/0357-count-numbers-with-unique-digits.js)|Medium|
 358|[Rearrange String k Distance Apart](./solutions/0358-rearrange-string-k-distance-apart.js)|Hard|
+359|[Logger Rate Limiter](./solutions/0359-logger-rate-limiter.js)|Easy|
 363|[Max Sum of Rectangle No Larger Than K](./solutions/0363-max-sum-of-rectangle-no-larger-than-k.js)|Hard|
 365|[Water and Jug Problem](./solutions/0365-water-and-jug-problem.js)|Medium|
 367|[Valid Perfect Square](./solutions/0367-valid-perfect-square.js)|Easy|
diff --git a/solutions/0359-logger-rate-limiter.js b/solutions/0359-logger-rate-limiter.js
new file mode 100644
index 00000000..9dacbd78
--- /dev/null
+++ b/solutions/0359-logger-rate-limiter.js
@@ -0,0 +1,35 @@
+/**
+ * 359. Logger Rate Limiter
+ * https://leetcode.com/problems/logger-rate-limiter/
+ * Difficulty: Easy
+ *
+ * Design a logger system that receives a stream of messages along with their timestamps.
+ * Each unique message should only be printed at most every 10 seconds (i.e. a message
+ * printed at timestamp t will prevent other identical messages from being printed until
+ * timestamp t + 10).
+ *
+ * All messages will come in chronological order. Several messages may arrive at the same timestamp.
+ *
+ * Implement the Logger class:
+ * - Logger() Initializes the logger object.
+ * - bool shouldPrintMessage(int timestamp, string message) Returns true if the message should
+ *   be printed in the given timestamp, otherwise returns false.
+ */
+
+var Logger = function() {
+  this.messageTimestamps = new Map();
+};
+
+/**
+ * @param {number} timestamp
+ * @param {string} message
+ * @return {boolean}
+ */
+Logger.prototype.shouldPrintMessage = function(timestamp, message) {
+  const nextAllowed = this.messageTimestamps.get(message) || 0;
+  if (timestamp >= nextAllowed) {
+    this.messageTimestamps.set(message, timestamp + 10);
+    return true;
+  }
+  return false;
+};

From 89c6381e290ac18f4d9f8274b70e65b24569eeaf Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 14 Jun 2025 18:56:28 -0500
Subject: [PATCH 562/571] Add solution #360

---
 README.md                                |  1 +
 solutions/0360-sort-transformed-array.js | 52 ++++++++++++++++++++++++
 2 files changed, 53 insertions(+)
 create mode 100644 solutions/0360-sort-transformed-array.js

diff --git a/README.md b/README.md
index 52a876ed..0cda5cca 100644
--- a/README.md
+++ b/README.md
@@ -348,6 +348,7 @@
 357|[Count Numbers with Unique Digits](./solutions/0357-count-numbers-with-unique-digits.js)|Medium|
 358|[Rearrange String k Distance Apart](./solutions/0358-rearrange-string-k-distance-apart.js)|Hard|
 359|[Logger Rate Limiter](./solutions/0359-logger-rate-limiter.js)|Easy|
+360|[Sort Transformed Array](./solutions/0360-sort-transformed-array.js)|Medium|
 363|[Max Sum of Rectangle No Larger Than K](./solutions/0363-max-sum-of-rectangle-no-larger-than-k.js)|Hard|
 365|[Water and Jug Problem](./solutions/0365-water-and-jug-problem.js)|Medium|
 367|[Valid Perfect Square](./solutions/0367-valid-perfect-square.js)|Easy|
diff --git a/solutions/0360-sort-transformed-array.js b/solutions/0360-sort-transformed-array.js
new file mode 100644
index 00000000..30badca3
--- /dev/null
+++ b/solutions/0360-sort-transformed-array.js
@@ -0,0 +1,52 @@
+/**
+ * 360. Sort Transformed Array
+ * https://leetcode.com/problems/sort-transformed-array/
+ * Difficulty: Medium
+ *
+ * Given a sorted integer array nums and three integers a, b and c, apply a quadratic function
+ * of the form f(x) = ax2 + bx + c to each element nums[i] in the array, and return the array
+ * in a sorted order.
+ */
+
+/**
+ * @param {number[]} nums
+ * @param {number} a
+ * @param {number} b
+ * @param {number} c
+ * @return {number[]}
+ */
+var sortTransformedArray = function(nums, a, b, c) {
+  const result = new Array(nums.length);
+  let left = 0;
+  let right = nums.length - 1;
+  let index = a >= 0 ? nums.length - 1 : 0;
+
+  while (left <= right) {
+    const leftVal = transform(nums[left]);
+    const rightVal = transform(nums[right]);
+
+    if (a >= 0) {
+      if (leftVal > rightVal) {
+        result[index--] = leftVal;
+        left++;
+      } else {
+        result[index--] = rightVal;
+        right--;
+      }
+    } else {
+      if (leftVal < rightVal) {
+        result[index++] = leftVal;
+        left++;
+      } else {
+        result[index++] = rightVal;
+        right--;
+      }
+    }
+  }
+
+  return result;
+
+  function transform(x) {
+    return a * x * x + b * x + c;
+  }
+};

From 137a6aece15c42c40d62c0a89156f31e742b1cb4 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 14 Jun 2025 18:57:32 -0500
Subject: [PATCH 563/571] Add solution #361

---
 README.md                    |  1 +
 solutions/0361-bomb-enemy.js | 46 ++++++++++++++++++++++++++++++++++++
 2 files changed, 47 insertions(+)
 create mode 100644 solutions/0361-bomb-enemy.js

diff --git a/README.md b/README.md
index 0cda5cca..22c9c812 100644
--- a/README.md
+++ b/README.md
@@ -349,6 +349,7 @@
 358|[Rearrange String k Distance Apart](./solutions/0358-rearrange-string-k-distance-apart.js)|Hard|
 359|[Logger Rate Limiter](./solutions/0359-logger-rate-limiter.js)|Easy|
 360|[Sort Transformed Array](./solutions/0360-sort-transformed-array.js)|Medium|
+361|[Bomb Enemy](./solutions/0361-bomb-enemy.js)|Medium|
 363|[Max Sum of Rectangle No Larger Than K](./solutions/0363-max-sum-of-rectangle-no-larger-than-k.js)|Hard|
 365|[Water and Jug Problem](./solutions/0365-water-and-jug-problem.js)|Medium|
 367|[Valid Perfect Square](./solutions/0367-valid-perfect-square.js)|Easy|
diff --git a/solutions/0361-bomb-enemy.js b/solutions/0361-bomb-enemy.js
new file mode 100644
index 00000000..ffa279e8
--- /dev/null
+++ b/solutions/0361-bomb-enemy.js
@@ -0,0 +1,46 @@
+/**
+ * 361. Bomb Enemy
+ * https://leetcode.com/problems/bomb-enemy/
+ * Difficulty: Medium
+ *
+ * Given an m x n matrix grid where each cell is either a wall 'W', an enemy 'E' or empty '0',
+ * return the maximum enemies you can kill using one bomb. You can only place the bomb in an
+ * empty cell.
+ *
+ * The bomb kills all the enemies in the same row and column from the planted point until it
+ * hits the wall since it is too strong to be destroyed.
+ */
+
+/**
+ * @param {character[][]} grid
+ * @return {number}
+ */
+var maxKilledEnemies = function(grid) {
+  const rows = grid.length;
+  const cols = grid[0].length;
+  const colHits = new Array(cols).fill(0);
+  let rowHits = 0;
+  let result = 0;
+
+  for (let i = 0; i < rows; i++) {
+    for (let j = 0; j < cols; j++) {
+      if (j === 0 || grid[i][j-1] === 'W') {
+        rowHits = 0;
+        for (let k = j; k < cols && grid[i][k] !== 'W'; k++) {
+          if (grid[i][k] === 'E') rowHits++;
+        }
+      }
+      if (i === 0 || grid[i-1][j] === 'W') {
+        colHits[j] = 0;
+        for (let k = i; k < rows && grid[k][j] !== 'W'; k++) {
+          if (grid[k][j] === 'E') colHits[j]++;
+        }
+      }
+      if (grid[i][j] === '0') {
+        result = Math.max(result, rowHits + colHits[j]);
+      }
+    }
+  }
+
+  return result;
+};

From 4d1dac8948c90bd42902f42b42e29d9faafb217e Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 14 Jun 2025 18:59:20 -0500
Subject: [PATCH 564/571] Add solution #362

---
 README.md                            |  1 +
 solutions/0362-design-hit-counter.js | 43 ++++++++++++++++++++++++++++
 2 files changed, 44 insertions(+)
 create mode 100644 solutions/0362-design-hit-counter.js

diff --git a/README.md b/README.md
index 22c9c812..255750d9 100644
--- a/README.md
+++ b/README.md
@@ -350,6 +350,7 @@
 359|[Logger Rate Limiter](./solutions/0359-logger-rate-limiter.js)|Easy|
 360|[Sort Transformed Array](./solutions/0360-sort-transformed-array.js)|Medium|
 361|[Bomb Enemy](./solutions/0361-bomb-enemy.js)|Medium|
+362|[Design Hit Counter](./solutions/0362-design-hit-counter.js)|Medium|
 363|[Max Sum of Rectangle No Larger Than K](./solutions/0363-max-sum-of-rectangle-no-larger-than-k.js)|Hard|
 365|[Water and Jug Problem](./solutions/0365-water-and-jug-problem.js)|Medium|
 367|[Valid Perfect Square](./solutions/0367-valid-perfect-square.js)|Easy|
diff --git a/solutions/0362-design-hit-counter.js b/solutions/0362-design-hit-counter.js
new file mode 100644
index 00000000..ebe1aeef
--- /dev/null
+++ b/solutions/0362-design-hit-counter.js
@@ -0,0 +1,43 @@
+/**
+ * 362. Design Hit Counter
+ * https://leetcode.com/problems/design-hit-counter/
+ * Difficulty: Medium
+ *
+ * Design a hit counter which counts the number of hits received in the past 5 minutes
+ * (i.e., the past 300 seconds).
+ *
+ * Your system should accept a timestamp parameter (in seconds granularity), and you may
+ * assume that calls are being made to the system in chronological order (i.e., timestamp
+ * is monotonically increasing). Several hits may arrive roughly at the same time.
+ *
+ * Implement the HitCounter class:
+ * - HitCounter() Initializes the object of the hit counter system.
+ * - void hit(int timestamp) Records a hit that happened at timestamp (in seconds). Several
+ *   hits may happen at the same timestamp.
+ * - int getHits(int timestamp) Returns the number of hits in the past 5 minutes from timestamp
+ *   (i.e., the past 300 seconds).
+ */
+
+var HitCounter = function() {
+  this.hits = [];
+};
+
+/**
+ * @param {number} timestamp
+ * @return {void}
+ */
+HitCounter.prototype.hit = function(timestamp) {
+  this.hits.push(timestamp);
+};
+
+/**
+ * @param {number} timestamp
+ * @return {number}
+ */
+HitCounter.prototype.getHits = function(timestamp) {
+  const threshold = timestamp - 300;
+  while (this.hits.length && this.hits[0] <= threshold) {
+    this.hits.shift();
+  }
+  return this.hits.length;
+};

From 7171461fdc69f72ac1d1a0d8ff337f82846f2af3 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 14 Jun 2025 19:00:52 -0500
Subject: [PATCH 565/571] Add solution #364

---
 README.md                                   |  1 +
 solutions/0364-nested-list-weight-sum-ii.js | 47 +++++++++++++++++++++
 2 files changed, 48 insertions(+)
 create mode 100644 solutions/0364-nested-list-weight-sum-ii.js

diff --git a/README.md b/README.md
index 255750d9..f0e30ed1 100644
--- a/README.md
+++ b/README.md
@@ -352,6 +352,7 @@
 361|[Bomb Enemy](./solutions/0361-bomb-enemy.js)|Medium|
 362|[Design Hit Counter](./solutions/0362-design-hit-counter.js)|Medium|
 363|[Max Sum of Rectangle No Larger Than K](./solutions/0363-max-sum-of-rectangle-no-larger-than-k.js)|Hard|
+364|[Nested List Weight Sum II](./solutions/0364-nested-list-weight-sum-ii.js)|Medium|
 365|[Water and Jug Problem](./solutions/0365-water-and-jug-problem.js)|Medium|
 367|[Valid Perfect Square](./solutions/0367-valid-perfect-square.js)|Easy|
 368|[Largest Divisible Subset](./solutions/0368-largest-divisible-subset.js)|Medium|
diff --git a/solutions/0364-nested-list-weight-sum-ii.js b/solutions/0364-nested-list-weight-sum-ii.js
new file mode 100644
index 00000000..dea3ecd0
--- /dev/null
+++ b/solutions/0364-nested-list-weight-sum-ii.js
@@ -0,0 +1,47 @@
+/**
+ * 364. Nested List Weight Sum II
+ * https://leetcode.com/problems/nested-list-weight-sum-ii/
+ * Difficulty: Medium
+ *
+ * You are given a nested list of integers nestedList. Each element is either an integer or
+ * a list whose elements may also be integers or other lists.
+ *
+ * The depth of an integer is the number of lists that it is inside of. For example, the
+ * nested list [1,[2,2],[[3],2],1] has each integer's value set to its depth. Let maxDepth
+ * be the maximum depth of any integer.
+ *
+ * The weight of an integer is maxDepth - (the depth of the integer) + 1.
+ *
+ * Return the sum of each integer in nestedList multiplied by its weight.
+ */
+
+/**
+ * @param {NestedInteger[]} nestedList
+ * @return {number}
+ */
+var depthSumInverse = function(nestedList) {
+  const maxDepth = findMaxDepth(nestedList, 1);
+  return calculateSum(nestedList, 1, maxDepth);
+
+  function findMaxDepth(list, depth) {
+    let maxDepth = depth;
+    for (const element of list) {
+      if (!element.isInteger()) {
+        maxDepth = Math.max(maxDepth, findMaxDepth(element.getList(), depth + 1));
+      }
+    }
+    return maxDepth;
+  }
+
+  function calculateSum(list, depth, maxDepth) {
+    let total = 0;
+    for (const element of list) {
+      if (element.isInteger()) {
+        total += element.getInteger() * (maxDepth - depth + 1);
+      } else {
+        total += calculateSum(element.getList(), depth + 1, maxDepth);
+      }
+    }
+    return total;
+  }
+};

From f7d749dc46b22c95fd6dc280c165335eb5f1adbc Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sat, 14 Jun 2025 19:02:01 -0500
Subject: [PATCH 566/571] Add solution #366

---
 README.md                                    |  1 +
 solutions/0366-find-leaves-of-binary-tree.js | 43 ++++++++++++++++++++
 2 files changed, 44 insertions(+)
 create mode 100644 solutions/0366-find-leaves-of-binary-tree.js

diff --git a/README.md b/README.md
index f0e30ed1..407f31ea 100644
--- a/README.md
+++ b/README.md
@@ -354,6 +354,7 @@
 363|[Max Sum of Rectangle No Larger Than K](./solutions/0363-max-sum-of-rectangle-no-larger-than-k.js)|Hard|
 364|[Nested List Weight Sum II](./solutions/0364-nested-list-weight-sum-ii.js)|Medium|
 365|[Water and Jug Problem](./solutions/0365-water-and-jug-problem.js)|Medium|
+366|[Find Leaves of Binary Tree](./solutions/0366-find-leaves-of-binary-tree.js)|Medium|
 367|[Valid Perfect Square](./solutions/0367-valid-perfect-square.js)|Easy|
 368|[Largest Divisible Subset](./solutions/0368-largest-divisible-subset.js)|Medium|
 371|[Sum of Two Integers](./solutions/0371-sum-of-two-integers.js)|Medium|
diff --git a/solutions/0366-find-leaves-of-binary-tree.js b/solutions/0366-find-leaves-of-binary-tree.js
new file mode 100644
index 00000000..45159fed
--- /dev/null
+++ b/solutions/0366-find-leaves-of-binary-tree.js
@@ -0,0 +1,43 @@
+/**
+ * 366. Find Leaves of Binary Tree
+ * https://leetcode.com/problems/find-leaves-of-binary-tree/
+ * Difficulty: Medium
+ *
+ * Given the root of a binary tree, collect a tree's nodes as if you were doing this:
+ * - Collect all the leaf nodes.
+ * - Remove all the leaf nodes.
+ * - Repeat until the tree is empty.
+ */
+
+/**
+ * Definition for a binary tree node.
+ * function TreeNode(val, left, right) {
+ *     this.val = (val===undefined ? 0 : val)
+ *     this.left = (left===undefined ? null : left)
+ *     this.right = (right===undefined ? null : right)
+ * }
+ */
+/**
+ * @param {TreeNode} root
+ * @return {number[][]}
+ */
+var findLeaves = function(root) {
+  const levels = [];
+  getHeight(root);
+  return levels;
+
+  function getHeight(node) {
+    if (!node) return -1;
+
+    const leftHeight = getHeight(node.left);
+    const rightHeight = getHeight(node.right);
+    const height = Math.max(leftHeight, rightHeight) + 1;
+
+    if (levels.length <= height) {
+      levels.push([]);
+    }
+    levels[height].push(node.val);
+
+    return height;
+  }
+};

From d2400611da0cc99ac016f780e27117aa5141ad18 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 15 Jun 2025 00:11:28 -0500
Subject: [PATCH 567/571] Add solution #369

---
 README.md                              |  1 +
 solutions/0369-plus-one-linked-list.js | 40 ++++++++++++++++++++++++++
 2 files changed, 41 insertions(+)
 create mode 100644 solutions/0369-plus-one-linked-list.js

diff --git a/README.md b/README.md
index 407f31ea..5f0e1860 100644
--- a/README.md
+++ b/README.md
@@ -357,6 +357,7 @@
 366|[Find Leaves of Binary Tree](./solutions/0366-find-leaves-of-binary-tree.js)|Medium|
 367|[Valid Perfect Square](./solutions/0367-valid-perfect-square.js)|Easy|
 368|[Largest Divisible Subset](./solutions/0368-largest-divisible-subset.js)|Medium|
+369|[Plus One Linked List](./solutions/0369-plus-one-linked-list.js)|Medium|
 371|[Sum of Two Integers](./solutions/0371-sum-of-two-integers.js)|Medium|
 372|[Super Pow](./solutions/0372-super-pow.js)|Medium|
 373|[Find K Pairs with Smallest Sums](./solutions/0373-find-k-pairs-with-smallest-sums.js)|Medium|
diff --git a/solutions/0369-plus-one-linked-list.js b/solutions/0369-plus-one-linked-list.js
new file mode 100644
index 00000000..0dbb048d
--- /dev/null
+++ b/solutions/0369-plus-one-linked-list.js
@@ -0,0 +1,40 @@
+/**
+ * 369. Plus One Linked List
+ * https://leetcode.com/problems/plus-one-linked-list/
+ * Difficulty: Medium
+ *
+ * Given a non-negative integer represented as a linked list of digits, plus one to the integer.
+ *
+ * The digits are stored such that the most significant digit is at the head of the list.
+ */
+
+/**
+ * Definition for singly-linked list.
+ * function ListNode(val, next) {
+ *     this.val = (val===undefined ? 0 : val)
+ *     this.next = (next===undefined ? null : next)
+ * }
+ */
+/**
+ * @param {ListNode} head
+ * @return {ListNode}
+ */
+var plusOne = function(head) {
+  const list = new ListNode(0, head);
+  let notNine = list;
+
+  while (head) {
+    if (head.val !== 9) notNine = head;
+    head = head.next;
+  }
+
+  notNine.val++;
+  notNine = notNine.next;
+
+  while (notNine) {
+    notNine.val = 0;
+    notNine = notNine.next;
+  }
+
+  return list.val === 0 ? list.next : list;
+};

From c441cb7a81f9ebfd7b4c21e8a5e3a8b71eaf90fe Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 15 Jun 2025 00:12:44 -0500
Subject: [PATCH 568/571] Add solution #370

---
 README.md                        |  1 +
 solutions/0370-range-addition.js | 34 ++++++++++++++++++++++++++++++++
 2 files changed, 35 insertions(+)
 create mode 100644 solutions/0370-range-addition.js

diff --git a/README.md b/README.md
index 5f0e1860..3d76cafd 100644
--- a/README.md
+++ b/README.md
@@ -358,6 +358,7 @@
 367|[Valid Perfect Square](./solutions/0367-valid-perfect-square.js)|Easy|
 368|[Largest Divisible Subset](./solutions/0368-largest-divisible-subset.js)|Medium|
 369|[Plus One Linked List](./solutions/0369-plus-one-linked-list.js)|Medium|
+370|[Range Addition](./solutions/0370-range-addition.js)|Medium|
 371|[Sum of Two Integers](./solutions/0371-sum-of-two-integers.js)|Medium|
 372|[Super Pow](./solutions/0372-super-pow.js)|Medium|
 373|[Find K Pairs with Smallest Sums](./solutions/0373-find-k-pairs-with-smallest-sums.js)|Medium|
diff --git a/solutions/0370-range-addition.js b/solutions/0370-range-addition.js
new file mode 100644
index 00000000..b10a3991
--- /dev/null
+++ b/solutions/0370-range-addition.js
@@ -0,0 +1,34 @@
+/**
+ * 370. Range Addition
+ * https://leetcode.com/problems/range-addition/
+ * Difficulty: Medium
+ *
+ * You are given an integer length and an array updates where
+ * updates[i] = [startIdxi, endIdxi, inci].
+ *
+ * You have an array arr of length length with all zeros, and you have some operation
+ * to apply on arr. In the ith operation, you should increment all the elements
+ * arr[startIdxi], arr[startIdxi + 1], ..., arr[endIdxi] by inci.
+ *
+ * Return arr after applying all the updates.
+ */
+
+/**
+ * @param {number} length
+ * @param {number[][]} updates
+ * @return {number[]}
+ */
+var getModifiedArray = function(length, updates) {
+  const result = new Array(length).fill(0);
+
+  for (const [start, end, inc] of updates) {
+    result[start] += inc;
+    if (end + 1 < length) result[end + 1] -= inc;
+  }
+
+  for (let i = 1; i < length; i++) {
+    result[i] += result[i - 1];
+  }
+
+  return result;
+};

From edd396e78e9e6769073f5a7303acf09739878c2a Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 15 Jun 2025 09:25:11 -0500
Subject: [PATCH 569/571] Add solution #379

---
 README.md                                |  1 +
 solutions/0379-design-phone-directory.js | 64 ++++++++++++++++++++++++
 2 files changed, 65 insertions(+)
 create mode 100644 solutions/0379-design-phone-directory.js

diff --git a/README.md b/README.md
index 3d76cafd..50d81549 100644
--- a/README.md
+++ b/README.md
@@ -367,6 +367,7 @@
 376|[Wiggle Subsequence](./solutions/0376-wiggle-subsequence.js)|Medium|
 377|[Combination Sum IV](./solutions/0377-combination-sum-iv.js)|Medium|
 378|[Kth Smallest Element in a Sorted Matrix](./solutions/0378-kth-smallest-element-in-a-sorted-matrix.js)|Medium|
+379|[Design Phone Directory](./solutions/0379-design-phone-directory.js)|Medium|
 380|[Insert Delete GetRandom O(1)](./solutions/0380-insert-delete-getrandom-o1.js)|Medium|
 381|[Insert Delete GetRandom O(1) - Duplicates allowed](./solutions/0381-insert-delete-getrandom-o1-duplicates-allowed.js)|Hard|
 382|[Linked List Random Node](./solutions/0382-linked-list-random-node.js)|Medium|
diff --git a/solutions/0379-design-phone-directory.js b/solutions/0379-design-phone-directory.js
new file mode 100644
index 00000000..4973efa9
--- /dev/null
+++ b/solutions/0379-design-phone-directory.js
@@ -0,0 +1,64 @@
+/**
+ * 379. Design Phone Directory
+ * https://leetcode.com/problems/design-phone-directory/
+ * Difficulty: Medium
+ *
+ * Design a phone directory that initially has maxNumbers empty slots that can store numbers.
+ * The directory should store numbers, check if a certain slot is empty or not, and empty a
+ * given slot.
+ *
+ * Implement the PhoneDirectory class:
+ * - PhoneDirectory(int maxNumbers) Initializes the phone directory with the number of
+ *   available slots maxNumbers.
+ * - int get() Provides a number that is not assigned to anyone. Returns -1 if no number
+ *   is available.
+ * - bool check(int number) Returns true if the slot number is available and false otherwise.
+ * - void release(int number) Recycles or releases the slot number.
+ */
+
+/**
+ * @param {number} maxNumbers
+ */
+var PhoneDirectory = function(maxNumbers) {
+  this.available = new Set();
+  this.released = [];
+  this.max = maxNumbers;
+  for (let i = 0; i < maxNumbers; i++) {
+    this.available.add(i);
+  }
+};
+
+/**
+ * @return {number}
+ */
+PhoneDirectory.prototype.get = function() {
+  if (this.available.size === 0 && this.released.length === 0) return -1;
+  let number;
+  if (this.released.length > 0) {
+    number = this.released.pop();
+  } else {
+    number = this.available.values().next().value;
+    this.available.delete(number);
+  }
+  return number;
+};
+
+/**
+ * @param {number} number
+ * @return {boolean}
+ */
+PhoneDirectory.prototype.check = function(number) {
+  return number >= 0 && number < this.max
+    && (this.available.has(number) || this.released.includes(number));
+};
+
+/**
+ * @param {number} number
+ * @return {void}
+ */
+PhoneDirectory.prototype.release = function(number) {
+  if (number >= 0 && number < this.max
+      && !this.available.has(number) && !this.released.includes(number)) {
+    this.released.push(number);
+  }
+};

From b4c06b1329e68855bec9dd28af03700facbc9f01 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 15 Jun 2025 09:26:45 -0500
Subject: [PATCH 570/571] Add solution #408

---
 README.md                                 |  1 +
 solutions/0408-valid-word-abbreviation.js | 55 +++++++++++++++++++++++
 2 files changed, 56 insertions(+)
 create mode 100644 solutions/0408-valid-word-abbreviation.js

diff --git a/README.md b/README.md
index 50d81549..8c4c39ee 100644
--- a/README.md
+++ b/README.md
@@ -396,6 +396,7 @@
 405|[Convert a Number to Hexadecimal](./solutions/0405-convert-a-number-to-hexadecimal.js)|Easy|
 406|[Queue Reconstruction by Height](./solutions/0406-queue-reconstruction-by-height.js)|Medium|
 407|[Trapping Rain Water II](./solutions/0407-trapping-rain-water-ii.js)|Hard|
+408|[Valid Word Abbreviation](./solutions/0408-valid-word-abbreviation.js)|Easy|
 409|[Longest Palindrome](./solutions/0409-longest-palindrome.js)|Easy|
 410|[Split Array Largest Sum](./solutions/0410-split-array-largest-sum.js)|Hard|
 412|[Fizz Buzz](./solutions/0412-fizz-buzz.js)|Easy|
diff --git a/solutions/0408-valid-word-abbreviation.js b/solutions/0408-valid-word-abbreviation.js
new file mode 100644
index 00000000..9dde3f72
--- /dev/null
+++ b/solutions/0408-valid-word-abbreviation.js
@@ -0,0 +1,55 @@
+/**
+ * 408. Valid Word Abbreviation
+ * https://leetcode.com/problems/valid-word-abbreviation/
+ * Difficulty: Easy
+ *
+ * A string can be abbreviated by replacing any number of non-adjacent, non-empty substrings
+ * with their lengths. The lengths should not have leading zeros.
+ *
+ * For example, a string such as "substitution" could be abbreviated as (but not limited to):
+ * - "s10n" ("s ubstitutio n")
+ * - "sub4u4" ("sub stit u tion")
+ * - "12" ("substitution")
+ * - "su3i1u2on" ("su bst i t u ti on")
+ * - "substitution" (no substrings replaced)
+ *
+ * The following are not valid abbreviations:
+ * - "s55n" ("s ubsti tutio n", the replaced substrings are adjacent)
+ * - "s010n" (has leading zeros)
+ * - "s0ubstitution" (replaces an empty substring)
+ *
+ * Given a string word and an abbreviation abbr, return whether the string matches the given
+ * abbreviation.
+ *
+ * A substring is a contiguous non-empty sequence of characters within a string.
+ */
+
+/**
+ * @param {string} word
+ * @param {string} abbr
+ * @return {boolean}
+ */
+var validWordAbbreviation = function(word, abbr) {
+  let wordIndex = 0;
+  let abbrIndex = 0;
+
+  while (wordIndex < word.length && abbrIndex < abbr.length) {
+    if (word[wordIndex] === abbr[abbrIndex]) {
+      wordIndex++;
+      abbrIndex++;
+      continue;
+    }
+
+    if (abbr[abbrIndex] < '0' || abbr[abbrIndex] > '9') return false;
+    if (abbr[abbrIndex] === '0') return false;
+
+    let num = 0;
+    while (abbrIndex < abbr.length && /[0-9]/.test(abbr[abbrIndex])) {
+      num = num * 10 + Number(abbr[abbrIndex]);
+      abbrIndex++;
+    }
+    wordIndex += num;
+  }
+
+  return wordIndex === word.length && abbrIndex === abbr.length;
+};

From a58fa8f88bd79c0e6212b13389fcf9cb23fd7fc5 Mon Sep 17 00:00:00 2001
From: Josh Crozier <5490537+JoshCrozier@users.noreply.github.com>
Date: Sun, 15 Jun 2025 09:29:11 -0500
Subject: [PATCH 571/571] Add solution #411

---
 README.md                                     |  1 +
 .../0411-minimum-unique-word-abbreviation.js  | 97 +++++++++++++++++++
 2 files changed, 98 insertions(+)
 create mode 100644 solutions/0411-minimum-unique-word-abbreviation.js

diff --git a/README.md b/README.md
index 8c4c39ee..21b2efdb 100644
--- a/README.md
+++ b/README.md
@@ -399,6 +399,7 @@
 408|[Valid Word Abbreviation](./solutions/0408-valid-word-abbreviation.js)|Easy|
 409|[Longest Palindrome](./solutions/0409-longest-palindrome.js)|Easy|
 410|[Split Array Largest Sum](./solutions/0410-split-array-largest-sum.js)|Hard|
+411|[Minimum Unique Word Abbreviation](./solutions/0411-minimum-unique-word-abbreviation.js)|Hard|
 412|[Fizz Buzz](./solutions/0412-fizz-buzz.js)|Easy|
 413|[Arithmetic Slices](./solutions/0413-arithmetic-slices.js)|Medium|
 414|[Third Maximum Number](./solutions/0414-third-maximum-number.js)|Easy|
diff --git a/solutions/0411-minimum-unique-word-abbreviation.js b/solutions/0411-minimum-unique-word-abbreviation.js
new file mode 100644
index 00000000..f595afd4
--- /dev/null
+++ b/solutions/0411-minimum-unique-word-abbreviation.js
@@ -0,0 +1,97 @@
+/**
+ * 411. Minimum Unique Word Abbreviation
+ * https://leetcode.com/problems/minimum-unique-word-abbreviation/
+ * Difficulty: Hard
+ *
+ * A string can be abbreviated by replacing any number of non-adjacent substrings with their
+ * lengths. For example, a string such as "substitution" could be abbreviated as (but not
+ * limited to):
+ * - "s10n" ("s ubstitutio n")
+ * - "sub4u4" ("sub stit u tion")
+ * - "12" ("substitution")
+ * - "su3i1u2on" ("su bst i t u ti on")
+ * - "substitution" (no substrings replaced)
+ *
+ * Note that "s55n" ("s ubsti tutio n") is not a valid abbreviation of "substitution" because
+ * the replaced substrings are adjacent.
+ *
+ * The length of an abbreviation is the number of letters that were not replaced plus the
+ * number of substrings that were replaced. For example, the abbreviation "s10n" has a length
+ * of 3 (2 letters + 1 substring) and "su3i1u2on" has a length of 9 (6 letters + 3 substrings).
+ *
+ * Given a target string target and an array of strings dictionary, return an abbreviation
+ * of target with the shortest possible length such that it is not an abbreviation of any
+ * string in dictionary. If there are multiple shortest abbreviations, return any of them.
+ */
+
+/**
+ * @param {string} target
+ * @param {string[]} dictionary
+ * @return {string}
+ */
+var minAbbreviation = function(target, dictionary) {
+  let minLength = target.length;
+  let result = target;
+  const validDict = dictionary.filter(word => word.length === target.length);
+
+  for (let mask = 0; mask < (1 << target.length); mask++) {
+    const abbr = getAbbr(target, mask);
+    if (abbr.length <= minLength) {
+      let isValid = true;
+      for (const word of validDict) {
+        if (conflicts(abbr, word)) {
+          isValid = false;
+          break;
+        }
+      }
+      if (isValid) {
+        if (abbr.length < minLength) {
+          minLength = abbr.length;
+          result = abbr;
+        } else if (abbr.length === minLength && abbr < result) {
+          result = abbr;
+        }
+      }
+    }
+  }
+
+  return result;
+
+  function getAbbr(str, mask) {
+    let abbr = '';
+    let count = 0;
+    for (let i = 0; i < str.length; i++) {
+      if (mask & (1 << i)) {
+        if (count) {
+          abbr += count;
+          count = 0;
+        }
+        abbr += str[i];
+      } else {
+        count++;
+      }
+    }
+    if (count) abbr += count;
+    return abbr;
+  }
+
+  function conflicts(abbr, word) {
+    let i = 0;
+    let j = 0;
+    while (i < abbr.length && j < word.length) {
+      if (i < abbr.length && j < word.length && abbr[i] === word[j]) {
+        i++;
+        j++;
+      } else if (i < abbr.length && /\d/.test(abbr[i])) {
+        let num = 0;
+        while (i < abbr.length && /\d/.test(abbr[i])) {
+          num = num * 10 + Number(abbr[i++]);
+        }
+        j += num;
+      } else {
+        return false;
+      }
+    }
+    return i === abbr.length && j === word.length;
+  }
+};