@@ -73,85 +73,127 @@ import kotlin.math.min
7373class Solution {
7474 fun maxWalls (robots : IntArray , distance : IntArray , walls : IntArray ): Int {
7575 if (robots.size == 1 ) {
76- var a = 0
77- var b = 0
78- for (wall in walls) {
79- if (wall < robots[0 ] - distance[0 ] || wall > robots[0 ] + distance[0 ]) {
80- continue
81- }
82- if (wall < robots[0 ]) {
83- a++
84- } else if (wall > robots[0 ]) {
85- b++
86- } else {
87- a++
88- b++
89- }
90- }
91- return max(a, b)
76+ return handleSingleRobot(robots[0 ], distance[0 ], walls)
9277 }
93- val arr = Array < IntArray > (robots.size) { i -> intArrayOf(robots[i] , distance[i]) }
94- arr.sortWith { a: IntArray , b: IntArray -> a[0 ] - b[0 ] }
78+ val arr = buildRobotArray (robots, distance)
79+ arr.sortWith { a: IntArray , b: IntArray -> if ( a[0 ] == b[ 0 ]) (a[ 1 ] - b[1 ]) else (a[ 0 ] - b[ 0 ]) }
9580 walls.sort()
96- var a = 0
97- var b = 0
98- var i = 0
99- var j = 0
100- while (i < walls.size && walls[i] < arr[j][0 ] - arr[j][1 ]) {
101- i++
81+ return processMultipleRobots(arr, walls)
82+ }
83+
84+ private fun handleSingleRobot (robot : Int , dist : Int , walls : IntArray ): Int {
85+ var left = 0
86+ var right = 0
87+ for (wall in walls) {
88+ if (wall < robot - dist || wall > robot + dist) {
89+ continue
90+ }
91+ if (wall < robot) {
92+ left++
93+ } else if (wall > robot) {
94+ right++
95+ } else {
96+ left++
97+ right++
98+ }
10299 }
103- while (i < walls.size && walls[i] <= arr[j][0 ]) {
104- a++
105- i++
100+ return max(left, right)
101+ }
102+
103+ private fun buildRobotArray (robots : IntArray , distance : IntArray ): Array <IntArray > {
104+ val arr = Array (robots.size) { IntArray (2 ) }
105+ for (i in robots.indices) {
106+ arr[i][0 ] = robots[i]
107+ arr[i][1 ] = distance[i]
106108 }
109+ return arr
110+ }
111+
112+ private fun processMultipleRobots (arr : Array <IntArray >, walls : IntArray ): Int {
113+ var a: Int
114+ var b: Int
115+ var i = 0
116+ var j = 0
117+ i = skipWallsBeforeRange(walls, i, arr[j][0 ] - arr[j][1 ])
118+ a = countWallsUpToRobot(walls, i, arr[j][0 ])
119+ i + = a
107120 if (i > 0 && walls[i - 1 ] == arr[j][0 ]) {
108121 i--
109122 }
110- while (i < walls.size && walls[i] <= arr[j][0 ] + arr[j][1 ] && walls[i] < arr[j + 1 ][0 ]) {
111- b++
112- i++
113- }
123+ b = countWallsInRange(walls, i, arr[j][0 ] + arr[j][1 ], arr[j + 1 ][0 ])
124+ i + = b
114125 j++
115126 while (j < arr.size) {
116- var l1 = 0
117- var k = i
118- while (k < walls.size && walls[k] < arr[j][0 ] - arr[j][1 ]) {
119- k++
120- }
121- while (k < walls.size && walls[k] <= arr[j][0 ]) {
122- l1++
123- k++
124- }
125- val nextI = k
126- var l2 = l1
127- k = i - 1
128- while (k >= 0 && walls[k] > arr[j - 1 ][0 ] && walls[k] >= arr[j][0 ] - arr[j][1 ]) {
129- l2++
130- k--
131- }
132- val aNext = max(a + l2, b + l1)
133- var r = 0
134- val lim =
135- if (j < arr.size - 1 ) {
136- min(arr[j + 1 ][0 ], arr[j][0 ] + arr[j][1 ] + 1 )
137- } else {
138- arr[j][0 ] + arr[j][1 ] + 1
139- }
140- i = if (nextI > 0 && walls[nextI - 1 ] == arr[j][0 ]) {
141- nextI - 1
142- } else {
143- nextI
144- }
145- while (i < walls.size && walls[i] < lim) {
146- r++
147- i++
148- }
127+ val result = processRobotStep(arr, walls, j, i, a, b)
128+ a = result[0 ]
129+ b = result[1 ]
130+ i = result[2 ]
149131 j++
150- val bNext = max(a, b) + r
151- a = aNext
152- b = bNext
153132 }
154133 return max(a, b)
155134 }
135+
136+ private fun skipWallsBeforeRange (walls : IntArray , i : Int , limit : Int ): Int {
137+ var i = i
138+ while (i < walls.size && walls[i] < limit) {
139+ i++
140+ }
141+ return i
142+ }
143+
144+ private fun countWallsUpToRobot (walls : IntArray , i : Int , robotPos : Int ): Int {
145+ var count = 0
146+ while (i + count < walls.size && walls[i + count] <= robotPos) {
147+ count++
148+ }
149+ return count
150+ }
151+
152+ private fun countWallsInRange (walls : IntArray , i : Int , maxReach : Int , nextRobot : Int ): Int {
153+ var count = 0
154+ while (i + count < walls.size && walls[i + count] <= maxReach && walls[i + count] < nextRobot) {
155+ count++
156+ }
157+ return count
158+ }
159+
160+ private fun processRobotStep (arr : Array <IntArray >, walls : IntArray , j : Int , i : Int , a : Int , b : Int ): IntArray {
161+ var i = i
162+ var l1 = 0
163+ var k = i
164+ while (k < walls.size && walls[k] < arr[j][0 ] - arr[j][1 ]) {
165+ k++
166+ }
167+ while (k < walls.size && walls[k] <= arr[j][0 ]) {
168+ l1++
169+ k++
170+ }
171+ val nextI = k
172+ var l2 = l1
173+ k = i - 1
174+ while (k >= 0 && walls[k] > arr[j - 1 ][0 ] && walls[k] >= arr[j][0 ] - arr[j][1 ]) {
175+ l2++
176+ k--
177+ }
178+ val aNext = max(a + l2, b + l1)
179+ var r = 0
180+ val lim =
181+ if (j < arr.size - 1 ) {
182+ min(arr[j + 1 ][0 ], arr[j][0 ] + arr[j][1 ] + 1 )
183+ } else {
184+ arr[j][0 ] + arr[j][1 ] + 1
185+ }
186+ i = if (nextI > 0 && walls[nextI - 1 ] == arr[j][0 ]) {
187+ nextI - 1
188+ } else {
189+ nextI
190+ }
191+ while (i < walls.size && walls[i] < lim) {
192+ r++
193+ i++
194+ }
195+ val bNext = max(a, b) + r
196+ return intArrayOf(aNext, bNext, i)
197+ }
156198}
157199```
0 commit comments