Skip to content

Commit 7fe8bd1

Browse files
authored
Improved tasks 3392-3405
1 parent 482d125 commit 7fe8bd1

File tree

12 files changed

+87
-176
lines changed
  • src/main/java
    • g3301_3400
      • s3392_count_subarrays_of_length_three_with_a_condition
      • s3393_count_paths_with_the_given_xor_value
      • s3394_check_if_grid_can_be_cut_into_sections
      • s3395_subsequences_with_a_unique_middle_mode_i
      • s3396_minimum_number_of_operations_to_make_elements_in_array_distinct
      • s3397_maximum_number_of_distinct_elements_after_operations
      • s3398_smallest_substring_with_identical_characters_i
      • s3399_smallest_substring_with_identical_characters_ii
    • g3401_3500
      • s3402_minimum_operations_to_make_columns_strictly_increasing
      • s3403_find_the_lexicographically_largest_string_from_the_box_i
      • s3404_count_special_subsequences
      • s3405_count_the_number_of_arrays_with_k_matching_adjacent_elements

12 files changed

+87
-176
lines changed

src/main/java/g3301_3400/s3392_count_subarrays_of_length_three_with_a_condition/Solution.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package g3301_3400.s3392_count_subarrays_of_length_three_with_a_condition;
22

3-
// #Easy #Array #Sliding_Window #2024_12_22_Time_1_ms_(100.00%)_Space_45.5_MB_(100.00%)
3+
// #Easy #Array #2025_01_06_Time_1_(100.00%)_Space_44.87_(93.12%)
44

55
public class Solution {
66
public int countSubarrays(int[] nums) {

src/main/java/g3301_3400/s3393_count_paths_with_the_given_xor_value/Solution.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package g3301_3400.s3393_count_paths_with_the_given_xor_value;
22

3-
// #Medium #Dynamic_Programming #Math #Bit_Manipulation
4-
// #2024_12_22_Time_83_ms_(100.00%)_Space_57_MB_(100.00%)
3+
// #Medium #Array #Dynamic_Programming #Math #Matrix #Bit_Manipulation
4+
// #2025_01_06_Time_76_(62.72%)_Space_56.92_(68.41%)
55

66
import java.util.Arrays;
77

Original file line numberDiff line numberDiff line change
@@ -1,50 +1,41 @@
11
package g3301_3400.s3394_check_if_grid_can_be_cut_into_sections;
22

3-
// #Medium #Sorting #Greedy #Simulation #Geometry #Line_Sweep #Grid
4-
// #2024_12_22_Time_136_ms_(100.00%)_Space_128.7_MB_(100.00%)
3+
// #Medium #Geometry #Line_Sweep #2025_01_06_Time_35_(99.66%)_Space_117.96_(80.52%)
54

65
import java.util.Arrays;
76

87
@SuppressWarnings({"unused", "java:S1172"})
98
public class Solution {
10-
public boolean checkValidCuts(int n, int[][] rectangles) {
11-
int m = rectangles.length;
12-
int[][] xAxis = new int[m][2];
13-
int[][] yAxis = new int[m][2];
14-
int ind = 0;
15-
for (int[] axis : rectangles) {
16-
int startX = axis[0];
17-
int startY = axis[1];
18-
int endX = axis[2];
19-
int endY = axis[3];
20-
xAxis[ind] = new int[] {startX, endX};
21-
yAxis[ind] = new int[] {startY, endY};
22-
ind++;
9+
private static final int MASK = (1 << 30) - 1;
10+
11+
public boolean checkValidCuts(int m, int[][] rectangles) {
12+
int n = rectangles.length;
13+
long[] start = new long[n];
14+
for (int i = 0; i < n; i++) {
15+
start[i] = ((long) rectangles[i][1] << 32) + rectangles[i][3];
2316
}
24-
Arrays.sort(xAxis, (a, b) -> a[0] == b[0] ? a[1] - b[1] : a[0] - b[0]);
25-
Arrays.sort(yAxis, (a, b) -> a[0] == b[0] ? a[1] - b[1] : a[0] - b[0]);
26-
int verticalCuts = findSections(xAxis);
27-
if (verticalCuts > 2) {
17+
Arrays.sort(start);
18+
if (validate(start)) {
2819
return true;
2920
}
30-
int horizontalCuts = findSections(yAxis);
31-
return horizontalCuts > 2;
21+
for (int i = 0; i < n; i++) {
22+
start[i] = ((long) rectangles[i][0] << 32) + rectangles[i][2];
23+
}
24+
Arrays.sort(start);
25+
return validate(start);
3226
}
3327

34-
private int findSections(int[][] axis) {
35-
int end = axis[0][1];
36-
int sections = 1;
37-
for (int i = 1; i < axis.length; i++) {
38-
if (end > axis[i][0]) {
39-
end = Math.max(end, axis[i][1]);
40-
} else {
41-
sections++;
42-
end = axis[i][1];
43-
}
44-
if (sections > 2) {
45-
return sections;
28+
private boolean validate(long[] arr) {
29+
int cut = 0;
30+
int n = arr.length;
31+
int max = (int) arr[0] & MASK;
32+
for (int i = 0; i < n; i++) {
33+
int start = (int) (arr[i] >> 32);
34+
if (start >= max && ++cut == 2) {
35+
return true;
4636
}
37+
max = Math.max(max, (int) (arr[i] & MASK));
4738
}
48-
return sections;
39+
return false;
4940
}
5041
}
Original file line numberDiff line numberDiff line change
@@ -1,141 +1,69 @@
11
package g3301_3400.s3395_subsequences_with_a_unique_middle_mode_i;
22

3-
// #Hard #Dynamic_Programming #Sliding_Window #Combinatorics #Subsequence
4-
// #2024_12_22_Time_1115_ms_(100.00%)_Space_45.2_MB_(100.00%)
3+
// #Hard #Array #Hash_Table #Math #Combinatorics #2025_01_06_Time_27_(99.29%)_Space_45.15_(97.87%)
54

6-
import java.util.ArrayList;
75
import java.util.HashMap;
8-
import java.util.List;
96
import java.util.Map;
107

118
public class Solution {
12-
private static final int MOD = 1000000007;
9+
private static final int MOD = (int) 1e9 + 7;
10+
private long[] c2 = new long[1001];
1311

14-
public int subsequencesWithMiddleMode(int[] a) {
15-
int n = a.length;
16-
// Create a dictionary to store indices of each number
17-
Map<Integer, List<Integer>> dict = new HashMap<>();
18-
for (int i = 0; i < n; i++) {
19-
dict.computeIfAbsent(a[i], k -> new ArrayList<>()).add(i);
20-
}
21-
long ans = 0L;
22-
// Iterate over each unique number and its indices
23-
for (Map.Entry<Integer, List<Integer>> entry : dict.entrySet()) {
24-
List<Integer> b = entry.getValue();
25-
int m = b.size();
26-
for (int k = 0; k < m; k++) {
27-
int i = b.get(k);
28-
int r = m - 1 - k;
29-
int u = i - k;
30-
int v = (n - 1 - i) - r;
31-
// Case 2: Frequency of occurrence is 2 times
32-
ans = (ans + convert(k, 1) * convert(u, 1) % MOD * convert(v, 2) % MOD) % MOD;
33-
ans = (ans + convert(r, 1) * convert(u, 2) % MOD * convert(v, 1) % MOD) % MOD;
34-
// Case 3: Frequency of occurrence is 3 times
35-
ans = (ans + convert(k, 2) * convert(v, 2) % MOD) % MOD;
36-
ans = (ans + convert(r, 2) * convert(u, 2) % MOD) % MOD;
37-
ans =
38-
(ans
39-
+ convert(k, 1)
40-
* convert(r, 1)
41-
% MOD
42-
* convert(u, 1)
43-
% MOD
44-
* convert(v, 1)
45-
% MOD)
46-
% MOD;
47-
48-
// Case 4: Frequency of occurrence is 4 times
49-
ans = (ans + convert(k, 2) * convert(r, 1) % MOD * convert(v, 1) % MOD) % MOD;
50-
ans = (ans + convert(k, 1) * convert(r, 2) % MOD * convert(u, 1) % MOD) % MOD;
51-
52-
// Case 5: Frequency of occurrence is 5 times
53-
ans = (ans + convert(k, 2) * convert(r, 2) % MOD) % MOD;
12+
public int subsequencesWithMiddleMode(int[] nums) {
13+
if (c2[2] == 0) {
14+
c2[0] = c2[1] = 0;
15+
c2[2] = 1;
16+
for (int i = 3; i < c2.length; ++i) {
17+
c2[i] = i * (i - 1) / 2;
5418
}
5519
}
56-
long dif = 0;
57-
// Principle of inclusion-exclusion
58-
for (Map.Entry<Integer, List<Integer>> midEntry : dict.entrySet()) {
59-
List<Integer> b = midEntry.getValue();
60-
int m = b.size();
61-
for (Map.Entry<Integer, List<Integer>> tmpEntry : dict.entrySet()) {
62-
if (!midEntry.getKey().equals(tmpEntry.getKey())) {
63-
List<Integer> c = tmpEntry.getValue();
64-
int size = c.size();
65-
int k = 0;
66-
int j = 0;
67-
while (k < m) {
68-
int i = b.get(k);
69-
int r = m - 1 - k;
70-
int u = i - k;
71-
int v = (n - 1 - i) - r;
72-
while (j < size && c.get(j) < i) {
73-
j++;
74-
}
75-
int x = j;
76-
int y = size - x;
77-
dif =
78-
(dif
79-
+ convert(k, 1)
80-
* convert(x, 1)
81-
% MOD
82-
* convert(y, 1)
83-
% MOD
84-
* convert(v - y, 1)
85-
% MOD)
86-
% MOD;
87-
dif =
88-
(dif
89-
+ convert(k, 1)
90-
* convert(y, 2)
91-
% MOD
92-
* convert(u - x, 1)
93-
% MOD)
94-
% MOD;
95-
dif =
96-
(dif + convert(k, 1) * convert(x, 1) % MOD * convert(y, 2) % MOD)
97-
% MOD;
98-
99-
dif =
100-
(dif
101-
+ convert(r, 1)
102-
* convert(x, 1)
103-
% MOD
104-
* convert(y, 1)
105-
% MOD
106-
* convert(u - x, 1)
107-
% MOD)
108-
% MOD;
109-
dif =
110-
(dif
111-
+ convert(r, 1)
112-
* convert(x, 2)
113-
% MOD
114-
* convert(v - y, 1)
115-
% MOD)
116-
% MOD;
117-
dif =
118-
(dif + convert(r, 1) * convert(x, 2) % MOD * convert(y, 1) % MOD)
119-
% MOD;
120-
k++;
121-
}
122-
}
20+
int n = nums.length;
21+
int[] newNums = new int[n];
22+
Map<Integer, Integer> map = new HashMap<>(n);
23+
int m = 0;
24+
int index = 0;
25+
for (int x : nums) {
26+
Integer id = map.get(x);
27+
if (id == null) {
28+
id = m++;
29+
map.put(x, id);
12330
}
31+
newNums[index++] = id;
12432
}
125-
return (int) ((ans - dif + MOD) % MOD);
126-
}
127-
128-
private long convert(int n, int k) {
129-
if (k > n) {
33+
if (m == n) {
13034
return 0;
13135
}
132-
if (k == 0 || k == n) {
133-
return 1;
36+
int[] rightCount = new int[m];
37+
for (int x : newNums) {
38+
rightCount[x]++;
13439
}
135-
long res = 1;
136-
for (int i = 0; i < k; i++) {
137-
res = res * (n - i) / (i + 1);
40+
int[] leftCount = new int[m];
41+
long ans = (long) n * (n - 1) * (n - 2) * (n - 3) * (n - 4) / 120;
42+
for (int left = 0; left < n - 2; left++) {
43+
int x = newNums[left];
44+
rightCount[x]--;
45+
if (left >= 2) {
46+
int right = n - (left + 1);
47+
int leftX = leftCount[x];
48+
int rightX = rightCount[x];
49+
ans -= c2[left - leftX] * c2[right - rightX];
50+
for (int y = 0; y < m; ++y) {
51+
if (y == x) {
52+
continue;
53+
}
54+
int rightY = rightCount[y];
55+
int leftY = leftCount[y];
56+
ans -= c2[leftY] * rightX * (right - rightX);
57+
ans -= c2[rightY] * leftX * (left - leftX);
58+
ans -=
59+
leftY
60+
* rightY
61+
* (leftX * (right - rightX - rightY)
62+
+ rightX * (left - leftX - leftY));
63+
}
64+
}
65+
leftCount[x]++;
13866
}
139-
return res % MOD;
67+
return (int) (ans % MOD);
14068
}
14169
}

src/main/java/g3301_3400/s3396_minimum_number_of_operations_to_make_elements_in_array_distinct/Solution.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package g3301_3400.s3396_minimum_number_of_operations_to_make_elements_in_array_distinct;
22

3-
// #Easy #Array #Greedy #Simulation #Distinct #Elements #Operations
4-
// #2024_12_22_Time_4_ms_(100.00%)_Space_45_MB_(100.00%)
3+
// #Easy #Array #Greedy #Simulation #2025_01_06_Time_3_(60.47%)_Space_44.61_(50.65%)
54

65
import java.util.HashMap;
76
import java.util.Map;

src/main/java/g3301_3400/s3397_maximum_number_of_distinct_elements_after_operations/Solution.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package g3301_3400.s3397_maximum_number_of_distinct_elements_after_operations;
22

3-
// #Medium #Array #Greedy #Distinct #Elements #Mathematics #Operations #Optimization
4-
// #2024_12_22_Time_19_ms_(100.00%)_Space_57.8_MB_(100.00%)
3+
// #Medium #Array #Sorting #Greedy #2025_01_06_Time_19_(84.32%)_Space_57.84_(93.53%)
54

65
import java.util.Arrays;
76

src/main/java/g3301_3400/s3398_smallest_substring_with_identical_characters_i/Solution.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package g3301_3400.s3398_smallest_substring_with_identical_characters_i;
22

3-
// #Hard #String #Greedy #Bit_Manipulation #Sliding_Window #Optimization
4-
// #2024_12_24_Time_1_ms_(100.00%)_Space_42.9_MB_(39.83%)
3+
// #Hard #Array #Binary_Search #Enumeration #2025_01_06_Time_1_(100.00%)_Space_42.72_(39.94%)
54

65
public class Solution {
76
public int minLength(String s, int ops) {

src/main/java/g3301_3400/s3399_smallest_substring_with_identical_characters_ii/Solution.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package g3301_3400.s3399_smallest_substring_with_identical_characters_ii;
22

3-
// #Hard #String #Greedy #Bit_Manipulation #Sliding_Window #Optimization
4-
// #2024_12_24_Time_15_ms_(99.39%)_Space_45.9_MB_(43.03%)
3+
// #Hard #Bit_Manipulation #Sliding_Window #2025_01_06_Time_15_(98.93%)_Space_45.62_(57.38%)
54

65
import java.util.ArrayList;
76
import java.util.List;

src/main/java/g3401_3500/s3402_minimum_operations_to_make_columns_strictly_increasing/Solution.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package g3401_3500.s3402_minimum_operations_to_make_columns_strictly_increasing;
22

3-
// #Easy #Array #Dynamic_Programming #Greedy #Matrix #Simulation
4-
// #2024_12_29_Time_1_(100.00%)_Space_44.99_(100.00%)
3+
// #Easy #Matrix #Simulation #2025_01_06_Time_1_(99.95%)_Space_45.24_(62.37%)
54

65
public class Solution {
76
public int minimumOperations(int[][] grid) {

src/main/java/g3401_3500/s3403_find_the_lexicographically_largest_string_from_the_box_i/Solution.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package g3401_3500.s3403_find_the_lexicographically_largest_string_from_the_box_i;
22

3-
// #Medium #String #Sorting #Greedy #Backtracking #Combinatorics
4-
// #2024_12_29_Time_5_(100.00%)_Space_45.20_(100.00%)
3+
// #Medium #String #Two_Pointers #Enumeration #2025_01_06_Time_5_(89.70%)_Space_45.38_(80.39%)
54

65
public class Solution {
76
public String answerString(String word, int numFriends) {

src/main/java/g3401_3500/s3404_count_special_subsequences/Solution.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package g3401_3500.s3404_count_special_subsequences;
22

3-
// #Medium #Array #Combinatorics #Dynamic #Mathematics #Programming
4-
// #2024_12_29_Time_331_(100.00%)_Space_55.49_(100.00%)
3+
// #Medium #Array #Hash_Table #Math #Enumeration #2025_01_06_Time_342_(73.58%)_Space_55.00_(79.58%)
54

65
import java.util.HashMap;
76
import java.util.Map;

src/main/java/g3401_3500/s3405_count_the_number_of_arrays_with_k_matching_adjacent_elements/Solution.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package g3401_3500.s3405_count_the_number_of_arrays_with_k_matching_adjacent_elements;
22

3-
// #Hard #Dynamic_Programming #Combinatorics #Arrays #Mathematics
4-
// #2024_12_29_Time_57_(100.00%)_Space_44.55_(100.00%)
3+
// #Hard #Math #Combinatorics #2025_01_06_Time_55_(52.53%)_Space_44.95_(37.58%)
54

65
public class Solution {
76
private static final int MOD = (int) (1e9 + 7);

0 commit comments

Comments
 (0)