diff --git a/src/main/java/g3101_3200/s3110_score_of_a_string/Solution.java b/src/main/java/g3101_3200/s3110_score_of_a_string/Solution.java new file mode 100644 index 000000000..04775b42e --- /dev/null +++ b/src/main/java/g3101_3200/s3110_score_of_a_string/Solution.java @@ -0,0 +1,13 @@ +package g3101_3200.s3110_score_of_a_string; + +// #Easy #String #2024_04_27_Time_1_ms_(99.93%)_Space_41.4_MB_(99.03%) + +public class Solution { + public int scoreOfString(String s) { + int sum = 0; + for (int i = 0; i < s.length() - 1; i++) { + sum += Math.abs((s.charAt(i) - '0') - (s.charAt(i + 1) - '0')); + } + return sum; + } +} diff --git a/src/main/java/g3101_3200/s3110_score_of_a_string/readme.md b/src/main/java/g3101_3200/s3110_score_of_a_string/readme.md new file mode 100644 index 000000000..1ad4aa7bc --- /dev/null +++ b/src/main/java/g3101_3200/s3110_score_of_a_string/readme.md @@ -0,0 +1,32 @@ +3110\. Score of a String + +Easy + +You are given a string `s`. The **score** of a string is defined as the sum of the absolute difference between the **ASCII** values of adjacent characters. + +Return the **score** of `s`. + +**Example 1:** + +**Input:** s = "hello" + +**Output:** 13 + +**Explanation:** + +The **ASCII** values of the characters in `s` are: `'h' = 104`, `'e' = 101`, `'l' = 108`, `'o' = 111`. So, the score of `s` would be `|104 - 101| + |101 - 108| + |108 - 108| + |108 - 111| = 3 + 7 + 0 + 3 = 13`. + +**Example 2:** + +**Input:** s = "zaz" + +**Output:** 50 + +**Explanation:** + +The **ASCII** values of the characters in `s` are: `'z' = 122`, `'a' = 97`. So, the score of `s` would be `|122 - 97| + |97 - 122| = 25 + 25 = 50`. + +**Constraints:** + +* `2 <= s.length <= 100` +* `s` consists only of lowercase English letters. \ No newline at end of file diff --git a/src/main/java/g3101_3200/s3111_minimum_rectangles_to_cover_points/Solution.java b/src/main/java/g3101_3200/s3111_minimum_rectangles_to_cover_points/Solution.java new file mode 100644 index 000000000..1b032f15a --- /dev/null +++ b/src/main/java/g3101_3200/s3111_minimum_rectangles_to_cover_points/Solution.java @@ -0,0 +1,20 @@ +package g3101_3200.s3111_minimum_rectangles_to_cover_points; + +// #Medium #Array #Sorting #Greedy #2024_04_27_Time_4_ms_(99.55%)_Space_97.4_MB_(47.05%) + +import java.util.Arrays; + +public class Solution { + public int minRectanglesToCoverPoints(int[][] points, int w) { + Arrays.sort(points, (a, b) -> a[0] - b[0]); + int res = 0; + int last = -1; + for (int[] a : points) { + if (a[0] > last) { + res++; + last = a[0] + w; + } + } + return res; + } +} diff --git a/src/main/java/g3101_3200/s3111_minimum_rectangles_to_cover_points/readme.md b/src/main/java/g3101_3200/s3111_minimum_rectangles_to_cover_points/readme.md new file mode 100644 index 000000000..3c48afd3b --- /dev/null +++ b/src/main/java/g3101_3200/s3111_minimum_rectangles_to_cover_points/readme.md @@ -0,0 +1,68 @@ +3111\. Minimum Rectangles to Cover Points + +Medium + +You are given a 2D integer array `points`, where points[i] = [xi, yi]. You are also given an integer `w`. Your task is to **cover** **all** the given points with rectangles. + +Each rectangle has its lower end at some point (x1, 0) and its upper end at some point (x2, y2), where x1 <= x2, y2 >= 0, and the condition x2 - x1 <= w **must** be satisfied for each rectangle. + +A point is considered covered by a rectangle if it lies within or on the boundary of the rectangle. + +Return an integer denoting the **minimum** number of rectangles needed so that each point is covered by **at least one** rectangle_._ + +**Note:** A point may be covered by more than one rectangle. + +**Example 1:** + +![](https://assets.leetcode.com/uploads/2024/03/04/screenshot-from-2024-03-04-20-33-05.png) + +**Input:** points = [[2,1],[1,0],[1,4],[1,8],[3,5],[4,6]], w = 1 + +**Output:** 2 + +**Explanation:** + +The image above shows one possible placement of rectangles to cover the points: + +* A rectangle with a lower end at `(1, 0)` and its upper end at `(2, 8)` +* A rectangle with a lower end at `(3, 0)` and its upper end at `(4, 8)` + +**Example 2:** + +![](https://assets.leetcode.com/uploads/2024/03/04/screenshot-from-2024-03-04-18-59-12.png) + +**Input:** points = [[0,0],[1,1],[2,2],[3,3],[4,4],[5,5],[6,6]], w = 2 + +**Output:** 3 + +**Explanation:** + +The image above shows one possible placement of rectangles to cover the points: + +* A rectangle with a lower end at `(0, 0)` and its upper end at `(2, 2)` +* A rectangle with a lower end at `(3, 0)` and its upper end at `(5, 5)` +* A rectangle with a lower end at `(6, 0)` and its upper end at `(6, 6)` + +**Example 3:** + +![](https://assets.leetcode.com/uploads/2024/03/04/screenshot-from-2024-03-04-20-24-03.png) + +**Input:** points = [[2,3],[1,2]], w = 0 + +**Output:** 2 + +**Explanation:** + +The image above shows one possible placement of rectangles to cover the points: + +* A rectangle with a lower end at `(1, 0)` and its upper end at `(1, 2)` +* A rectangle with a lower end at `(2, 0)` and its upper end at `(2, 3)` + +**Constraints:** + +* 1 <= points.length <= 105 +* `points[i].length == 2` +* 0 <= xi == points[i][0] <= 109 +* 0 <= yi == points[i][1] <= 109 +* 0 <= w <= 109 +* All pairs (xi, yi) are distinct. \ No newline at end of file diff --git a/src/main/java/g3101_3200/s3112_minimum_time_to_visit_disappearing_nodes/Solution.java b/src/main/java/g3101_3200/s3112_minimum_time_to_visit_disappearing_nodes/Solution.java new file mode 100644 index 000000000..2d4048e8f --- /dev/null +++ b/src/main/java/g3101_3200/s3112_minimum_time_to_visit_disappearing_nodes/Solution.java @@ -0,0 +1,47 @@ +package g3101_3200.s3112_minimum_time_to_visit_disappearing_nodes; + +// #Medium #Array #Heap_Priority_Queue #Graph #Shortest_Path +// #2024_04_27_Time_10_ms_(100.00%)_Space_85.4_MB_(99.80%) + +import java.util.Arrays; + +public class Solution { + public int[] minimumTime(int n, int[][] edges, int[] disappear) { + int[] dist = new int[n]; + Arrays.fill(dist, Integer.MAX_VALUE); + boolean exit = false; + int i; + int src; + int dest; + int cost; + dist[0] = 0; + for (i = 0; i < n && !exit; ++i) { + exit = true; + for (int[] edge : edges) { + src = edge[0]; + dest = edge[1]; + cost = edge[2]; + if (dist[src] != -1 + && dist[src] != Integer.MAX_VALUE + && dist[src] < disappear[src] + && dist[src] + cost < dist[dest]) { + exit = false; + dist[dest] = dist[src] + cost; + } + if (dist[dest] != -1 + && dist[dest] != Integer.MAX_VALUE + && dist[dest] < disappear[dest] + && dist[dest] + cost < dist[src]) { + exit = false; + dist[src] = dist[dest] + cost; + } + } + } + for (i = 0; i < dist.length; ++i) { + if (dist[i] == Integer.MAX_VALUE || dist[i] >= disappear[i]) { + dist[i] = -1; + } + } + return dist; + } +} diff --git a/src/main/java/g3101_3200/s3112_minimum_time_to_visit_disappearing_nodes/readme.md b/src/main/java/g3101_3200/s3112_minimum_time_to_visit_disappearing_nodes/readme.md new file mode 100644 index 000000000..7f330dc2e --- /dev/null +++ b/src/main/java/g3101_3200/s3112_minimum_time_to_visit_disappearing_nodes/readme.md @@ -0,0 +1,63 @@ +3112\. Minimum Time to Visit Disappearing Nodes + +Medium + +There is an undirected graph of `n` nodes. You are given a 2D array `edges`, where edges[i] = [ui, vi, lengthi] describes an edge between node ui and node vi with a traversal time of lengthi units. + +Additionally, you are given an array `disappear`, where `disappear[i]` denotes the time when the node `i` disappears from the graph and you won't be able to visit it. + +**Notice** that the graph might be disconnected and might contain multiple edges. + +Return the array `answer`, with `answer[i]` denoting the **minimum** units of time required to reach node `i` from node 0. If node `i` is **unreachable** from node 0 then `answer[i]` is `-1`. + +**Example 1:** + +![](https://assets.leetcode.com/uploads/2024/03/09/example1.png) + +**Input:** n = 3, edges = [[0,1,2],[1,2,1],[0,2,4]], disappear = [1,1,5] + +**Output:** [0,-1,4] + +**Explanation:** + +We are starting our journey from node 0, and our goal is to find the minimum time required to reach each node before it disappears. + +* For node 0, we don't need any time as it is our starting point. +* For node 1, we need at least 2 units of time to traverse `edges[0]`. Unfortunately, it disappears at that moment, so we won't be able to visit it. +* For node 2, we need at least 4 units of time to traverse `edges[2]`. + +**Example 2:** + +![](https://assets.leetcode.com/uploads/2024/03/09/example2.png) + +**Input:** n = 3, edges = [[0,1,2],[1,2,1],[0,2,4]], disappear = [1,3,5] + +**Output:** [0,2,3] + +**Explanation:** + +We are starting our journey from node 0, and our goal is to find the minimum time required to reach each node before it disappears. + +* For node 0, we don't need any time as it is the starting point. +* For node 1, we need at least 2 units of time to traverse `edges[0]`. +* For node 2, we need at least 3 units of time to traverse `edges[0]` and `edges[1]`. + +**Example 3:** + +**Input:** n = 2, edges = [[0,1,1]], disappear = [1,1] + +**Output:** [0,-1] + +**Explanation:** + +Exactly when we reach node 1, it disappears. + +**Constraints:** + +* 1 <= n <= 5 * 104 +* 0 <= edges.length <= 105 +* edges[i] == [ui, vi, lengthi] +* 0 <= ui, vi <= n - 1 +* 1 <= lengthi <= 105 +* `disappear.length == n` +* 1 <= disappear[i] <= 105 \ No newline at end of file diff --git a/src/main/java/g3101_3200/s3113_find_the_number_of_subarrays_where_boundary_elements_are_maximum/Solution.java b/src/main/java/g3101_3200/s3113_find_the_number_of_subarrays_where_boundary_elements_are_maximum/Solution.java new file mode 100644 index 000000000..b69f93cfe --- /dev/null +++ b/src/main/java/g3101_3200/s3113_find_the_number_of_subarrays_where_boundary_elements_are_maximum/Solution.java @@ -0,0 +1,23 @@ +package g3101_3200.s3113_find_the_number_of_subarrays_where_boundary_elements_are_maximum; + +// #Hard #Array #Binary_Search #Stack #Monotonic_Stack +// #2024_04_27_Time_13_ms_(98.83%)_Space_60.4_MB_(67.66%) + +import java.util.ArrayDeque; + +public class Solution { + public long numberOfSubarrays(int[] nums) { + ArrayDeque stack = new ArrayDeque<>(); + long res = 0; + for (int a : nums) { + while (!stack.isEmpty() && stack.peek()[0] < a) { + stack.pop(); + } + if (stack.isEmpty() || stack.peek()[0] != a) { + stack.push(new int[] {a, 0}); + } + res += ++stack.peek()[1]; + } + return res; + } +} diff --git a/src/main/java/g3101_3200/s3113_find_the_number_of_subarrays_where_boundary_elements_are_maximum/readme.md b/src/main/java/g3101_3200/s3113_find_the_number_of_subarrays_where_boundary_elements_are_maximum/readme.md new file mode 100644 index 000000000..7cff5a6ef --- /dev/null +++ b/src/main/java/g3101_3200/s3113_find_the_number_of_subarrays_where_boundary_elements_are_maximum/readme.md @@ -0,0 +1,62 @@ +3113\. Find the Number of Subarrays Where Boundary Elements Are Maximum + +Hard + +You are given an array of **positive** integers `nums`. + +Return the number of subarrays of `nums`, where the **first** and the **last** elements of the subarray are _equal_ to the **largest** element in the subarray. + +**Example 1:** + +**Input:** nums = [1,4,3,3,2] + +**Output:** 6 + +**Explanation:** + +There are 6 subarrays which have the first and the last elements equal to the largest element of the subarray: + +* subarray [**1**,4,3,3,2], with its largest element 1. The first element is 1 and the last element is also 1. +* subarray [1,**4**,3,3,2], with its largest element 4. The first element is 4 and the last element is also 4. +* subarray [1,4,**3**,3,2], with its largest element 3. The first element is 3 and the last element is also 3. +* subarray [1,4,3,**3**,2], with its largest element 3. The first element is 3 and the last element is also 3. +* subarray [1,4,3,3,**2**], with its largest element 2. The first element is 2 and the last element is also 2. +* subarray [1,4,**3,3**,2], with its largest element 3. The first element is 3 and the last element is also 3. + +Hence, we return 6. + +**Example 2:** + +**Input:** nums = [3,3,3] + +**Output:** 6 + +**Explanation:** + +There are 6 subarrays which have the first and the last elements equal to the largest element of the subarray: + +* subarray [**3**,3,3], with its largest element 3. The first element is 3 and the last element is also 3. +* subarray [3,**3**,3], with its largest element 3. The first element is 3 and the last element is also 3. +* subarray [3,3,**3**], with its largest element 3. The first element is 3 and the last element is also 3. +* subarray [**3,3**,3], with its largest element 3. The first element is 3 and the last element is also 3. +* subarray [3,**3,3**], with its largest element 3. The first element is 3 and the last element is also 3. +* subarray [**3,3,3**], with its largest element 3. The first element is 3 and the last element is also 3. + +Hence, we return 6. + +**Example 3:** + +**Input:** nums = [1] + +**Output:** 1 + +**Explanation:** + +There is a single subarray of `nums` which is [**1**], with its largest element 1. The first element is 1 and the last element is also 1. + +Hence, we return 1. + +**Constraints:** + +* 1 <= nums.length <= 105 +* 1 <= nums[i] <= 109 \ No newline at end of file diff --git a/src/main/java/g3101_3200/s3114_latest_time_you_can_obtain_after_replacing_characters/Solution.java b/src/main/java/g3101_3200/s3114_latest_time_you_can_obtain_after_replacing_characters/Solution.java new file mode 100644 index 000000000..7ce927d28 --- /dev/null +++ b/src/main/java/g3101_3200/s3114_latest_time_you_can_obtain_after_replacing_characters/Solution.java @@ -0,0 +1,43 @@ +package g3101_3200.s3114_latest_time_you_can_obtain_after_replacing_characters; + +// #Easy #String #Enumeration #2024_04_27_Time_1_ms_(100.00%)_Space_42.5_MB_(85.42%) + +public class Solution { + public String findLatestTime(String s) { + StringBuilder nm = new StringBuilder(); + if (s.charAt(0) == '?' && s.charAt(1) == '?') { + nm.append("11"); + } else if (s.charAt(0) != '?' && s.charAt(1) == '?') { + nm.append(s.charAt(0)); + if (s.charAt(0) == '1') { + nm.append("1"); + } else { + nm.append("9"); + } + } else if (s.charAt(0) == '?' && s.charAt(1) != '?') { + if (s.charAt(1) >= '2' && s.charAt(1) <= '9') { + nm.append("0"); + } else { + nm.append("1"); + } + nm.append(s.charAt(1)); + } else { + nm.append(s.charAt(0)); + nm.append(s.charAt(1)); + } + nm.append(":"); + if (s.charAt(3) == '?' && s.charAt(4) == '?') { + nm.append("59"); + } else if (s.charAt(3) != '?' && s.charAt(4) == '?') { + nm.append(s.charAt(3)); + nm.append("9"); + } else if (s.charAt(3) == '?' && s.charAt(4) != '?') { + nm.append("5"); + nm.append(s.charAt(4)); + } else { + nm.append(s.charAt(3)); + nm.append(s.charAt(4)); + } + return nm.toString(); + } +} diff --git a/src/main/java/g3101_3200/s3114_latest_time_you_can_obtain_after_replacing_characters/readme.md b/src/main/java/g3101_3200/s3114_latest_time_you_can_obtain_after_replacing_characters/readme.md new file mode 100644 index 000000000..fb955d8c1 --- /dev/null +++ b/src/main/java/g3101_3200/s3114_latest_time_you_can_obtain_after_replacing_characters/readme.md @@ -0,0 +1,34 @@ +3114\. Latest Time You Can Obtain After Replacing Characters + +Easy + +You are given a string `s` representing a 12-hour format time where some of the digits (possibly none) are replaced with a `"?"`. + +12-hour times are formatted as `"HH:MM"`, where `HH` is between `00` and `11`, and `MM` is between `00` and `59`. The earliest 12-hour time is `00:00`, and the latest is `11:59`. + +You have to replace **all** the `"?"` characters in `s` with digits such that the time we obtain by the resulting string is a **valid** 12-hour format time and is the **latest** possible. + +Return _the resulting string_. + +**Example 1:** + +**Input:** s = "1?:?4" + +**Output:** "11:54" + +**Explanation:** The latest 12-hour format time we can achieve by replacing `"?"` characters is `"11:54"`. + +**Example 2:** + +**Input:** s = "0?:5?" + +**Output:** "09:59" + +**Explanation:** The latest 12-hour format time we can achieve by replacing `"?"` characters is `"09:59"`. + +**Constraints:** + +* `s.length == 5` +* `s[2]` is equal to the character `":"`. +* All characters except `s[2]` are digits or `"?"` characters. +* The input is generated such that there is **at least** one time between `"00:00"` and `"11:59"` that you can obtain after replacing the `"?"` characters. \ No newline at end of file diff --git a/src/main/java/g3101_3200/s3115_maximum_prime_difference/Solution.java b/src/main/java/g3101_3200/s3115_maximum_prime_difference/Solution.java new file mode 100644 index 000000000..1623e6361 --- /dev/null +++ b/src/main/java/g3101_3200/s3115_maximum_prime_difference/Solution.java @@ -0,0 +1,30 @@ +package g3101_3200.s3115_maximum_prime_difference; + +// #Medium #Array #Math #Number_Theory #2024_04_27_Time_1_ms_(99.91%)_Space_79.5_MB_(32.00%) + +public class Solution { + public int maximumPrimeDifference(int[] nums) { + int n = nums.length; + int i = 0; + while (i < n && check(nums[i])) { + i++; + } + int j = n - 1; + while (j >= 0 && check(nums[j])) { + j--; + } + return j - i; + } + + private boolean check(int n) { + if (n < 2) { + return true; + } + for (int i = 2; i <= Math.sqrt(n); i++) { + if (n % i == 0) { + return true; + } + } + return false; + } +} diff --git a/src/main/java/g3101_3200/s3115_maximum_prime_difference/readme.md b/src/main/java/g3101_3200/s3115_maximum_prime_difference/readme.md new file mode 100644 index 000000000..6ddebcacd --- /dev/null +++ b/src/main/java/g3101_3200/s3115_maximum_prime_difference/readme.md @@ -0,0 +1,29 @@ +3115\. Maximum Prime Difference + +Medium + +You are given an integer array `nums`. + +Return an integer that is the **maximum** distance between the **indices** of two (not necessarily different) prime numbers in `nums`_._ + +**Example 1:** + +**Input:** nums = [4,2,9,5,3] + +**Output:** 3 + +**Explanation:** `nums[1]`, `nums[3]`, and `nums[4]` are prime. So the answer is `|4 - 1| = 3`. + +**Example 2:** + +**Input:** nums = [4,8,2,8] + +**Output:** 0 + +**Explanation:** `nums[2]` is prime. Because there is just one prime number, the answer is `|2 - 2| = 0`. + +**Constraints:** + +* 1 <= nums.length <= 3 * 105 +* `1 <= nums[i] <= 100` +* The input is generated such that the number of prime numbers in the `nums` is at least one. \ No newline at end of file diff --git a/src/main/java/g3101_3200/s3116_kth_smallest_amount_with_single_denomination_combination/Solution.java b/src/main/java/g3101_3200/s3116_kth_smallest_amount_with_single_denomination_combination/Solution.java new file mode 100644 index 000000000..36aa08920 --- /dev/null +++ b/src/main/java/g3101_3200/s3116_kth_smallest_amount_with_single_denomination_combination/Solution.java @@ -0,0 +1,71 @@ +package g3101_3200.s3116_kth_smallest_amount_with_single_denomination_combination; + +// #Hard #Array #Math #Binary_Search #Bit_Manipulation #Number_Theory #Combinatorics +// #2024_04_27_Time_2_ms_(100.00%)_Space_41.4_MB_(72.21%) + +import java.util.Arrays; + +@SuppressWarnings("java:S1119") +public class Solution { + public long findKthSmallest(int[] coins, int k) { + int minC = Integer.MAX_VALUE; + for (int c : coins) { + minC = Math.min(minC, c); + } + long[] cc = coins(coins); + long max = (long) minC * k; + long min = max / coins.length; + while (min < max) { + long mid = (min + max) / 2; + final long cnt = count(cc, mid); + if (cnt > k) { + max = mid - 1; + } else if (cnt < k) { + min = mid + 1; + } else { + max = mid; + } + } + return min; + } + + private long count(long[] coins, long v) { + long r = 0; + for (long c : coins) { + r += v / c; + } + return r; + } + + private long[] coins(int[] coins) { + Arrays.sort(coins); + int len = 1; + a: + for (int i = 1; i < coins.length; i++) { + final int c = coins[i]; + for (int j = 0; j < len; j++) { + if (c % coins[j] == 0) { + continue a; + } + } + coins[len++] = c; + } + coins = Arrays.copyOf(coins, len); + long[] res = new long[(1 << coins.length) - 1]; + iterate(coins, res, 1, 0, 0, true); + return res; + } + + private int iterate(int[] coins, long[] res, long mult, int start, int idx, boolean positive) { + for (int i = start; i < coins.length; i++) { + long next = mult * coins[i] / gcd(mult, coins[i]); + res[idx++] = positive ? next : -next; + idx = iterate(coins, res, next, i + 1, idx, !positive); + } + return idx; + } + + private long gcd(long a, long b) { + return b == 0 ? a : gcd(b, a % b); + } +} diff --git a/src/main/java/g3101_3200/s3116_kth_smallest_amount_with_single_denomination_combination/readme.md b/src/main/java/g3101_3200/s3116_kth_smallest_amount_with_single_denomination_combination/readme.md new file mode 100644 index 000000000..8d70f8493 --- /dev/null +++ b/src/main/java/g3101_3200/s3116_kth_smallest_amount_with_single_denomination_combination/readme.md @@ -0,0 +1,46 @@ +3116\. Kth Smallest Amount With Single Denomination Combination + +Hard + +You are given an integer array `coins` representing coins of different denominations and an integer `k`. + +You have an infinite number of coins of each denomination. However, you are **not allowed** to combine coins of different denominations. + +Return the kth **smallest** amount that can be made using these coins. + +**Example 1:** + +**Input:** coins = [3,6,9], k = 3 + +**Output:** 9 + +**Explanation:** The given coins can make the following amounts: + + Coin 3 produces multiples of 3: 3, 6, 9, 12, 15, etc. + + Coin 6 produces multiples of 6: 6, 12, 18, 24, etc. + + Coin 9 produces multiples of 9: 9, 18, 27, 36, etc. + + All of the coins combined produce: 3, 6, **9**, 12, 15, etc. + +**Example 2:** + +**Input:** coins = [5,2], k = 7 + +**Output:** 12 + +**Explanation:** The given coins can make the following amounts: + + Coin 5 produces multiples of 5: 5, 10, 15, 20, etc. + + Coin 2 produces multiples of 2: 2, 4, 6, 8, 10, 12, etc. + + All of the coins combined produce: 2, 4, 5, 6, 8, 10, **12**, 14, 15, etc. + +**Constraints:** + +* `1 <= coins.length <= 15` +* `1 <= coins[i] <= 25` +* 1 <= k <= 2 * 109 +* `coins` contains pairwise distinct integers. \ No newline at end of file diff --git a/src/main/java/g3101_3200/s3117_minimum_sum_of_values_by_dividing_array/Solution.java b/src/main/java/g3101_3200/s3117_minimum_sum_of_values_by_dividing_array/Solution.java new file mode 100644 index 000000000..56b9df045 --- /dev/null +++ b/src/main/java/g3101_3200/s3117_minimum_sum_of_values_by_dividing_array/Solution.java @@ -0,0 +1,55 @@ +package g3101_3200.s3117_minimum_sum_of_values_by_dividing_array; + +// #Hard #Array #Dynamic_Programming #Binary_Search #Bit_Manipulation #Queue #Segment_Tree +// #2024_04_27_Time_6_ms_(100.00%)_Space_44.8_MB_(99.04%) + +import java.util.Arrays; + +public class Solution { + private static final int INF = 0xfffffff; + + public int minimumValueSum(int[] nums, int[] andValues) { + int n = nums.length; + int[] dp = new int[n + 1]; + Arrays.fill(dp, INF); + dp[0] = 0; + for (int target : andValues) { + int sum = INF; + int minSum = INF; + int rightSum = INF; + int[] leftSum = new int[n + 1]; + leftSum[0] = INF; + int left = 0; + int right = 0; + int[] nextdp = new int[n + 1]; + nextdp[0] = INF; + for (int i = 0; i < n; ++i) { + sum &= nums[i]; + rightSum &= nums[i]; + ++right; + if (sum < target) { + minSum = INF; + sum = nums[i]; + } + while ((leftSum[left] & rightSum) <= target) { + if ((leftSum[left] & rightSum) == target) { + minSum = Math.min(minSum, dp[i - left - right + 1]); + } + if (left-- > 0) { + continue; + } + left = right; + int start = i; + for (int l = 1; l <= left; ++l) { + leftSum[l] = leftSum[l - 1] & nums[start--]; + } + right = 0; + rightSum = INF; + } + nextdp[i + 1] = minSum + nums[i]; + } + dp = nextdp; + } + return dp[n] < INF ? dp[n] : -1; + } +} diff --git a/src/main/java/g3101_3200/s3117_minimum_sum_of_values_by_dividing_array/readme.md b/src/main/java/g3101_3200/s3117_minimum_sum_of_values_by_dividing_array/readme.md new file mode 100644 index 000000000..0b0b0bec8 --- /dev/null +++ b/src/main/java/g3101_3200/s3117_minimum_sum_of_values_by_dividing_array/readme.md @@ -0,0 +1,61 @@ +3117\. Minimum Sum of Values by Dividing Array + +Hard + +You are given two arrays `nums` and `andValues` of length `n` and `m` respectively. + +The **value** of an array is equal to the **last** element of that array. + +You have to divide `nums` into `m` **disjoint contiguous** subarrays such that for the ith subarray [li, ri], the bitwise `AND` of the subarray elements is equal to `andValues[i]`, in other words, nums[li] & nums[li + 1] & ... & nums[ri] == andValues[i] for all `1 <= i <= m`, where `&` represents the bitwise `AND` operator. + +Return _the **minimum** possible sum of the **values** of the_ `m` _subarrays_ `nums` _is divided into_. _If it is not possible to divide_ `nums` _into_ `m` _subarrays satisfying these conditions, return_ `-1`. + +**Example 1:** + +**Input:** nums = [1,4,3,3,2], andValues = [0,3,3,2] + +**Output:** 12 + +**Explanation:** + +The only possible way to divide `nums` is: + +1. `[1,4]` as `1 & 4 == 0`. +2. `[3]` as the bitwise `AND` of a single element subarray is that element itself. +3. `[3]` as the bitwise `AND` of a single element subarray is that element itself. +4. `[2]` as the bitwise `AND` of a single element subarray is that element itself. + +The sum of the values for these subarrays is `4 + 3 + 3 + 2 = 12`. + +**Example 2:** + +**Input:** nums = [2,3,5,7,7,7,5], andValues = [0,7,5] + +**Output:** 17 + +**Explanation:** + +There are three ways to divide `nums`: + +1. `[[2,3,5],[7,7,7],[5]]` with the sum of the values `5 + 7 + 5 == 17`. +2. `[[2,3,5,7],[7,7],[5]]` with the sum of the values `7 + 7 + 5 == 19`. +3. `[[2,3,5,7,7],[7],[5]]` with the sum of the values `7 + 7 + 5 == 19`. + +The minimum possible sum of the values is `17`. + +**Example 3:** + +**Input:** nums = [1,2,3,4], andValues = [2] + +**Output:** \-1 + +**Explanation:** + +The bitwise `AND` of the entire array `nums` is `0`. As there is no possible way to divide `nums` into a single subarray to have the bitwise `AND` of elements `2`, return `-1`. + +**Constraints:** + +* 1 <= n == nums.length <= 104 +* `1 <= m == andValues.length <= min(n, 10)` +* 1 <= nums[i] < 105 +* 0 <= andValues[j] < 105 \ No newline at end of file diff --git a/src/main/java/g3101_3200/s3120_count_the_number_of_special_characters_i/Solution.java b/src/main/java/g3101_3200/s3120_count_the_number_of_special_characters_i/Solution.java new file mode 100644 index 000000000..3514174b5 --- /dev/null +++ b/src/main/java/g3101_3200/s3120_count_the_number_of_special_characters_i/Solution.java @@ -0,0 +1,24 @@ +package g3101_3200.s3120_count_the_number_of_special_characters_i; + +// #Easy #String #Hash_Table #2024_04_27_Time_1_ms_(100.00%)_Space_41.9_MB_(92.08%) + +public class Solution { + public int numberOfSpecialChars(String word) { + int[] a = new int[26]; + int[] b = new int[26]; + int ans = 0; + for (char c : word.toCharArray()) { + if (c >= 'a' && c <= 'z') { + a[c - 'a']++; + } else { + b[c - 'A']++; + } + } + for (int i = 0; i < 26; i++) { + if (a[i] != 0 && b[i] != 0) { + ans++; + } + } + return ans; + } +} diff --git a/src/main/java/g3101_3200/s3120_count_the_number_of_special_characters_i/readme.md b/src/main/java/g3101_3200/s3120_count_the_number_of_special_characters_i/readme.md new file mode 100644 index 000000000..66a0e8b7e --- /dev/null +++ b/src/main/java/g3101_3200/s3120_count_the_number_of_special_characters_i/readme.md @@ -0,0 +1,42 @@ +3120\. Count the Number of Special Characters I + +Easy + +You are given a string `word`. A letter is called **special** if it appears **both** in lowercase and uppercase in `word`. + +Return the number of **special** letters in `word`. + +**Example 1:** + +**Input:** word = "aaAbcBC" + +**Output:** 3 + +**Explanation:** + +The special characters in `word` are `'a'`, `'b'`, and `'c'`. + +**Example 2:** + +**Input:** word = "abc" + +**Output:** 0 + +**Explanation:** + +No character in `word` appears in uppercase. + +**Example 3:** + +**Input:** word = "abBCab" + +**Output:** 1 + +**Explanation:** + +The only special character in `word` is `'b'`. + +**Constraints:** + +* `1 <= word.length <= 50` +* `word` consists of only lowercase and uppercase English letters. \ No newline at end of file diff --git a/src/main/java/g3101_3200/s3121_count_the_number_of_special_characters_ii/Solution.java b/src/main/java/g3101_3200/s3121_count_the_number_of_special_characters_ii/Solution.java new file mode 100644 index 000000000..5104c264b --- /dev/null +++ b/src/main/java/g3101_3200/s3121_count_the_number_of_special_characters_ii/Solution.java @@ -0,0 +1,29 @@ +package g3101_3200.s3121_count_the_number_of_special_characters_ii; + +// #Medium #String #Hash_Table #2024_04_27_Time_6_ms_(100.00%)_Space_45.2_MB_(97.93%) + +import java.util.Arrays; + +public class Solution { + public int numberOfSpecialChars(String word) { + int[] small = new int[26]; + Arrays.fill(small, -1); + int[] capital = new int[26]; + Arrays.fill(capital, Integer.MAX_VALUE); + int result = 0; + for (int i = 0; i < word.length(); i++) { + char a = word.charAt(i); + if (a < 91) { + capital[a - 65] = Math.min(capital[a - 65], i); + } else { + small[a - 97] = i; + } + } + for (int i = 0; i < 26; i++) { + if (-1 != small[i] && Integer.MAX_VALUE != capital[i] && capital[i] > small[i]) { + result++; + } + } + return result; + } +} diff --git a/src/main/java/g3101_3200/s3121_count_the_number_of_special_characters_ii/readme.md b/src/main/java/g3101_3200/s3121_count_the_number_of_special_characters_ii/readme.md new file mode 100644 index 000000000..4b2ddaba9 --- /dev/null +++ b/src/main/java/g3101_3200/s3121_count_the_number_of_special_characters_ii/readme.md @@ -0,0 +1,42 @@ +3121\. Count the Number of Special Characters II + +Medium + +You are given a string `word`. A letter `c` is called **special** if it appears **both** in lowercase and uppercase in `word`, and **every** lowercase occurrence of `c` appears before the **first** uppercase occurrence of `c`. + +Return the number of **special** letters in `word`. + +**Example 1:** + +**Input:** word = "aaAbcBC" + +**Output:** 3 + +**Explanation:** + +The special characters are `'a'`, `'b'`, and `'c'`. + +**Example 2:** + +**Input:** word = "abc" + +**Output:** 0 + +**Explanation:** + +There are no special characters in `word`. + +**Example 3:** + +**Input:** word = "AbBCab" + +**Output:** 0 + +**Explanation:** + +There are no special characters in `word`. + +**Constraints:** + +* 1 <= word.length <= 2 * 105 +* `word` consists of only lowercase and uppercase English letters. \ No newline at end of file diff --git a/src/main/java/g3101_3200/s3122_minimum_number_of_operations_to_satisfy_conditions/Solution.java b/src/main/java/g3101_3200/s3122_minimum_number_of_operations_to_satisfy_conditions/Solution.java new file mode 100644 index 000000000..08adf8ca1 --- /dev/null +++ b/src/main/java/g3101_3200/s3122_minimum_number_of_operations_to_satisfy_conditions/Solution.java @@ -0,0 +1,64 @@ +package g3101_3200.s3122_minimum_number_of_operations_to_satisfy_conditions; + +// #Medium #Array #Dynamic_Programming #Matrix +// #2024_04_27_Time_6_ms_(100.00%)_Space_156.6_MB_(54.30%) + +public class Solution { + public int minimumOperations(int[][] grid) { + int n = grid.length; + int m = grid[0].length; + int[][] dp = new int[m][10]; + int[][] cnt = new int[m][10]; + for (int i = 0; i < n; ++i) { + for (int j = 0; j < m; j++) { + cnt[j][grid[i][j]]++; + } + } + int first = Integer.MAX_VALUE; + int second = Integer.MAX_VALUE; + int firstId = -1; + int secondId = -1; + for (int i = 0; i < 10; i++) { + dp[0][i] = n - cnt[0][i]; + if (dp[0][i] <= first) { + second = first; + first = dp[0][i]; + secondId = firstId; + firstId = i; + } else if (dp[0][i] < second) { + second = dp[0][i]; + secondId = i; + } + } + for (int j = 1; j < m; ++j) { + int lastFirstId = firstId; + int lastSecondId = secondId; + first = second = Integer.MAX_VALUE; + firstId = secondId = -1; + for (int i = 0; i < 10; ++i) { + int tmp; + int fix = n - cnt[j][i]; + if (i == lastFirstId) { + tmp = fix + dp[j - 1][lastSecondId]; + } else { + tmp = fix + dp[j - 1][lastFirstId]; + } + if (tmp <= first) { + second = first; + first = tmp; + secondId = firstId; + firstId = i; + } else if (tmp < second) { + second = tmp; + secondId = i; + } + dp[j][i] = tmp; + } + } + int ans = Integer.MAX_VALUE; + for (int i = 0; i < 10; ++i) { + ans = Math.min(ans, dp[m - 1][i]); + } + return ans; + } +} diff --git a/src/main/java/g3101_3200/s3122_minimum_number_of_operations_to_satisfy_conditions/readme.md b/src/main/java/g3101_3200/s3122_minimum_number_of_operations_to_satisfy_conditions/readme.md new file mode 100644 index 000000000..1bc037bce --- /dev/null +++ b/src/main/java/g3101_3200/s3122_minimum_number_of_operations_to_satisfy_conditions/readme.md @@ -0,0 +1,55 @@ +3122\. Minimum Number of Operations to Satisfy Conditions + +Medium + +You are given a 2D matrix `grid` of size `m x n`. In one **operation**, you can change the value of **any** cell to **any** non-negative number. You need to perform some **operations** such that each cell `grid[i][j]` is: + +* Equal to the cell below it, i.e. `grid[i][j] == grid[i + 1][j]` (if it exists). +* Different from the cell to its right, i.e. `grid[i][j] != grid[i][j + 1]` (if it exists). + +Return the **minimum** number of operations needed. + +**Example 1:** + +**Input:** grid = [[1,0,2],[1,0,2]] + +**Output:** 0 + +**Explanation:** + +**![](https://assets.leetcode.com/uploads/2024/04/15/examplechanged.png)** + +All the cells in the matrix already satisfy the properties. + +**Example 2:** + +**Input:** grid = [[1,1,1],[0,0,0]] + +**Output:** 3 + +**Explanation:** + +**![](https://assets.leetcode.com/uploads/2024/03/27/example21.png)** + +The matrix becomes `[[1,0,1],[1,0,1]]` which satisfies the properties, by doing these 3 operations: + +* Change `grid[1][0]` to 1. +* Change `grid[0][1]` to 0. +* Change `grid[1][2]` to 1. + +**Example 3:** + +**Input:** grid = [[1],[2],[3]] + +**Output:** 2 + +**Explanation:** + +![](https://assets.leetcode.com/uploads/2024/03/31/changed.png) + +There is a single column. We can change the value to 1 in each cell using 2 operations. + +**Constraints:** + +* `1 <= n, m <= 1000` +* `0 <= grid[i][j] <= 9` \ No newline at end of file diff --git a/src/main/java/g3101_3200/s3123_find_edges_in_shortest_paths/Solution.java b/src/main/java/g3101_3200/s3123_find_edges_in_shortest_paths/Solution.java new file mode 100644 index 000000000..ef79e0076 --- /dev/null +++ b/src/main/java/g3101_3200/s3123_find_edges_in_shortest_paths/Solution.java @@ -0,0 +1,89 @@ +package g3101_3200.s3123_find_edges_in_shortest_paths; + +// #Hard #Heap_Priority_Queue #Graph #Shortest_Path #Depth_First_Search #Breadth_First_Search +// #2024_04_27_Time_24_ms_(100.00%)_Space_75.2_MB_(88.50%) + +import java.util.Arrays; +import java.util.PriorityQueue; + +@SuppressWarnings({"java:S135", "java:S2234"}) +public class Solution { + private int[] edge; + private int[] weight; + private int[] next; + private int[] head; + private int index; + + private void add(int u, int v, int w) { + edge[index] = v; + weight[index] = w; + next[index] = head[u]; + head[u] = index++; + } + + public boolean[] findAnswer(int n, int[][] edges) { + int m = edges.length; + edge = new int[m << 1]; + weight = new int[m << 1]; + next = new int[m << 1]; + head = new int[n]; + for (int i = 0; i < n; ++i) { + head[i] = -1; + } + index = 0; + for (int[] localEdge : edges) { + int u = localEdge[0]; + int v = localEdge[1]; + int w = localEdge[2]; + add(u, v, w); + add(v, u, w); + } + PriorityQueue pq = new PriorityQueue<>((a, b) -> a[1] < b[1] ? -1 : 1); + long[] distances = new long[n]; + Arrays.fill(distances, (long) 1e12); + pq.offer(new long[] {0, 0}); + distances[0] = 0; + while (!pq.isEmpty()) { + long[] cur = pq.poll(); + int u = (int) cur[0]; + long distance = cur[1]; + if (distance > distances[u]) { + continue; + } + if (u == n - 1) { + break; + } + for (int localIndex = head[u]; localIndex != -1; localIndex = next[localIndex]) { + int v = edge[localIndex]; + int w = weight[localIndex]; + long newDistance = distance + w; + if (newDistance < distances[v]) { + distances[v] = newDistance; + pq.offer(new long[] {v, newDistance}); + } + } + } + boolean[] ans = new boolean[m]; + if (distances[n - 1] >= (long) 1e12) { + return ans; + } + dfs(distances, n - 1, -1, ans); + return ans; + } + + private void dfs(long[] distances, int u, int pre, boolean[] ans) { + for (int localIndex = head[u]; localIndex != -1; localIndex = next[localIndex]) { + int v = edge[localIndex]; + int w = weight[localIndex]; + int i = localIndex >> 1; + if (distances[v] + w != distances[u]) { + continue; + } + ans[i] = true; + if (v == pre) { + continue; + } + dfs(distances, v, u, ans); + } + } +} diff --git a/src/main/java/g3101_3200/s3123_find_edges_in_shortest_paths/readme.md b/src/main/java/g3101_3200/s3123_find_edges_in_shortest_paths/readme.md new file mode 100644 index 000000000..012584c1c --- /dev/null +++ b/src/main/java/g3101_3200/s3123_find_edges_in_shortest_paths/readme.md @@ -0,0 +1,49 @@ +3123\. Find Edges in Shortest Paths + +Hard + +You are given an undirected weighted graph of `n` nodes numbered from 0 to `n - 1`. The graph consists of `m` edges represented by a 2D array `edges`, where edges[i] = [ai, bi, wi] indicates that there is an edge between nodes ai and bi with weight wi. + +Consider all the shortest paths from node 0 to node `n - 1` in the graph. You need to find a **boolean** array `answer` where `answer[i]` is `true` if the edge `edges[i]` is part of **at least** one shortest path. Otherwise, `answer[i]` is `false`. + +Return the array `answer`. + +**Note** that the graph may not be connected. + +**Example 1:** + +![](https://assets.leetcode.com/uploads/2024/03/05/graph35drawio-1.png) + +**Input:** n = 6, edges = [[0,1,4],[0,2,1],[1,3,2],[1,4,3],[1,5,1],[2,3,1],[3,5,3],[4,5,2]] + +**Output:** [true,true,true,false,true,true,true,false] + +**Explanation:** + +The following are **all** the shortest paths between nodes 0 and 5: + +* The path `0 -> 1 -> 5`: The sum of weights is `4 + 1 = 5`. +* The path `0 -> 2 -> 3 -> 5`: The sum of weights is `1 + 1 + 3 = 5`. +* The path `0 -> 2 -> 3 -> 1 -> 5`: The sum of weights is `1 + 1 + 2 + 1 = 5`. + +**Example 2:** + +![](https://assets.leetcode.com/uploads/2024/03/05/graphhhh.png) + +**Input:** n = 4, edges = [[2,0,1],[0,1,1],[0,3,4],[3,2,2]] + +**Output:** [true,false,false,true] + +**Explanation:** + +There is one shortest path between nodes 0 and 3, which is the path `0 -> 2 -> 3` with the sum of weights `1 + 2 = 3`. + +**Constraints:** + +* 2 <= n <= 5 * 104 +* `m == edges.length` +* 1 <= m <= min(5 * 104, n * (n - 1) / 2) +* 0 <= ai, bi < n +* ai != bi +* 1 <= wi <= 105 +* There are no repeated edges. \ No newline at end of file diff --git a/src/test/java/g3101_3200/s3110_score_of_a_string/SolutionTest.java b/src/test/java/g3101_3200/s3110_score_of_a_string/SolutionTest.java new file mode 100644 index 000000000..e51d8136e --- /dev/null +++ b/src/test/java/g3101_3200/s3110_score_of_a_string/SolutionTest.java @@ -0,0 +1,18 @@ +package g3101_3200.s3110_score_of_a_string; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; + +import org.junit.jupiter.api.Test; + +class SolutionTest { + @Test + void scoreOfString() { + assertThat(new Solution().scoreOfString("hello"), equalTo(13)); + } + + @Test + void scoreOfString2() { + assertThat(new Solution().scoreOfString("zaz"), equalTo(50)); + } +} diff --git a/src/test/java/g3101_3200/s3111_minimum_rectangles_to_cover_points/SolutionTest.java b/src/test/java/g3101_3200/s3111_minimum_rectangles_to_cover_points/SolutionTest.java new file mode 100644 index 000000000..3e7af5c9b --- /dev/null +++ b/src/test/java/g3101_3200/s3111_minimum_rectangles_to_cover_points/SolutionTest.java @@ -0,0 +1,36 @@ +package g3101_3200.s3111_minimum_rectangles_to_cover_points; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; + +import org.junit.jupiter.api.Test; + +class SolutionTest { + @Test + void minRectanglesToCoverPoints() { + assertThat( + new Solution() + .minRectanglesToCoverPoints( + new int[][] {{2, 1}, {1, 0}, {1, 4}, {1, 8}, {3, 5}, {4, 6}}, 1), + equalTo(2)); + } + + @Test + void minRectanglesToCoverPoints2() { + assertThat( + new Solution() + .minRectanglesToCoverPoints( + new int[][] { + {0, 0}, {1, 1}, {2, 2}, {3, 3}, {4, 4}, {5, 5}, {6, 6} + }, + 2), + equalTo(3)); + } + + @Test + void minRectanglesToCoverPoints3() { + assertThat( + new Solution().minRectanglesToCoverPoints(new int[][] {{2, 3}, {1, 2}}, 0), + equalTo(2)); + } +} diff --git a/src/test/java/g3101_3200/s3112_minimum_time_to_visit_disappearing_nodes/SolutionTest.java b/src/test/java/g3101_3200/s3112_minimum_time_to_visit_disappearing_nodes/SolutionTest.java new file mode 100644 index 000000000..9cefed87f --- /dev/null +++ b/src/test/java/g3101_3200/s3112_minimum_time_to_visit_disappearing_nodes/SolutionTest.java @@ -0,0 +1,37 @@ +package g3101_3200.s3112_minimum_time_to_visit_disappearing_nodes; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; + +import org.junit.jupiter.api.Test; + +class SolutionTest { + @Test + void minimumTime() { + assertThat( + new Solution() + .minimumTime( + 3, + new int[][] {{0, 1, 2}, {1, 2, 1}, {0, 2, 4}}, + new int[] {1, 1, 5}), + equalTo(new int[] {0, -1, 4})); + } + + @Test + void minimumTime2() { + assertThat( + new Solution() + .minimumTime( + 3, + new int[][] {{0, 1, 2}, {1, 2, 1}, {0, 2, 4}}, + new int[] {1, 3, 5}), + equalTo(new int[] {0, 2, 3})); + } + + @Test + void minimumTime3() { + assertThat( + new Solution().minimumTime(2, new int[][] {{0, 1, 1}}, new int[] {1, 1}), + equalTo(new int[] {0, -1})); + } +} diff --git a/src/test/java/g3101_3200/s3113_find_the_number_of_subarrays_where_boundary_elements_are_maximum/SolutionTest.java b/src/test/java/g3101_3200/s3113_find_the_number_of_subarrays_where_boundary_elements_are_maximum/SolutionTest.java new file mode 100644 index 000000000..dbeb59f66 --- /dev/null +++ b/src/test/java/g3101_3200/s3113_find_the_number_of_subarrays_where_boundary_elements_are_maximum/SolutionTest.java @@ -0,0 +1,23 @@ +package g3101_3200.s3113_find_the_number_of_subarrays_where_boundary_elements_are_maximum; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; + +import org.junit.jupiter.api.Test; + +class SolutionTest { + @Test + void numberOfSubarrays() { + assertThat(new Solution().numberOfSubarrays(new int[] {1, 4, 3, 3, 2}), equalTo(6L)); + } + + @Test + void numberOfSubarrays2() { + assertThat(new Solution().numberOfSubarrays(new int[] {3, 3, 3}), equalTo(6L)); + } + + @Test + void numberOfSubarrays3() { + assertThat(new Solution().numberOfSubarrays(new int[] {1}), equalTo(1L)); + } +} diff --git a/src/test/java/g3101_3200/s3114_latest_time_you_can_obtain_after_replacing_characters/SolutionTest.java b/src/test/java/g3101_3200/s3114_latest_time_you_can_obtain_after_replacing_characters/SolutionTest.java new file mode 100644 index 000000000..bd0d01819 --- /dev/null +++ b/src/test/java/g3101_3200/s3114_latest_time_you_can_obtain_after_replacing_characters/SolutionTest.java @@ -0,0 +1,43 @@ +package g3101_3200.s3114_latest_time_you_can_obtain_after_replacing_characters; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; + +import org.junit.jupiter.api.Test; + +class SolutionTest { + @Test + void findLatestTime() { + assertThat(new Solution().findLatestTime("1?:?4"), equalTo("11:54")); + } + + @Test + void findLatestTime2() { + assertThat(new Solution().findLatestTime("0?:5?"), equalTo("09:59")); + } + + @Test + void findLatestTime3() { + assertThat(new Solution().findLatestTime("?1:?6"), equalTo("11:56")); + } + + @Test + void findLatestTime4() { + assertThat(new Solution().findLatestTime("08:33"), equalTo("08:33")); + } + + @Test + void findLatestTime5() { + assertThat(new Solution().findLatestTime("??:1?"), equalTo("11:19")); + } + + @Test + void findLatestTime6() { + assertThat(new Solution().findLatestTime("04:??"), equalTo("04:59")); + } + + @Test + void findLatestTime7() { + assertThat(new Solution().findLatestTime("?3:12"), equalTo("03:12")); + } +} diff --git a/src/test/java/g3101_3200/s3115_maximum_prime_difference/SolutionTest.java b/src/test/java/g3101_3200/s3115_maximum_prime_difference/SolutionTest.java new file mode 100644 index 000000000..e4abd0267 --- /dev/null +++ b/src/test/java/g3101_3200/s3115_maximum_prime_difference/SolutionTest.java @@ -0,0 +1,18 @@ +package g3101_3200.s3115_maximum_prime_difference; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; + +import org.junit.jupiter.api.Test; + +class SolutionTest { + @Test + void maximumPrimeDifference() { + assertThat(new Solution().maximumPrimeDifference(new int[] {4, 2, 9, 5, 3}), equalTo(3)); + } + + @Test + void maximumPrimeDifference2() { + assertThat(new Solution().maximumPrimeDifference(new int[] {4, 8, 2, 8}), equalTo(0)); + } +} diff --git a/src/test/java/g3101_3200/s3116_kth_smallest_amount_with_single_denomination_combination/SolutionTest.java b/src/test/java/g3101_3200/s3116_kth_smallest_amount_with_single_denomination_combination/SolutionTest.java new file mode 100644 index 000000000..3cf0a0b7d --- /dev/null +++ b/src/test/java/g3101_3200/s3116_kth_smallest_amount_with_single_denomination_combination/SolutionTest.java @@ -0,0 +1,18 @@ +package g3101_3200.s3116_kth_smallest_amount_with_single_denomination_combination; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; + +import org.junit.jupiter.api.Test; + +class SolutionTest { + @Test + void findKthSmallest() { + assertThat(new Solution().findKthSmallest(new int[] {3, 6, 9}, 3), equalTo(9L)); + } + + @Test + void findKthSmallest2() { + assertThat(new Solution().findKthSmallest(new int[] {5, 2}, 7), equalTo(12L)); + } +} diff --git a/src/test/java/g3101_3200/s3117_minimum_sum_of_values_by_dividing_array/SolutionTest.java b/src/test/java/g3101_3200/s3117_minimum_sum_of_values_by_dividing_array/SolutionTest.java new file mode 100644 index 000000000..efc7f3d58 --- /dev/null +++ b/src/test/java/g3101_3200/s3117_minimum_sum_of_values_by_dividing_array/SolutionTest.java @@ -0,0 +1,29 @@ +package g3101_3200.s3117_minimum_sum_of_values_by_dividing_array; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; + +import org.junit.jupiter.api.Test; + +class SolutionTest { + @Test + void minimumValueSum() { + assertThat( + new Solution().minimumValueSum(new int[] {1, 4, 3, 3, 2}, new int[] {0, 3, 3, 2}), + equalTo(12)); + } + + @Test + void minimumValueSum2() { + assertThat( + new Solution() + .minimumValueSum(new int[] {2, 3, 5, 7, 7, 7, 5}, new int[] {0, 7, 5}), + equalTo(17)); + } + + @Test + void minimumValueSum3() { + assertThat( + new Solution().minimumValueSum(new int[] {1, 2, 3, 4}, new int[] {2}), equalTo(-1)); + } +} diff --git a/src/test/java/g3101_3200/s3120_count_the_number_of_special_characters_i/SolutionTest.java b/src/test/java/g3101_3200/s3120_count_the_number_of_special_characters_i/SolutionTest.java new file mode 100644 index 000000000..835fc2716 --- /dev/null +++ b/src/test/java/g3101_3200/s3120_count_the_number_of_special_characters_i/SolutionTest.java @@ -0,0 +1,23 @@ +package g3101_3200.s3120_count_the_number_of_special_characters_i; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; + +import org.junit.jupiter.api.Test; + +class SolutionTest { + @Test + void numberOfSpecialChars() { + assertThat(new Solution().numberOfSpecialChars("aaAbcBC"), equalTo(3)); + } + + @Test + void numberOfSpecialChars2() { + assertThat(new Solution().numberOfSpecialChars("abc"), equalTo(0)); + } + + @Test + void numberOfSpecialChars3() { + assertThat(new Solution().numberOfSpecialChars("abBCab"), equalTo(1)); + } +} diff --git a/src/test/java/g3101_3200/s3121_count_the_number_of_special_characters_ii/SolutionTest.java b/src/test/java/g3101_3200/s3121_count_the_number_of_special_characters_ii/SolutionTest.java new file mode 100644 index 000000000..a8608a43d --- /dev/null +++ b/src/test/java/g3101_3200/s3121_count_the_number_of_special_characters_ii/SolutionTest.java @@ -0,0 +1,23 @@ +package g3101_3200.s3121_count_the_number_of_special_characters_ii; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; + +import org.junit.jupiter.api.Test; + +class SolutionTest { + @Test + void numberOfSpecialChars() { + assertThat(new Solution().numberOfSpecialChars("aaAbcBC"), equalTo(3)); + } + + @Test + void numberOfSpecialChars2() { + assertThat(new Solution().numberOfSpecialChars("abc"), equalTo(0)); + } + + @Test + void numberOfSpecialChars3() { + assertThat(new Solution().numberOfSpecialChars("AbBCab"), equalTo(0)); + } +} diff --git a/src/test/java/g3101_3200/s3122_minimum_number_of_operations_to_satisfy_conditions/SolutionTest.java b/src/test/java/g3101_3200/s3122_minimum_number_of_operations_to_satisfy_conditions/SolutionTest.java new file mode 100644 index 000000000..5970083e2 --- /dev/null +++ b/src/test/java/g3101_3200/s3122_minimum_number_of_operations_to_satisfy_conditions/SolutionTest.java @@ -0,0 +1,20 @@ +package g3101_3200.s3122_minimum_number_of_operations_to_satisfy_conditions; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; + +import org.junit.jupiter.api.Test; + +class SolutionTest { + @Test + void minimumOperations() { + assertThat( + new Solution().minimumOperations(new int[][] {{1, 0, 2}, {1, 0, 2}}), equalTo(0)); + } + + @Test + void minimumOperations2() { + assertThat( + new Solution().minimumOperations(new int[][] {{1, 1, 1}, {0, 0, 0}}), equalTo(3)); + } +} diff --git a/src/test/java/g3101_3200/s3123_find_edges_in_shortest_paths/SolutionTest.java b/src/test/java/g3101_3200/s3123_find_edges_in_shortest_paths/SolutionTest.java new file mode 100644 index 000000000..d378cece0 --- /dev/null +++ b/src/test/java/g3101_3200/s3123_find_edges_in_shortest_paths/SolutionTest.java @@ -0,0 +1,29 @@ +package g3101_3200.s3123_find_edges_in_shortest_paths; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; + +import org.junit.jupiter.api.Test; + +class SolutionTest { + @Test + void findAnswer() { + assertThat( + new Solution() + .findAnswer( + 6, + new int[][] { + {0, 1, 4}, {0, 2, 1}, {1, 3, 2}, {1, 4, 3}, {1, 5, 1}, + {2, 3, 1}, {3, 5, 3}, {4, 5, 2} + }), + equalTo(new boolean[] {true, true, true, false, true, true, true, false})); + } + + @Test + void findAnswer2() { + assertThat( + new Solution() + .findAnswer(4, new int[][] {{2, 0, 1}, {0, 1, 1}, {0, 3, 4}, {3, 2, 2}}), + equalTo(new boolean[] {true, false, false, true})); + } +}