@@ -6,42 +6,39 @@ def splitArray(self, nums: List[int], k: int) -> int:
6
6
for i , num in enumerate (nums ):
7
7
total += num
8
8
prefix [i + 1 ] = total
9
- dp = [[float ('inf' )] * (k + 1 ) for _ in range (n )]
10
- for i in range (n ):
11
- dp [i ][1 ] = prefix [i + 1 ] - prefix [0 ]
12
9
10
+ dp = [[float ('inf' ) for _ in range (k + 1 )] for _ in range (n )]
11
+ for end in range (n ):
12
+ dp [end ][1 ] = prefix [end + 1 ] - prefix [0 ]
13
+
13
14
for end in range (n ):
14
15
for interval in range (2 , k + 1 ):
15
16
for cut in range (end , interval - 2 , - 1 ):
16
- cur_res = max (dp [cut - 1 ][interval - 1 ], prefix [end + 1 ] - prefix [cut ])
17
- dp [end ][interval ] = min (dp [end ][interval ], cur_res )
18
-
17
+ largest_sum = max (dp [cut - 1 ][interval - 1 ], prefix [end + 1 ] - prefix [cut ])
18
+ dp [end ][interval ] = min (dp [end ][interval ], largest_sum )
19
19
return dp [n - 1 ][k ]
20
20
21
- # time O(n** 2 * k)
21
+ # time O(n**2 * k)
22
22
# space O(nk)
23
23
# using dynamic programming and interval (start from one interval)
24
24
25
25
class Solution :
26
26
def splitArray (self , nums : List [int ], k : int ) -> int :
27
27
28
- def valid (limit ):
28
+ def valid (bound ):
29
+ group = 1
29
30
total = 0
30
- group = 0
31
31
for num in nums :
32
- if num > limit :
32
+ if num > bound :
33
33
return False
34
- if total + num <= limit :
35
- total += num
36
- else :
34
+ if total + num > bound :
37
35
group += 1
38
36
total = num
39
- if total :
40
- group += 1
37
+ else :
38
+ total += num
41
39
return group <= k
42
40
43
- total = sum (nums )
44
- left , right , boundary = 0 , total , - 1
41
+ left , right , boundary = 0 , sum (nums ), - 1
45
42
while left <= right :
46
43
m = (left + right ) // 2
47
44
if valid (m ):
0 commit comments