##### Short Problem Definition:

Divide array A into K blocks and minimize the largest sum of any block.

##### Link

##### Complexity:

expected worst-case time complexity is O(N*log(N+M));

expected worst-case space complexity is O(1)

##### Execution:

Binary search for the minimal size of a block. A valid block can be checked in a boolean fashion. Two special cases can be sped up (courtesy to CodeSays). **At the time of writing (19.9.2014) do not use the variable passed to the solution function as M! It is NOT the maximum element in the test cases! The specification says, that no element is larger than M, yet there is not guarantee that M == max(A).**

##### Solution:

def blockSizeIsValid(A, max_block_cnt, max_block_size): block_sum = 0 block_cnt = 0 for element in A: if block_sum + element > max_block_size: block_sum = element block_cnt += 1 else: block_sum += element if block_cnt >= max_block_cnt: return False return True def binarySearch(A, max_block_cnt, using_M_will_give_you_wrong_results): lower_bound = max(A) upper_bound = sum(A) if max_block_cnt == 1: return upper_bound if max_block_cnt >= len(A): return lower_bound while lower_bound <= upper_bound: candidate_mid = (lower_bound + upper_bound) // 2 if blockSizeIsValid(A, max_block_cnt, candidate_mid): upper_bound = candidate_mid - 1 else: lower_bound = candidate_mid + 1 return lower_bound def solution(K, M, A): return binarySearch(A,K,M)

If you enjoyed this post, then make sure you subscribe to my Newsletter and/or Feed.