Skip to content

Commit 6ff7232

Browse files
committed
Improved tasks 3360-3367
1 parent 6fa1a6e commit 6ff7232

File tree

11 files changed

+154
-66
lines changed

11 files changed

+154
-66
lines changed

src/main/kotlin/g3301_3400/s3360_stone_removal_game/Solution.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package g3301_3400.s3360_stone_removal_game
22

3-
// #Easy #Math #Simulation #2024_11_24_Time_0_ms_(100.00%)_Space_33.5_MB_(100.00%)
3+
// #Easy #Math #Simulation #2024_12_03_Time_0_ms_(100.00%)_Space_34.3_MB_(6.00%)
44

55
class Solution {
66
fun canAliceWin(n: Int): Boolean {
Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,42 @@
11
package g3301_3400.s3361_shift_distance_between_two_strings
22

3-
// #Medium #Array #String #Prefix_Sum #2024_11_24_Time_425_ms_(100.00%)_Space_41_MB_(100.00%)
3+
// #Medium #Array #String #Prefix_Sum #2024_12_03_Time_350_ms_(82.50%)_Space_41.7_MB_(57.50%)
44

55
import kotlin.math.min
66

77
class Solution {
88
fun shiftDistance(s: String, t: String, nextCost: IntArray, previousCost: IntArray): Long {
9-
var sum: Long = 0
10-
val n = s.length
11-
for (i in 0..<n) {
12-
val ch1 = s[i].code - 'a'.code
13-
val ch2 = t[i].code - 'a'.code
14-
val forwardDiff = (ch2 - ch1 + 26) % 26
15-
var forwardCost: Long = 0
16-
for (j in 0..<forwardDiff) {
17-
forwardCost += nextCost[(ch1 + j) % 26].toLong()
9+
val costs = Array<LongArray?>(26) { LongArray(26) }
10+
var cost: Long
11+
for (i in 0..25) {
12+
cost = nextCost[i].toLong()
13+
var j = if (i == 25) 0 else i + 1
14+
while (j != i) {
15+
costs[i]!![j] = cost
16+
cost += nextCost[j].toLong()
17+
if (j == 25) {
18+
j = -1
19+
}
20+
j++
1821
}
19-
val reverseDiff = (26 + ch1 - ch2) % 26
20-
var backwardCost: Long = 0
21-
for (j in 0..<reverseDiff) {
22-
backwardCost += previousCost[(ch1 - j + 26) % 26].toLong()
22+
}
23+
for (i in 0..25) {
24+
cost = previousCost[i].toLong()
25+
var j = if (i == 0) 25 else i - 1
26+
while (j != i) {
27+
costs[i]!![j] = min(costs[i]!![j].toDouble(), cost.toDouble()).toLong()
28+
cost += previousCost[j].toLong()
29+
if (j == 0) {
30+
j = 26
31+
}
32+
j--
2333
}
24-
sum = sum + min(forwardCost, backwardCost)
2534
}
26-
return sum
35+
val n = s.length
36+
var ans: Long = 0
37+
for (i in 0..<n) {
38+
ans += costs[s[i].code - 'a'.code]!![t[i].code - 'a'.code]
39+
}
40+
return ans
2741
}
2842
}

src/main/kotlin/g3301_3400/s3362_zero_array_transformation_iii/Solution.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
package g3301_3400.s3362_zero_array_transformation_iii
22

33
// #Medium #Array #Sorting #Greedy #Heap_Priority_Queue #Prefix_Sum
4-
// #2024_11_24_Time_217_ms_(100.00%)_Space_105.7_MB_(100.00%)
4+
// #2024_12_03_Time_195_ms_(81.82%)_Space_106.3_MB_(72.73%)
55

66
import java.util.PriorityQueue
77

88
class Solution {
99
fun maxRemoval(nums: IntArray, queries: Array<IntArray>): Int {
10-
queries.sortWith { a: IntArray, b: IntArray -> a[0] - b[0] }
10+
queries.sortWith { a: IntArray?, b: IntArray? -> a!![0] - b!![0] }
1111
val last = PriorityQueue<Int?>(Comparator { a: Int?, b: Int? -> b!! - a!! })
1212
val diffs = IntArray(nums.size + 1)
1313
var idx = 0

src/main/kotlin/g3301_3400/s3363_find_the_maximum_number_of_fruits_collected/Solution.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package g3301_3400.s3363_find_the_maximum_number_of_fruits_collected
22

3-
// #Hard #Array #Dynamic_Programming #Matrix #2024_11_24_Time_53_ms_(100.00%)_Space_162_MB_(100.00%)
3+
// #Hard #Array #Dynamic_Programming #Matrix
4+
// #2024_12_03_Time_39_ms_(88.89%)_Space_161.2_MB_(100.00%)
45

56
import kotlin.math.max
67

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,29 @@
11
package g3301_3400.s3364_minimum_positive_sum_subarray
22

3-
// #Easy #Array #Prefix_Sum #Sliding_Window #2024_11_24_Time_24_ms_(100.00%)_Space_38_MB_(100.00%)
3+
// #Easy #Array #Prefix_Sum #Sliding_Window #2024_12_03_Time_3_ms_(98.15%)_Space_38.1_MB_(33.33%)
4+
5+
import kotlin.math.min
46

57
class Solution {
6-
fun minimumSumSubarray(nums: List<Int>, l: Int, r: Int): Int {
7-
val size = nums.size
8-
var res = -1
9-
for (s in l..r) {
10-
for (i in 0..size - s) {
11-
var sum = 0
12-
for (j in i..<i + s) {
13-
sum += nums[j]
14-
}
15-
if (sum > 0 && (res == -1 || res > sum)) {
16-
res = sum
8+
fun minimumSumSubarray(li: List<Int>, l: Int, r: Int): Int {
9+
val n = li.size
10+
var min = Int.Companion.MAX_VALUE
11+
val a = IntArray(n + 1)
12+
for (i in 1..n) {
13+
a[i] = a[i - 1] + li[i - 1]
14+
}
15+
for (size in l..r) {
16+
for (i in size - 1..<n) {
17+
val sum = a[i + 1] - a[i + 1 - size]
18+
if (sum > 0) {
19+
min = min(min, sum)
1720
}
1821
}
1922
}
20-
return res
23+
return if (min == Int.Companion.MAX_VALUE) {
24+
-1
25+
} else {
26+
min
27+
}
2128
}
2229
}

src/main/kotlin/g3301_3400/s3365_rearrange_k_substrings_to_form_target_string/Solution.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package g3301_3400.s3365_rearrange_k_substrings_to_form_target_string
22

3-
// #Medium #String #Hash_Table #Sorting #2024_11_24_Time_490_ms_(100.00%)_Space_50.5_MB_(100.00%)
3+
// #Medium #String #Hash_Table #Sorting #2024_12_03_Time_457_ms_(100.00%)_Space_51.5_MB_(81.40%)
44

55
class Solution {
66
fun isPossibleToRearrange(s: String, t: String, k: Int): Boolean {
Lines changed: 67 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,80 @@
11
package g3301_3400.s3366_minimum_array_sum
22

3-
// #Medium #Array #Dynamic_Programming #2024_11_24_Time_59_ms_(100.00%)_Space_53.4_MB_(100.00%)
4-
5-
import kotlin.math.ceil
6-
import kotlin.math.min
3+
// #Medium #Array #Dynamic_Programming #2024_12_03_Time_15_ms_(100.00%)_Space_39.5_MB_(92.86%)
74

85
class Solution {
96
fun minArraySum(nums: IntArray, k: Int, op1: Int, op2: Int): Int {
10-
val dp = Array<Array<Array<Int?>?>?>(nums.size) { Array<Array<Int?>?>(op1 + 1) { arrayOfNulls<Int>(op2 + 1) } }
11-
return sub(dp, nums, 0, k, op1, op2)
12-
}
13-
14-
private fun sub(dp: Array<Array<Array<Int?>?>?>, nums: IntArray, i: Int, k: Int, op1: Int, op2: Int): Int {
15-
if (i == nums.size) {
16-
return 0
17-
}
18-
if (dp[i]!![op1]!![op2] != null) {
19-
return dp[i]!![op1]!![op2]!!
7+
var op1 = op1
8+
var op2 = op2
9+
nums.sort()
10+
val high = lowerBound(nums, k * 2 - 1)
11+
val low = lowerBound(nums, k)
12+
val n = nums.size
13+
for (i in n - 1 downTo high) {
14+
if (op1 > 0) {
15+
nums[i] = (nums[i] + 1) / 2
16+
op1--
17+
}
18+
if (op2 > 0) {
19+
nums[i] -= k
20+
op2--
21+
}
2022
}
21-
var res = sub(dp, nums, i + 1, k, op1, op2) + nums[i]
22-
if (nums[i] >= k && op2 > 0) {
23-
res = min(res, (sub(dp, nums, i + 1, k, op1, op2 - 1) + nums[i] - k))
24-
var v = ceil(nums[i] / 2.0)
25-
if (v < k) {
26-
v = ceil((nums[i] - k) / 2.0)
23+
val count: MutableMap<Int?, Int?> = HashMap<Int?, Int?>()
24+
var odd = 0
25+
for (i in low..<high) {
26+
if (op2 > 0) {
27+
nums[i] -= k
28+
if (k % 2 > 0 && nums[i] % 2 > 0) {
29+
count.merge(nums[i], 1) { a: Int?, b: Int? -> Integer.sum(a!!, b!!) }
30+
}
31+
op2--
2732
} else {
28-
v -= k
33+
odd += nums[i] % 2
2934
}
30-
if (op1 > 0) {
31-
res = min(res, (sub(dp, nums, i + 1, k, op1 - 1, op2 - 1) + v).toInt())
35+
}
36+
nums.sort(0, high)
37+
var ans = 0
38+
if (k % 2 > 0) {
39+
var i = high - op1
40+
while (i < high && odd > 0) {
41+
val x = nums[i]
42+
if (count.containsKey(x)) {
43+
if (count.merge(x, -1) { a: Int?, b: Int? ->
44+
Integer.sum(a!!, b!!)
45+
} == 0
46+
) {
47+
count.remove(x)
48+
}
49+
odd--
50+
ans--
51+
}
52+
i++
3253
}
3354
}
34-
if (op1 > 0) {
35-
val v = ceil(nums[i] / 2.0)
36-
res = min(res, (sub(dp, nums, i + 1, k, op1 - 1, op2) + v).toInt())
55+
var i = high - 1
56+
while (i >= 0 && op1 > 0) {
57+
nums[i] = (nums[i] + 1) / 2
58+
i--
59+
op1--
60+
}
61+
for (x in nums) {
62+
ans += x
63+
}
64+
return ans
65+
}
66+
67+
private fun lowerBound(nums: IntArray, target: Int): Int {
68+
var left = -1
69+
var right = nums.size
70+
while (left + 1 < right) {
71+
val mid = (left + right) ushr 1
72+
if (nums[mid] >= target) {
73+
right = mid
74+
} else {
75+
left = mid
76+
}
3777
}
38-
dp[i]!![op1]!![op2] = res
39-
return res
78+
return right
4079
}
4180
}

src/main/kotlin/g3301_3400/s3367_maximize_sum_of_weights_after_edge_removals/Solution.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package g3301_3400.s3367_maximize_sum_of_weights_after_edge_removals
22

33
// #Hard #Dynamic_Programming #Depth_First_Search #Tree
4-
// #2024_11_27_Time_118_ms_(100.00%)_Space_140.5_MB_(100.00%)
4+
// #2024_12_03_Time_113_ms_(100.00%)_Space_141.5_MB_(81.82%)
55

66
import java.util.PriorityQueue
77
import kotlin.math.max
@@ -33,7 +33,7 @@ class Solution {
3333
continue
3434
}
3535
val res = dfs(w, v)
36-
val max = max((e[2] + res[0]), res[1])
36+
val max = max(e[2] + res[0], res[1])
3737
sum += max
3838
pq.add(max - res[1])
3939
}

src/test/kotlin/g3301_3400/s3364_minimum_positive_sum_subarray/SolutionTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ internal class SolutionTest {
2424
@Test
2525
fun minimumSumSubarray3() {
2626
assertThat<Int>(
27-
Solution().minimumSumSubarray(mutableListOf<Int>(1, 2, 3, 4), 2, 4),
27+
Solution().minimumSumSubarray(listOf<Int>(1, 2, 3, 4), 2, 4),
2828
equalTo<Int>(3),
2929
)
3030
}

src/test/kotlin/g3301_3400/s3366_minimum_array_sum/SolutionTest.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,20 @@ internal class SolutionTest {
2020
equalTo<Int>(3),
2121
)
2222
}
23+
24+
@Test
25+
fun minArraySum3() {
26+
assertThat<Int>(
27+
Solution()
28+
.minArraySum(
29+
intArrayOf(
30+
1, 3, 5, 7, 9, 12, 12, 12, 13, 15, 15, 15, 16, 17, 19, 20,
31+
),
32+
11,
33+
15,
34+
4,
35+
),
36+
equalTo<Int>(77),
37+
)
38+
}
2339
}

0 commit comments

Comments
 (0)