Skip to content

Commit 3c5fbae

Browse files
committed
Improved tasks
1 parent d8bb548 commit 3c5fbae

File tree

5 files changed

+138
-147
lines changed
  • src/main/kotlin/g3401_3500
    • s3436_find_valid_emails
    • 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

5 files changed

+138
-147
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Write your MySQL query statement below
2-
# #Easy #2025_02_04_Time_451_ms_(70.84%)_Space_0.0_MB_(100.00%)
2+
# #Easy #Database #2025_02_04_Time_451_ms_(70.84%)_Space_0.0_MB_(100.00%)
33
select user_id, email from users
44
where email regexp '^[A-Za-z0-9_]+@[A-Za-z][A-Za-z0-9_]*\.com$'
55
order by user_id
Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
11
package g3401_3500.s3461_check_if_digits_are_equal_in_string_after_operations_i
22

3-
// #Easy #2025_02_23_Time_8_ms_(100.00%)_Space_37.90_MB_(100.00%)
3+
// #Easy #String #Math #Simulation #Number_Theory #Combinatorics
4+
// #2025_02_25_Time_3_ms_(100.00%)_Space_35.54_MB_(100.00%)
45

56
class Solution {
67
fun hasSameDigits(s: String): Boolean {
7-
var s = s
8-
var n = s.length
9-
while (n > 2) {
10-
val nstr = StringBuilder()
11-
for (i in 1..<n) {
12-
val next = ((s[i].code - '0'.code) + (s[i - 1].code - '0'.code)) % 10
13-
nstr.append(next)
8+
val ch = s.toCharArray()
9+
var k = ch.size - 1
10+
while (k != 1) {
11+
for (i in 0..<k) {
12+
val a = ch[i].code - 48
13+
val b = ch[i + 1].code - 48
14+
val d = (a + b) % 10
15+
val c = (d + '0'.code).toChar()
16+
ch[i] = c
1417
}
15-
n--
16-
s = nstr.toString()
18+
k--
1719
}
18-
return s[0] == s[1]
20+
return ch[0] == ch[1]
1921
}
2022
}

src/main/kotlin/g3401_3500/s3462_maximum_sum_with_at_most_k_elements/Solution.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package g3401_3500.s3462_maximum_sum_with_at_most_k_elements
22

3-
// #Medium #2025_02_23_Time_202_ms_(100.00%)_Space_107.52_MB_(100.00%)
3+
// #Medium #Array #Sorting #Greedy #Matrix #Heap_(Priority_Queue)
4+
// #2025_02_25_Time_197_ms_(86.21%)_Space_106.34_MB_(6.90%)
45

56
import java.util.Collections
67
import java.util.PriorityQueue
@@ -11,7 +12,7 @@ class Solution {
1112
return 0
1213
}
1314
val pq = PriorityQueue<Int>(Collections.reverseOrder<Int>())
14-
var temp: PriorityQueue<Int>?
15+
var temp: PriorityQueue<Int>
1516
for (i in grid.indices) {
1617
temp = PriorityQueue<Int>(Collections.reverseOrder<Int>())
1718
for (j in grid[i].indices) {
Lines changed: 62 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,76 @@
11
package g3401_3500.s3463_check_if_digits_are_equal_in_string_after_operations_ii
22

3-
// #Hard #2025_02_23_Time_63_ms_(100.00%)_Space_44.31_MB_(100.00%)
3+
// #Hard #String #Math #Number_Theory #Combinatorics
4+
// #2025_02_25_Time_38_ms_(100.00%)_Space_45.90_MB_(11.11%)
45

56
class Solution {
6-
fun hasSameDigits(s: String): Boolean {
7-
val n = s.length
8-
val nMunus2 = n - 2
9-
var f0 = 0
10-
var f1 = 0
11-
for (j in 0..nMunus2) {
12-
val c = binomMod10(nMunus2, j)
13-
f0 = (f0 + c * (s[j].code - '0'.code)) % 10
14-
f1 = (f1 + c * (s[j + 1].code - '0'.code)) % 10
7+
private fun powMod10(a: Int, n: Int): Int {
8+
var a = a
9+
var n = n
10+
var x = 1
11+
while (n >= 1) {
12+
if (n % 2 == 1) {
13+
x = (x * a) % 10
14+
}
15+
a = (a * a) % 10
16+
n /= 2
1517
}
16-
return f0 == f1
18+
return x
1719
}
1820

19-
private fun binomMod10(n: Int, k: Int): Int {
20-
val r2 = binomMod2(n, k)
21-
val r5 = binomMod5(n, k)
22-
for (x in 0..9) {
23-
if (x % 2 == r2 && x % 5 == r5) {
24-
return x
21+
private fun f(n: Int): IntArray {
22+
val ns = IntArray(n + 1)
23+
val n2 = IntArray(n + 1)
24+
val n5 = IntArray(n + 1)
25+
ns[0] = 1
26+
for (i in 1..n) {
27+
var m = i
28+
n2[i] = n2[i - 1]
29+
n5[i] = n5[i - 1]
30+
while (m % 2 == 0) {
31+
m /= 2
32+
n2[i]++
2533
}
34+
while (m % 5 == 0) {
35+
m /= 5
36+
n5[i]++
37+
}
38+
ns[i] = (ns[i - 1] * m) % 10
2639
}
27-
return 0
28-
}
29-
30-
private fun binomMod2(n: Int, k: Int): Int {
31-
return if ((n and k) == k) 1 else 0
40+
val inv = IntArray(10)
41+
for (i in 1..9) {
42+
for (j in 0..9) {
43+
if (i * j % 10 == 1) {
44+
inv[i] = j
45+
}
46+
}
47+
}
48+
val xs = IntArray(n + 1)
49+
for (k in 0..n) {
50+
var a = 0
51+
val s2 = n2[n] - n2[n - k] - n2[k]
52+
val s5 = n5[n] - n5[n - k] - n5[k]
53+
if (s2 == 0 || s5 == 0) {
54+
a = (ns[n] * inv[ns[n - k]] * inv[ns[k]] * powMod10(2, s2) * powMod10(5, s5)) % 10
55+
}
56+
xs[k] = a
57+
}
58+
return xs
3259
}
3360

34-
private fun binomMod5(n: Int, k: Int): Int {
35-
var n = n
36-
var k = k
37-
val t = arrayOf<IntArray>(
38-
intArrayOf(1),
39-
intArrayOf(1, 1),
40-
intArrayOf(1, 2, 1),
41-
intArrayOf(1, 3, 3, 1),
42-
intArrayOf(1, 4, 1, 4, 1),
43-
)
44-
var res = 1
45-
while (n > 0 || k > 0) {
46-
val nd = n % 5
47-
val kd = k % 5
48-
if (kd > nd) {
49-
return 0
50-
}
51-
res = (res * t[nd][kd]) % 5
52-
n /= 5
53-
k /= 5
61+
fun hasSameDigits(s: String): Boolean {
62+
val n = s.length
63+
val xs = f(n - 2)
64+
val arr = IntArray(n)
65+
for (i in 0..<n) {
66+
arr[i] = s.get(i).code - '0'.code
67+
}
68+
var num1 = 0
69+
var num2 = 0
70+
for (i in 0..<n - 1) {
71+
num1 = (num1 + xs[i] * arr[i]) % 10
72+
num2 = (num2 + xs[i] * arr[i + 1]) % 10
5473
}
55-
return res
74+
return num1 == num2
5675
}
5776
}
Lines changed: 59 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -1,108 +1,77 @@
11
package g3401_3500.s3464_maximize_the_distance_between_points_on_a_square
22

3-
// #Hard #2025_02_23_Time_159_ms_(100.00%)_Space_67.20_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
class Solution {
6-
fun maxDistance(sideLength: Int, points: Array<IntArray>, requiredPoints: Int): Int {
7-
val perimeter = 4L * sideLength
8-
val numPoints = points.size
9-
val mappedPositions = LongArray(numPoints)
10-
for (i in 0..<numPoints) {
11-
mappedPositions[i] = mapToPerimeter(sideLength, points[i][0], points[i][1])
12-
}
13-
mappedPositions.sort()
14-
var low: Long = 0
15-
var high = perimeter
16-
while (low < high) {
17-
val mid = (low + high + 1) / 2
18-
if (isValidDistance(mid, requiredPoints, mappedPositions, perimeter)) {
19-
low = mid
6+
fun maxDistance(side: Int, points: Array<IntArray>, k: Int): Int {
7+
val n = points.size
8+
val p = LongArray(n)
9+
for (i in 0..<n) {
10+
val x = points[i][0]
11+
val y = points[i][1]
12+
val c: Long
13+
if (y == 0) {
14+
c = x.toLong()
15+
} else if (x == side) {
16+
c = side + y.toLong()
17+
} else if (y == side) {
18+
c = 2L * side + (side - x)
2019
} else {
21-
high = mid - 1
20+
c = 3L * side + (side - y)
2221
}
22+
p[i] = c
2323
}
24-
return low.toInt()
25-
}
26-
27-
private fun mapToPerimeter(sideLength: Int, x: Int, y: Int): Long {
28-
if (y == sideLength) {
29-
return x.toLong()
30-
}
31-
if (x == sideLength) {
32-
return sideLength + (sideLength - y).toLong()
33-
}
34-
if (y == 0) {
35-
return 2L * sideLength + (sideLength - x)
24+
p.sort()
25+
val c = 4L * side
26+
val tot = 2 * n
27+
val dArr = LongArray(tot)
28+
for (i in 0..<n) {
29+
dArr[i] = p[i]
30+
dArr[i + n] = p[i] + c
3631
}
37-
return 3L * sideLength + y
38-
}
39-
40-
private fun isValidDistance(
41-
minDistance: Long,
42-
requiredPoints: Int,
43-
mappedPositions: LongArray,
44-
perimeter: Long,
45-
): Boolean {
46-
val numPoints = mappedPositions.size
47-
val extendedPositions = LongArray(2 * numPoints)
48-
for (i in 0..<numPoints) {
49-
extendedPositions[i] = mappedPositions[i]
50-
extendedPositions[i + numPoints] = mappedPositions[i] + perimeter
51-
}
52-
for (i in 0..<numPoints) {
53-
if (canSelectRequiredPoints(
54-
i,
55-
minDistance,
56-
requiredPoints,
57-
mappedPositions,
58-
extendedPositions,
59-
perimeter,
60-
)
61-
) {
62-
return true
32+
var lo = 0
33+
var hi = 2 * side
34+
var ans = 0
35+
while (lo <= hi) {
36+
val mid = (lo + hi) ushr 1
37+
if (check(mid, dArr, n, k, c)) {
38+
ans = mid
39+
lo = mid + 1
40+
} else {
41+
hi = mid - 1
6342
}
6443
}
65-
return false
44+
return ans
6645
}
6746

68-
private fun canSelectRequiredPoints(
69-
startIndex: Int,
70-
minDistance: Long,
71-
requiredPoints: Int,
72-
mappedPositions: LongArray,
73-
extendedPositions: LongArray,
74-
perimeter: Long,
75-
): Boolean {
76-
var selectedCount = 1
77-
var previousPosition = mappedPositions[startIndex]
78-
var currentIndex = startIndex
79-
for (i in 1..<requiredPoints) {
80-
val targetPosition = previousPosition + minDistance
81-
val left = currentIndex + 1
82-
val right = startIndex + mappedPositions.size
83-
val nextIndex = lowerBound(extendedPositions, left, right, targetPosition)
84-
if (nextIndex >= right) {
85-
return false
47+
private fun check(d: Int, dArr: LongArray, n: Int, k: Int, c: Long): Boolean {
48+
val len = dArr.size
49+
val nxt = IntArray(len)
50+
var j = 0
51+
for (i in 0..<len) {
52+
if (j < i + 1) {
53+
j = i + 1
54+
}
55+
while (j < len && dArr[j] < dArr[i] + d) {
56+
j++
8657
}
87-
selectedCount++
88-
previousPosition = extendedPositions[nextIndex]
89-
currentIndex = nextIndex
58+
nxt[i] = if (j < len) j else -1
9059
}
91-
return selectedCount == requiredPoints &&
92-
(previousPosition - mappedPositions[startIndex] <= perimeter - minDistance)
93-
}
94-
95-
private fun lowerBound(arr: LongArray, left: Int, right: Int, target: Long): Int {
96-
var left = left
97-
var right = right
98-
while (left < right) {
99-
val mid = left + (right - left) / 2
100-
if (arr[mid] >= target) {
101-
right = mid
102-
} else {
103-
left = mid + 1
60+
for (i in 0..<n) {
61+
var cnt = 1
62+
var cur = i
63+
while (cnt < k) {
64+
val nx = nxt[cur]
65+
if (nx == -1 || nx >= i + n) {
66+
break
67+
}
68+
cur = nx
69+
cnt++
70+
}
71+
if (cnt == k && (dArr[i] + c - dArr[cur]) >= d) {
72+
return true
10473
}
10574
}
106-
return left
75+
return false
10776
}
10877
}

0 commit comments

Comments
 (0)