|
1 | 1 | package g3401_3500.s3414_maximum_score_of_non_overlapping_intervals
|
2 | 2 |
|
| 3 | +// #Hard #Array #Dynamic_Programming #Sorting #Binary_Search |
| 4 | +// #2025_01_08_Time_920_(100.00%)_Space_112.32_(93.33%) |
| 5 | + |
3 | 6 | class Solution {
|
4 | 7 | fun maximumWeight(intervals: List<List<Int>>): IntArray {
|
5 | 8 | val n = intervals.size
|
6 |
| - val ns = arrayOfNulls<IntArray>(n) |
| 9 | + val ns = Array<IntArray>(n) { IntArray(0) } |
7 | 10 | var p = 0
|
8 | 11 | for (li in intervals) {
|
9 | 12 | ns[p] = intArrayOf(li[0], li[1], li[2], p)
|
10 | 13 | p++
|
11 | 14 | }
|
12 |
| - var dp1 = Array<IntArray?>(n) { IntArray(0) } |
| 15 | + var dp1 = Array<IntArray>(n) { IntArray(0) } |
13 | 16 | var dp = LongArray(n)
|
14 | 17 | ns.sortWith { a: IntArray?, b: IntArray? -> a!![0] - b!![0] }
|
15 |
| - for (k in 0..3) { |
16 |
| - val dp3 = arrayOfNulls<IntArray>(n) |
| 18 | + (0..3).forEach { k -> |
| 19 | + val dp3 = Array<IntArray>(n) { IntArray(0) } |
17 | 20 | val dp2 = LongArray(n)
|
18 |
| - dp3[n - 1] = intArrayOf(ns[n - 1]!![3]) |
19 |
| - dp2[n - 1] = ns[n - 1]!![2].toLong() |
| 21 | + dp3[n - 1] = intArrayOf(ns[n - 1][3]) |
| 22 | + dp2[n - 1] = ns[n - 1][2].toLong() |
20 | 23 | for (i in n - 2 downTo 0) {
|
21 | 24 | var l = i + 1
|
22 | 25 | var r = n - 1
|
23 | 26 | while (l <= r) {
|
24 | 27 | val mid = (l + r) shr 1
|
25 |
| - if (ns[mid]!![0] > ns[i]!![1]) { |
| 28 | + if (ns[mid][0] > ns[i][1]) { |
26 | 29 | r = mid - 1
|
27 | 30 | } else {
|
28 | 31 | l = mid + 1
|
29 | 32 | }
|
30 | 33 | }
|
31 |
| - dp2[i] = ns[i]!![2] + (if (l < n) dp[l] else 0) |
| 34 | + dp2[i] = ns[i][2] + (if (l < n) dp[l] else 0) |
32 | 35 | if (i + 1 < n && dp2[i + 1] > dp2[i]) {
|
33 | 36 | dp2[i] = dp2[i + 1]
|
34 | 37 | dp3[i] = dp3[i + 1]
|
35 | 38 | } else {
|
36 | 39 | if (l < n) {
|
37 |
| - dp3[i] = IntArray(dp1[l]!!.size + 1) |
38 |
| - dp3[i]!![0] = ns[i]!![3] |
39 |
| - for (j in dp1[l]!!.indices) { |
40 |
| - dp3[i]!![j + 1] = dp1[l]!![j] |
| 40 | + dp3[i] = IntArray(dp1[l].size + 1) |
| 41 | + dp3[i][0] = ns[i][3] |
| 42 | + for (j in dp1[l].indices) { |
| 43 | + dp3[i][j + 1] = dp1[l][j] |
41 | 44 | }
|
42 |
| - dp3[i]?.sort() |
| 45 | + dp3[i].sort() |
43 | 46 | } else {
|
44 |
| - dp3[i] = intArrayOf(ns[i]!![3]) |
| 47 | + dp3[i] = intArrayOf(ns[i][3]) |
45 | 48 | }
|
46 |
| - if (i + 1 < n && dp2[i + 1] == dp2[i] && check(dp3[i]!!, dp3[i + 1]!!) > 0) { |
| 49 | + if (i + 1 < n && dp2[i + 1] == dp2[i] && check(dp3[i], dp3[i + 1]) > 0) { |
47 | 50 | dp3[i] = dp3[i + 1]
|
48 | 51 | }
|
49 | 52 | }
|
50 | 53 | }
|
51 | 54 | dp = dp2
|
52 | 55 | dp1 = dp3
|
53 | 56 | }
|
54 |
| - return dp1[0]!! |
| 57 | + return dp1[0] |
55 | 58 | }
|
56 | 59 |
|
57 | 60 | private fun check(ns1: IntArray, ns2: IntArray): Int {
|
|
0 commit comments