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, anddenotes 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; + } +};