|
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