diff --git a/src/main/kotlin/g3101_3200/s3158_find_the_xor_of_numbers_which_appear_twice/Solution.kt b/src/main/kotlin/g3101_3200/s3158_find_the_xor_of_numbers_which_appear_twice/Solution.kt new file mode 100644 index 00000000..140e2f30 --- /dev/null +++ b/src/main/kotlin/g3101_3200/s3158_find_the_xor_of_numbers_which_appear_twice/Solution.kt @@ -0,0 +1,18 @@ +package g3101_3200.s3158_find_the_xor_of_numbers_which_appear_twice + +// #Easy #Array #Hash_Table #Bit_Manipulation +// #2024_05_30_Time_166_ms_(92.21%)_Space_36.5_MB_(76.62%) + +class Solution { + fun duplicateNumbersXOR(nums: IntArray): Int { + val appeared = BooleanArray(51) + var res = 0 + for (num in nums) { + if (appeared[num]) { + res = res xor num + } + appeared[num] = true + } + return res + } +} diff --git a/src/main/kotlin/g3101_3200/s3158_find_the_xor_of_numbers_which_appear_twice/readme.md b/src/main/kotlin/g3101_3200/s3158_find_the_xor_of_numbers_which_appear_twice/readme.md new file mode 100644 index 00000000..b0354efb --- /dev/null +++ b/src/main/kotlin/g3101_3200/s3158_find_the_xor_of_numbers_which_appear_twice/readme.md @@ -0,0 +1,43 @@ +3158\. Find the XOR of Numbers Which Appear Twice + +Easy + +You are given an array `nums`, where each number in the array appears **either** once or twice. + +Return the bitwise `XOR` of all the numbers that appear twice in the array, or 0 if no number appears twice. + +**Example 1:** + +**Input:** nums = [1,2,1,3] + +**Output:** 1 + +**Explanation:** + +The only number that appears twice in `nums` is 1. + +**Example 2:** + +**Input:** nums = [1,2,3] + +**Output:** 0 + +**Explanation:** + +No number appears twice in `nums`. + +**Example 3:** + +**Input:** nums = [1,2,2,1] + +**Output:** 3 + +**Explanation:** + +Numbers 1 and 2 appeared twice. `1 XOR 2 == 3`. + +**Constraints:** + +* `1 <= nums.length <= 50` +* `1 <= nums[i] <= 50` +* Each number in `nums` appears either once or twice. \ No newline at end of file diff --git a/src/main/kotlin/g3101_3200/s3159_find_occurrences_of_an_element_in_an_array/Solution.kt b/src/main/kotlin/g3101_3200/s3159_find_occurrences_of_an_element_in_an_array/Solution.kt new file mode 100644 index 00000000..0224e71f --- /dev/null +++ b/src/main/kotlin/g3101_3200/s3159_find_occurrences_of_an_element_in_an_array/Solution.kt @@ -0,0 +1,25 @@ +package g3101_3200.s3159_find_occurrences_of_an_element_in_an_array + +// #Medium #Array #Hash_Table #2024_05_30_Time_810_ms_(98.28%)_Space_66.3_MB_(81.03%) + +class Solution { + fun occurrencesOfElement(nums: IntArray, queries: IntArray, x: Int): IntArray { + val a = ArrayList() + run { + var i = 0 + val l = nums.size + while (i < l) { + if (nums[i] == x) { + a.add(i) + } + i++ + } + } + val l = queries.size + val r = IntArray(l) + for (i in 0 until l) { + r[i] = if (queries[i] > a.size) -1 else a[queries[i] - 1] + } + return r + } +} diff --git a/src/main/kotlin/g3101_3200/s3159_find_occurrences_of_an_element_in_an_array/readme.md b/src/main/kotlin/g3101_3200/s3159_find_occurrences_of_an_element_in_an_array/readme.md new file mode 100644 index 00000000..6f36cb2a --- /dev/null +++ b/src/main/kotlin/g3101_3200/s3159_find_occurrences_of_an_element_in_an_array/readme.md @@ -0,0 +1,38 @@ +3159\. Find Occurrences of an Element in an Array + +Medium + +You are given an integer array `nums`, an integer array `queries`, and an integer `x`. + +For each `queries[i]`, you need to find the index of the queries[i]th occurrence of `x` in the `nums` array. If there are fewer than `queries[i]` occurrences of `x`, the answer should be -1 for that query. + +Return an integer array `answer` containing the answers to all queries. + +**Example 1:** + +**Input:** nums = [1,3,1,7], queries = [1,3,2,4], x = 1 + +**Output:** [0,-1,2,-1] + +**Explanation:** + +* For the 1st query, the first occurrence of 1 is at index 0. +* For the 2nd query, there are only two occurrences of 1 in `nums`, so the answer is -1. +* For the 3rd query, the second occurrence of 1 is at index 2. +* For the 4th query, there are only two occurrences of 1 in `nums`, so the answer is -1. + +**Example 2:** + +**Input:** nums = [1,2,3], queries = [10], x = 5 + +**Output:** [-1] + +**Explanation:** + +* For the 1st query, 5 doesn't exist in `nums`, so the answer is -1. + +**Constraints:** + +* 1 <= nums.length, queries.length <= 105 +* 1 <= queries[i] <= 105 +* 1 <= nums[i], x <= 104 \ No newline at end of file diff --git a/src/main/kotlin/g3101_3200/s3160_find_the_number_of_distinct_colors_among_the_balls/Solution.kt b/src/main/kotlin/g3101_3200/s3160_find_the_number_of_distinct_colors_among_the_balls/Solution.kt new file mode 100644 index 00000000..72d0e476 --- /dev/null +++ b/src/main/kotlin/g3101_3200/s3160_find_the_number_of_distinct_colors_among_the_balls/Solution.kt @@ -0,0 +1,30 @@ +package g3101_3200.s3160_find_the_number_of_distinct_colors_among_the_balls + +// #Medium #Array #Hash_Table #Simulation #2024_05_30_Time_1055_ms_(58.82%)_Space_101.1_MB_(86.27%) + +class Solution { + fun queryResults(ignoredLimit: Int, queries: Array): IntArray { + val ballToColor: MutableMap = HashMap() + val colorToCnt: MutableMap = HashMap() + val ret = IntArray(queries.size) + var i = 0 + while (i < queries.size) { + val ball = queries[i][0] + val color = queries[i][1] + if (ballToColor.containsKey(ball)) { + val oldColor = ballToColor[ball]!! + val oldColorCnt = colorToCnt[oldColor]!! + if (oldColorCnt >= 2) { + colorToCnt[oldColor] = oldColorCnt - 1 + } else { + colorToCnt.remove(oldColor) + } + } + ballToColor[ball] = color + colorToCnt[color] = colorToCnt.getOrDefault(color, 0) + 1 + ret[i] = colorToCnt.size + i += 1 + } + return ret + } +} diff --git a/src/main/kotlin/g3101_3200/s3160_find_the_number_of_distinct_colors_among_the_balls/readme.md b/src/main/kotlin/g3101_3200/s3160_find_the_number_of_distinct_colors_among_the_balls/readme.md new file mode 100644 index 00000000..f132574a --- /dev/null +++ b/src/main/kotlin/g3101_3200/s3160_find_the_number_of_distinct_colors_among_the_balls/readme.md @@ -0,0 +1,50 @@ +3160\. Find the Number of Distinct Colors Among the Balls + +Medium + +You are given an integer `limit` and a 2D array `queries` of size `n x 2`. + +There are `limit + 1` balls with **distinct** labels in the range `[0, limit]`. Initially, all balls are uncolored. For every query in `queries` that is of the form `[x, y]`, you mark ball `x` with the color `y`. After each query, you need to find the number of **distinct** colors among the balls. + +Return an array `result` of length `n`, where `result[i]` denotes the number of distinct colors _after_ ith query. + +**Note** that when answering a query, lack of a color _will not_ be considered as a color. + +**Example 1:** + +**Input:** limit = 4, queries = [[1,4],[2,5],[1,3],[3,4]] + +**Output:** [1,2,2,3] + +**Explanation:** + +![](https://assets.leetcode.com/uploads/2024/04/17/ezgifcom-crop.gif) + +* After query 0, ball 1 has color 4. +* After query 1, ball 1 has color 4, and ball 2 has color 5. +* After query 2, ball 1 has color 3, and ball 2 has color 5. +* After query 3, ball 1 has color 3, ball 2 has color 5, and ball 3 has color 4. + +**Example 2:** + +**Input:** limit = 4, queries = [[0,1],[1,2],[2,2],[3,4],[4,5]] + +**Output:** [1,2,2,3,4] + +**Explanation:** + +**![](https://assets.leetcode.com/uploads/2024/04/17/ezgifcom-crop2.gif)** + +* After query 0, ball 0 has color 1. +* After query 1, ball 0 has color 1, and ball 1 has color 2. +* After query 2, ball 0 has color 1, and balls 1 and 2 have color 2. +* After query 3, ball 0 has color 1, balls 1 and 2 have color 2, and ball 3 has color 4. +* After query 4, ball 0 has color 1, balls 1 and 2 have color 2, ball 3 has color 4, and ball 4 has color 5. + +**Constraints:** + +* 1 <= limit <= 109 +* 1 <= n == queries.length <= 105 +* `queries[i].length == 2` +* `0 <= queries[i][0] <= limit` +* 1 <= queries[i][1] <= 109 \ No newline at end of file diff --git a/src/main/kotlin/g3101_3200/s3161_block_placement_queries/Solution.kt b/src/main/kotlin/g3101_3200/s3161_block_placement_queries/Solution.kt new file mode 100644 index 00000000..cc983728 --- /dev/null +++ b/src/main/kotlin/g3101_3200/s3161_block_placement_queries/Solution.kt @@ -0,0 +1,104 @@ +package g3101_3200.s3161_block_placement_queries + +// #Hard #Array #Binary_Search #Segment_Tree #Binary_Indexed_Tree +// #2024_05_30_Time_1701_ms_(100.00%)_Space_174.7_MB_(33.33%) + +import kotlin.math.max + +class Solution { + private class Seg private constructor(private val start: Int, private val end: Int) { + private var min = 0 + private var max = 0 + private var len = 0 + private var obstacle = false + private lateinit var left: Seg + private lateinit var right: Seg + + init { + if (start < end) { + val mid = start + ((end - start) shr 1) + left = Seg(start, mid) + right = Seg(mid + 1, end) + refresh() + } + } + + fun set(i: Int) { + if (i < start || i > end) { + return + } else if (i == start && i == end) { + obstacle = true + max = start + min = max + return + } + left.set(i) + right.set(i) + refresh() + } + + private fun refresh() { + if (left.obstacle) { + min = left.min + if (right.obstacle) { + max = right.max + len = max((right.min - left.max), max(left.len, right.len)) + } else { + max = left.max + len = max(left.len, (right.end - left.max)) + } + obstacle = true + } else if (right.obstacle) { + min = right.min + max = right.max + len = max(right.len, (right.min - left.start)) + obstacle = true + } else { + len = end - start + } + } + + fun max(n: Int, t: IntArray) { + if (end <= n) { + t[0] = max(t[0], len) + if (obstacle) { + t[1] = max + } + return + } + left.max(n, t) + if (!right.obstacle || right.min >= n) { + return + } + t[0] = max(t[0], (right.min - t[1])) + right.max(n, t) + } + + companion object { + fun init(n: Int): Seg { + return Seg(0, n) + } + } + } + + fun getResults(queries: Array): List { + var max = 0 + for (i in queries) { + max = max(max, i[1]) + } + val root = Seg.init(max) + root.set(0) + + val res: MutableList = ArrayList(queries.size) + for (i in queries) { + if (i[0] == 1) { + root.set(i[1]) + } else { + val t = IntArray(2) + root.max(i[1], t) + res.add(max(t[0], (i[1] - t[1])) >= i[2]) + } + } + return res + } +} diff --git a/src/main/kotlin/g3101_3200/s3161_block_placement_queries/readme.md b/src/main/kotlin/g3101_3200/s3161_block_placement_queries/readme.md new file mode 100644 index 00000000..6775e99d --- /dev/null +++ b/src/main/kotlin/g3101_3200/s3161_block_placement_queries/readme.md @@ -0,0 +1,46 @@ +3161\. Block Placement Queries + +Hard + +There exists an infinite number line, with its origin at 0 and extending towards the **positive** x-axis. + +You are given a 2D array `queries`, which contains two types of queries: + +1. For a query of type 1, `queries[i] = [1, x]`. Build an obstacle at distance `x` from the origin. It is guaranteed that there is **no** obstacle at distance `x` when the query is asked. +2. For a query of type 2, `queries[i] = [2, x, sz]`. Check if it is possible to place a block of size `sz` _anywhere_ in the range `[0, x]` on the line, such that the block **entirely** lies in the range `[0, x]`. A block **cannot** be placed if it intersects with any obstacle, but it may touch it. Note that you do **not** actually place the block. Queries are separate. + +Return a boolean array `results`, where `results[i]` is `true` if you can place the block specified in the ith query of type 2, and `false` otherwise. + +**Example 1:** + +**Input:** queries = [[1,2],[2,3,3],[2,3,1],[2,2,2]] + +**Output:** [false,true,true] + +**Explanation:** + +**![](https://assets.leetcode.com/uploads/2024/04/22/example0block.png)** + +For query 0, place an obstacle at `x = 2`. A block of size at most 2 can be placed before `x = 3`. + +**Example 2:** + +**Input:** queries = [[1,7],[2,7,6],[1,2],[2,7,5],[2,7,6]] + +**Output:** [true,true,false] + +**Explanation:** + +**![](https://assets.leetcode.com/uploads/2024/04/22/example1block.png)** + +* Place an obstacle at `x = 7` for query 0. A block of size at most 7 can be placed before `x = 7`. +* Place an obstacle at `x = 2` for query 2. Now, a block of size at most 5 can be placed before `x = 7`, and a block of size at most 2 before `x = 2`. + +**Constraints:** + +* 1 <= queries.length <= 15 * 104 +* `2 <= queries[i].length <= 3` +* `1 <= queries[i][0] <= 2` +* 1 <= x, sz <= min(5 * 104, 3 * queries.length) +* The input is generated such that for queries of type 1, no obstacle exists at distance `x` when the query is asked. +* The input is generated such that there is at least one query of type 2. \ No newline at end of file diff --git a/src/main/kotlin/g3101_3200/s3162_find_the_number_of_good_pairs_i/Solution.kt b/src/main/kotlin/g3101_3200/s3162_find_the_number_of_good_pairs_i/Solution.kt new file mode 100644 index 00000000..9a22b65f --- /dev/null +++ b/src/main/kotlin/g3101_3200/s3162_find_the_number_of_good_pairs_i/Solution.kt @@ -0,0 +1,17 @@ +package g3101_3200.s3162_find_the_number_of_good_pairs_i + +// #Easy #Array #Hash_Table #2024_05_30_Time_182_ms_(54.41%)_Space_36.1_MB_(94.12%) + +class Solution { + fun numberOfPairs(nums1: IntArray, nums2: IntArray, k: Int): Int { + var count = 0 + for (j in nums1) { + for (value in nums2) { + if (j % (value * k) == 0) { + count++ + } + } + } + return count + } +} diff --git a/src/main/kotlin/g3101_3200/s3162_find_the_number_of_good_pairs_i/readme.md b/src/main/kotlin/g3101_3200/s3162_find_the_number_of_good_pairs_i/readme.md new file mode 100644 index 00000000..57827a23 --- /dev/null +++ b/src/main/kotlin/g3101_3200/s3162_find_the_number_of_good_pairs_i/readme.md @@ -0,0 +1,35 @@ +3162\. Find the Number of Good Pairs I + +Easy + +You are given 2 integer arrays `nums1` and `nums2` of lengths `n` and `m` respectively. You are also given a **positive** integer `k`. + +A pair `(i, j)` is called **good** if `nums1[i]` is divisible by `nums2[j] * k` (`0 <= i <= n - 1`, `0 <= j <= m - 1`). + +Return the total number of **good** pairs. + +**Example 1:** + +**Input:** nums1 = [1,3,4], nums2 = [1,3,4], k = 1 + +**Output:** 5 + +**Explanation:** + +The 5 good pairs are `(0, 0)`, `(1, 0)`, `(1, 1)`, `(2, 0)`, and `(2, 2)`. + +**Example 2:** + +**Input:** nums1 = [1,2,4,12], nums2 = [2,4], k = 3 + +**Output:** 2 + +**Explanation:** + +The 2 good pairs are `(3, 0)` and `(3, 1)`. + +**Constraints:** + +* `1 <= n, m <= 50` +* `1 <= nums1[i], nums2[j] <= 50` +* `1 <= k <= 50` \ No newline at end of file diff --git a/src/test/kotlin/g3101_3200/s3158_find_the_xor_of_numbers_which_appear_twice/SolutionTest.kt b/src/test/kotlin/g3101_3200/s3158_find_the_xor_of_numbers_which_appear_twice/SolutionTest.kt new file mode 100644 index 00000000..853faa21 --- /dev/null +++ b/src/test/kotlin/g3101_3200/s3158_find_the_xor_of_numbers_which_appear_twice/SolutionTest.kt @@ -0,0 +1,22 @@ +package g3101_3200.s3158_find_the_xor_of_numbers_which_appear_twice + +import org.hamcrest.CoreMatchers.equalTo +import org.hamcrest.MatcherAssert.assertThat +import org.junit.jupiter.api.Test + +internal class SolutionTest { + @Test + fun duplicateNumbersXOR() { + assertThat(Solution().duplicateNumbersXOR(intArrayOf(1, 2, 1, 3)), equalTo(1)) + } + + @Test + fun duplicateNumbersXOR2() { + assertThat(Solution().duplicateNumbersXOR(intArrayOf(1, 2, 3)), equalTo(0)) + } + + @Test + fun duplicateNumbersXOR3() { + assertThat(Solution().duplicateNumbersXOR(intArrayOf(1, 2, 2, 1)), equalTo(3)) + } +} diff --git a/src/test/kotlin/g3101_3200/s3159_find_occurrences_of_an_element_in_an_array/SolutionTest.kt b/src/test/kotlin/g3101_3200/s3159_find_occurrences_of_an_element_in_an_array/SolutionTest.kt new file mode 100644 index 00000000..99be433f --- /dev/null +++ b/src/test/kotlin/g3101_3200/s3159_find_occurrences_of_an_element_in_an_array/SolutionTest.kt @@ -0,0 +1,24 @@ +package g3101_3200.s3159_find_occurrences_of_an_element_in_an_array + +import org.hamcrest.CoreMatchers.equalTo +import org.hamcrest.MatcherAssert.assertThat +import org.junit.jupiter.api.Test + +internal class SolutionTest { + @Test + fun occurrencesOfElement() { + assertThat( + Solution() + .occurrencesOfElement(intArrayOf(1, 3, 1, 7), intArrayOf(1, 3, 2, 4), 1), + equalTo(intArrayOf(0, -1, 2, -1)) + ) + } + + @Test + fun occurrencesOfElement2() { + assertThat( + Solution().occurrencesOfElement(intArrayOf(1, 2, 3), intArrayOf(10), 5), + equalTo(intArrayOf(-1)) + ) + } +} diff --git a/src/test/kotlin/g3101_3200/s3160_find_the_number_of_distinct_colors_among_the_balls/SolutionTest.kt b/src/test/kotlin/g3101_3200/s3160_find_the_number_of_distinct_colors_among_the_balls/SolutionTest.kt new file mode 100644 index 00000000..98c4ad58 --- /dev/null +++ b/src/test/kotlin/g3101_3200/s3160_find_the_number_of_distinct_colors_among_the_balls/SolutionTest.kt @@ -0,0 +1,39 @@ +package g3101_3200.s3160_find_the_number_of_distinct_colors_among_the_balls + +import org.hamcrest.CoreMatchers.equalTo +import org.hamcrest.MatcherAssert.assertThat +import org.junit.jupiter.api.Test + +internal class SolutionTest { + @Test + fun queryResults() { + assertThat( + Solution().queryResults(4, arrayOf(intArrayOf(1, 4), intArrayOf(2, 5), intArrayOf(1, 3), intArrayOf(3, 4))), + equalTo(intArrayOf(1, 2, 2, 3)) + ) + } + + @Test + fun queryResults2() { + assertThat( + Solution() + .queryResults( + 4, + arrayOf(intArrayOf(0, 1), intArrayOf(1, 2), intArrayOf(2, 2), intArrayOf(3, 4), intArrayOf(4, 5)) + ), + equalTo(intArrayOf(1, 2, 2, 3, 4)) + ) + } + + @Test + fun queryResults3() { + assertThat( + Solution() + .queryResults( + 1, + arrayOf(intArrayOf(0, 2), intArrayOf(1, 10), intArrayOf(0, 10), intArrayOf(0, 3), intArrayOf(1, 5)) + ), + equalTo(intArrayOf(1, 2, 1, 2, 2)) + ) + } +} diff --git a/src/test/kotlin/g3101_3200/s3161_block_placement_queries/SolutionTest.kt b/src/test/kotlin/g3101_3200/s3161_block_placement_queries/SolutionTest.kt new file mode 100644 index 00000000..0212259e --- /dev/null +++ b/src/test/kotlin/g3101_3200/s3161_block_placement_queries/SolutionTest.kt @@ -0,0 +1,56 @@ +package g3101_3200.s3161_block_placement_queries + +import org.hamcrest.CoreMatchers.equalTo +import org.hamcrest.MatcherAssert.assertThat +import org.junit.jupiter.api.Test + +internal class SolutionTest { + @Test + fun results() { + assertThat( + Solution().getResults( + arrayOf( + intArrayOf(1, 2), + intArrayOf(2, 3, 3), + intArrayOf(2, 3, 1), + intArrayOf(2, 2, 2) + ) + ), + equalTo(listOf(false, true, true)) + ) + } + + @Test + fun results2() { + assertThat( + Solution() + .getResults( + arrayOf( + intArrayOf(1, 7), + intArrayOf(2, 7, 6), + intArrayOf(1, 2), + intArrayOf(2, 7, 5), + intArrayOf(2, 7, 6) + ) + ), + equalTo(listOf(true, true, false)) + ) + } + + @Test + fun results3() { + assertThat( + Solution() + .getResults( + arrayOf( + intArrayOf(1, 4), + intArrayOf(1, 9), + intArrayOf(2, 15, 4), + intArrayOf(2, 11, 6), + intArrayOf(2, 13, 10) + ) + ), + equalTo(listOf(true, false, false)) + ) + } +} diff --git a/src/test/kotlin/g3101_3200/s3162_find_the_number_of_good_pairs_i/SolutionTest.kt b/src/test/kotlin/g3101_3200/s3162_find_the_number_of_good_pairs_i/SolutionTest.kt new file mode 100644 index 00000000..49421f75 --- /dev/null +++ b/src/test/kotlin/g3101_3200/s3162_find_the_number_of_good_pairs_i/SolutionTest.kt @@ -0,0 +1,23 @@ +package g3101_3200.s3162_find_the_number_of_good_pairs_i + +import org.hamcrest.CoreMatchers.equalTo +import org.hamcrest.MatcherAssert.assertThat +import org.junit.jupiter.api.Test + +internal class SolutionTest { + @Test + fun numberOfPairs() { + assertThat( + Solution().numberOfPairs(intArrayOf(1, 3, 4), intArrayOf(1, 3, 4), 1), + equalTo(5) + ) + } + + @Test + fun numberOfPairs2() { + assertThat( + Solution().numberOfPairs(intArrayOf(1, 2, 4, 12), intArrayOf(2, 4), 3), + equalTo(2) + ) + } +}