Skip to content

Commit 2615bc9

Browse files
committed
Improved solutions
1 parent a35a91d commit 2615bc9

File tree

4 files changed

+149
-148
lines changed
  • src/main/java/g3401_3500
    • s3461_check_if_digits_are_equal_in_string_after_operations_i
    • s3462_maximum_sum_with_at_most_k_elements
    • s3463_check_if_digits_are_equal_in_string_after_operations_ii
    • s3464_maximize_the_distance_between_points_on_a_square

4 files changed

+149
-148
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,22 @@
11
package g3401_3500.s3461_check_if_digits_are_equal_in_string_after_operations_i;
22

3-
// #Easy #2025_02_23_Time_23_ms_(100.00%)_Space_45.51_MB_(100.00%)
3+
// #Easy #String #Math #Simulation #Number_Theory #Combinatorics
4+
// #2025_02_25_Time_2_ms_(96.71%)_Space_42.26_MB_(97.03%)
45

56
public class Solution {
67
public boolean hasSameDigits(String s) {
7-
int n = s.length();
8-
while (n > 2) {
9-
StringBuilder nstr = new StringBuilder();
10-
for (int i = 1; i < n; i++) {
11-
int next = ((s.charAt(i) - '0') + (s.charAt(i - 1) - '0')) % 10;
12-
nstr.append(next);
8+
char[] ch = s.toCharArray();
9+
int k = ch.length - 1;
10+
while (k != 1) {
11+
for (int i = 0; i < k; i++) {
12+
int a = (int) ch[i] - 48;
13+
int b = (int) ch[i + 1] - 48;
14+
int d = (a + b) % 10;
15+
char c = (char) (d + '0');
16+
ch[i] = c;
1317
}
14-
n--;
15-
s = nstr.toString();
18+
k--;
1619
}
17-
return s.charAt(0) == s.charAt(1);
20+
return ch[0] == ch[1];
1821
}
1922
}
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,29 @@
11
package g3401_3500.s3462_maximum_sum_with_at_most_k_elements;
22

3-
// #Medium #2025_02_23_Time_278_ms_(_%)_Space_73.54_MB_(_%)
4-
5-
import java.util.Collections;
6-
import java.util.PriorityQueue;
3+
// #Medium #Array #Sorting #Greedy #Matrix #Heap_(Priority_Queue)
4+
// #2025_02_25_Time_62_ms_(99.82%)_Space_78.09_MB_(20.19%)
75

86
public class Solution {
97
public long maxSum(int[][] grid, int[] limits, int k) {
10-
if (grid.length == 0) {
11-
return 0;
8+
int l = 0;
9+
for (int i = 0; i < limits.length; i++) {
10+
l += limits[i];
1211
}
13-
PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
14-
PriorityQueue<Integer> temp;
12+
int[] dp = new int[l];
13+
int a = 0;
1514
for (int i = 0; i < grid.length; i++) {
16-
temp = new PriorityQueue<>(Collections.reverseOrder());
17-
for (int j = 0; j < grid[i].length; j++) {
18-
temp.add(grid[i][j]);
19-
}
20-
int cnt = 0;
21-
while (!temp.isEmpty() && cnt < limits[i]) {
22-
pq.add(temp.poll());
23-
cnt += 1;
15+
int lim = limits[i];
16+
Arrays.sort(grid[i]);
17+
for (int j = grid[i].length - lim; j < grid[i].length; j++) {
18+
dp[a] = grid[i][j];
19+
a++;
2420
}
2521
}
26-
long result = 0;
27-
long count = 0;
28-
while (!pq.isEmpty() && count < k) {
29-
result += pq.poll();
30-
count += 1;
22+
Arrays.sort(dp);
23+
long sum = 0L;
24+
for (int i = l - 1; i >= l - k; i--) {
25+
sum += dp[i];
3126
}
32-
return result;
27+
return sum;
3328
}
3429
}
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,74 @@
11
package g3401_3500.s3463_check_if_digits_are_equal_in_string_after_operations_ii;
22

3-
// #Hard #2025_02_23_Time_103_ms_(100.00%)_Space_45.58_MB_(100.00%)
3+
// #Hard #String #Math #Number_Theory #Combinatorics
4+
// #2025_02_25_Time_43_ms_(99.64%)_Space_49.40_MB_(10.02%)
45

56
public class Solution {
6-
public boolean hasSameDigits(String s) {
7-
int n = s.length();
8-
int nMunus2 = n - 2;
9-
int f0 = 0;
10-
int f1 = 0;
11-
for (int j = 0; j <= nMunus2; j++) {
12-
int c = binomMod10(nMunus2, j);
13-
f0 = (f0 + c * (s.charAt(j) - '0')) % 10;
14-
f1 = (f1 + c * (s.charAt(j + 1) - '0')) % 10;
7+
private int powMod10(int a, int n) {
8+
int x = 1;
9+
while (n >= 1) {
10+
if (n % 2 == 1) {
11+
x = (x * a) % 10;
12+
}
13+
a = (a * a) % 10;
14+
n /= 2;
1515
}
16-
return f0 == f1;
16+
return x;
1717
}
1818

19-
private int binomMod10(int n, int k) {
20-
int r2 = binomMod2(n, k);
21-
int r5 = binomMod5(n, k);
22-
for (int x = 0; x < 10; x++) {
23-
if (x % 2 == r2 && x % 5 == r5) {
24-
return x;
19+
private int[] f(int n) {
20+
int[] ns = new int[n + 1];
21+
int[] n2 = new int[n + 1];
22+
int[] n5 = new int[n + 1];
23+
ns[0] = 1;
24+
for (int i = 1; i <= n; ++i) {
25+
int m = i;
26+
n2[i] = n2[i - 1];
27+
n5[i] = n5[i - 1];
28+
while (m % 2 == 0) {
29+
m /= 2;
30+
n2[i]++;
31+
}
32+
while (m % 5 == 0) {
33+
m /= 5;
34+
n5[i]++;
2535
}
36+
ns[i] = (ns[i - 1] * m) % 10;
2637
}
27-
return 0;
28-
}
29-
30-
private int binomMod2(int n, int k) {
31-
return ((n & k) == k) ? 1 : 0;
38+
int[] inv = new int[10];
39+
for (int i = 1; i < 10; ++i) {
40+
for (int j = 0; j < 10; ++j) {
41+
if (i * j % 10 == 1) {
42+
inv[i] = j;
43+
}
44+
}
45+
}
46+
int[] xs = new int[n + 1];
47+
for (int k = 0; k <= n; ++k) {
48+
int a = 0;
49+
int s2 = n2[n] - n2[n - k] - n2[k];
50+
int s5 = n5[n] - n5[n - k] - n5[k];
51+
if (s2 == 0 || s5 == 0) {
52+
a = (ns[n] * inv[ns[n - k]] * inv[ns[k]] * powMod10(2, s2) * powMod10(5, s5)) % 10;
53+
}
54+
xs[k] = a;
55+
}
56+
return xs;
3257
}
3358

34-
private int binomMod5(int n, int k) {
35-
int[][] t = {{1}, {1, 1}, {1, 2, 1}, {1, 3, 3, 1}, {1, 4, 1, 4, 1}};
36-
int res = 1;
37-
while (n > 0 || k > 0) {
38-
int nd = n % 5;
39-
int kd = k % 5;
40-
if (kd > nd) {
41-
return 0;
42-
}
43-
res = (res * t[nd][kd]) % 5;
44-
n /= 5;
45-
k /= 5;
59+
public boolean hasSameDigits(String s) {
60+
int n = s.length();
61+
int[] xs = f(n - 2);
62+
int[] arr = new int[n];
63+
for (int i = 0; i < n; i++) {
64+
arr[i] = (int) (s.charAt(i) - '0');
65+
}
66+
int num1 = 0;
67+
int num2 = 0;
68+
for (int i = 0; i < n - 1; i++) {
69+
num1 = (num1 + xs[i] * arr[i]) % 10;
70+
num2 = (num2 + xs[i] * arr[i + 1]) % 10;
4671
}
47-
return res;
72+
return num1 == num2;
4873
}
4974
}
Original file line numberDiff line numberDiff line change
@@ -1,101 +1,79 @@
11
package g3401_3500.s3464_maximize_the_distance_between_points_on_a_square;
22

3-
// #Hard #2025_02_23_Time_222_ms_(100.00%)_Space_52.33_MB_(100.00%)
3+
// #Hard #Array #Greedy #Binary_Search #2025_02_25_Time_18_ms_(98.51%)_Space_49.78_MB_(46.27%)
44

55
import java.util.Arrays;
66

77
public class Solution {
8-
public int maxDistance(int sideLength, int[][] points, int requiredPoints) {
9-
long perimeter = 4L * sideLength;
10-
int numPoints = points.length;
11-
long[] mappedPositions = new long[numPoints];
12-
for (int i = 0; i < numPoints; i++) {
13-
mappedPositions[i] = mapToPerimeter(sideLength, points[i][0], points[i][1]);
14-
}
15-
Arrays.sort(mappedPositions);
16-
long low = 0;
17-
long high = perimeter;
18-
while (low < high) {
19-
long mid = (low + high + 1) / 2;
20-
if (isValidDistance(mid, requiredPoints, mappedPositions, perimeter)) {
21-
low = mid;
8+
public int maxDistance(int side, int[][] pts, int k) {
9+
int n = pts.length;
10+
long[] p = new long[n];
11+
for (int i = 0; i < n; i++) {
12+
int x = pts[i][0];
13+
int y = pts[i][1];
14+
long c;
15+
if (y == 0) {
16+
c = x;
17+
} else if (x == side) {
18+
c = side + y;
19+
} else if (y == side) {
20+
c = 2L * side + (side - x);
2221
} else {
23-
high = mid - 1;
22+
c = 3L * side + (side - y);
2423
}
24+
p[i] = c;
2525
}
26-
return (int) low;
27-
}
28-
29-
private long mapToPerimeter(int sideLength, int x, int y) {
30-
if (y == sideLength) {
31-
return x;
32-
}
33-
if (x == sideLength) {
34-
return sideLength + (long) (sideLength - y);
35-
}
36-
if (y == 0) {
37-
return 2L * sideLength + (sideLength - x);
26+
Arrays.sort(p);
27+
long c = 4L * side;
28+
int tot = 2 * n;
29+
long[] dArr = new long[tot];
30+
for (int i = 0; i < n; i++) {
31+
dArr[i] = p[i];
32+
dArr[i + n] = p[i] + c;
3833
}
39-
return 3L * sideLength + y;
40-
}
41-
42-
private boolean isValidDistance(
43-
long minDistance, int requiredPoints, long[] mappedPositions, long perimeter) {
44-
int numPoints = mappedPositions.length;
45-
long[] extendedPositions = new long[2 * numPoints];
46-
for (int i = 0; i < numPoints; i++) {
47-
extendedPositions[i] = mappedPositions[i];
48-
extendedPositions[i + numPoints] = mappedPositions[i] + perimeter;
49-
}
50-
for (int i = 0; i < numPoints; i++) {
51-
if (canSelectRequiredPoints(
52-
i,
53-
minDistance,
54-
requiredPoints,
55-
mappedPositions,
56-
extendedPositions,
57-
perimeter)) {
58-
return true;
34+
int lo = 0;
35+
int hi = 2 * side;
36+
int ans = 0;
37+
while (lo <= hi) {
38+
int mid = (lo + hi) >>> 1;
39+
if (check(mid, dArr, n, k, c)) {
40+
ans = mid;
41+
lo = mid + 1;
42+
} else {
43+
hi = mid - 1;
5944
}
6045
}
61-
return false;
46+
return ans;
6247
}
6348

64-
private boolean canSelectRequiredPoints(
65-
int startIndex,
66-
long minDistance,
67-
int requiredPoints,
68-
long[] mappedPositions,
69-
long[] extendedPositions,
70-
long perimeter) {
71-
int selectedCount = 1;
72-
long previousPosition = mappedPositions[startIndex];
73-
int currentIndex = startIndex;
74-
for (int i = 1; i < requiredPoints; i++) {
75-
long targetPosition = previousPosition + minDistance;
76-
int left = currentIndex + 1;
77-
int right = startIndex + mappedPositions.length;
78-
int nextIndex = lowerBound(extendedPositions, left, right, targetPosition);
79-
if (nextIndex >= right) {
80-
return false;
49+
private boolean check(int d, long[] dArr, int n, int k, long c) {
50+
int len = dArr.length;
51+
int[] nxt = new int[len];
52+
int j = 0;
53+
for (int i = 0; i < len; i++) {
54+
if (j < i + 1) {
55+
j = i + 1;
56+
}
57+
while (j < len && dArr[j] < dArr[i] + d) {
58+
j++;
8159
}
82-
selectedCount++;
83-
previousPosition = extendedPositions[nextIndex];
84-
currentIndex = nextIndex;
60+
nxt[i] = (j < len) ? j : -1;
8561
}
86-
return selectedCount == requiredPoints
87-
&& (previousPosition - mappedPositions[startIndex] <= perimeter - minDistance);
88-
}
89-
90-
private int lowerBound(long[] arr, int left, int right, long target) {
91-
while (left < right) {
92-
int mid = left + (right - left) / 2;
93-
if (arr[mid] >= target) {
94-
right = mid;
95-
} else {
96-
left = mid + 1;
62+
for (int i = 0; i < n; i++) {
63+
int cnt = 1;
64+
int cur = i;
65+
while (cnt < k) {
66+
int nx = nxt[cur];
67+
if (nx == -1 || nx >= i + n) {
68+
break;
69+
}
70+
cur = nx;
71+
cnt++;
72+
}
73+
if (cnt == k && (dArr[i] + c - dArr[cur]) >= d) {
74+
return true;
9775
}
9876
}
99-
return left;
77+
return false;
10078
}
10179
}

0 commit comments

Comments
 (0)