Allocate Minimum Pages Binary Search on Answer in DSA Java - Time & Space Complexity
We want to find how fast the binary search approach works to allocate minimum pages among students.
Specifically, how the number of operations grows as the number of books or pages increases.
Analyze the time complexity of the following code snippet.
public boolean isPossible(int[] books, int students, int mid) {
int requiredStudents = 1, currentSum = 0;
for (int pages : books) {
if (pages > mid) return false;
if (currentSum + pages > mid) {
requiredStudents++;
currentSum = pages;
} else {
currentSum += pages;
}
}
return requiredStudents <= students;
}
public int allocatePages(int[] books, int students) {
int start = 0, end = 0;
for (int pages : books) end += pages;
int result = end;
while (start <= end) {
int mid = start + (end - start) / 2;
if (isPossible(books, students, mid)) {
result = mid;
end = mid - 1;
} else {
start = mid + 1;
}
}
return result;
}
This code tries to find the minimum maximum pages a student can get by using binary search on the answer range.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The for-loop inside
isPossiblethat checks if allocation is possible. - How many times: This check runs for each mid value in the binary search, which runs about log of the sum of pages times.
As the number of books (n) increases, the for-loop inside isPossible runs n times for each binary search step.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 * log(sum of pages) |
| 100 | 100 * log(sum of pages) |
| 1000 | 1000 * log(sum of pages) |
Pattern observation: The operations grow linearly with the number of books and logarithmically with the total pages.
Time Complexity: O(n * log m)
This means the time grows linearly with the number of books and logarithmically with the total pages to allocate.
[X] Wrong: "The binary search alone makes this O(log n) time."
[OK] Correct: Each binary search step runs a full check over all books, so the loop over books dominates and multiplies the log factor.
Understanding this time complexity helps you explain how binary search can be applied on answers, a common pattern in allocation and partition problems.
"What if we used a linear search instead of binary search on the answer range? How would the time complexity change?"
Practice
Allocate Minimum Pages problem using binary search on answer?Solution
Step 1: Understand the problem objective
The problem asks to allocate books to students so that the maximum pages assigned to any student is as small as possible.Step 2: Identify the goal of binary search on answer
Binary search is used to find the minimum possible maximum pages that can be assigned to a student.Final Answer:
To minimize the maximum number of pages assigned to a student -> Option AQuick Check:
Goal = minimize max pages [OK]
- Thinking the goal is to maximize pages
- Confusing average pages with maximum pages
- Assuming random allocation is acceptable
Allocate Minimum Pages problem in Java?Solution
Step 1: Determine the minimum possible max pages
The minimum max pages must be at least the largest single book's pages, because no book can be split.Step 2: Determine the maximum possible max pages
The maximum max pages is the sum of all pages if one student gets all books.Final Answer:
int low = max pages in a single book; int high = sum of all pages; -> Option CQuick Check:
low = max book pages, high = total pages [OK]
- Setting low to 0 which is invalid
- Swapping low and high values
- Using average pages as boundaries
Solution
Step 1: Check possible max pages allocations
Try to split books so that max pages per student is minimized. Possible splits: [10,20,30] and [40] max=60; or [10,20] and [30,40] max=70.Step 2: Choose minimum max pages
Between 60 and 70, 60 is smaller and valid allocation.Final Answer:
60 -> Option DQuick Check:
Minimum max pages = 60 [OK]
- Choosing sum of all pages as answer
- Ignoring largest single book pages
- Incorrectly splitting books
boolean isPossible(int[] pages, int students, int mid) {
int count = 1, sum = 0;
for (int page : pages) {
sum += page;
if (sum > mid) {
count++;
sum = 0;
}
}
return count <= students;
}Solution
Step 1: Analyze sum reset logic
When sum exceeds mid, count increments but sum resets to zero, losing the current page's value.Step 2: Correct sum reset to current page
Sum should reset to current page's value to include it in the new student's allocation.Final Answer:
sum should be reset to current page, not zero, after count increment -> Option AQuick Check:
Reset sum = current page [OK]
- Resetting sum to zero loses current page
- Returning wrong comparison for count and students
- Incorrect loop indexing
Solution
Step 1: Set binary search boundaries
Low = max single book pages = 90, High = sum = 12+34+67+90=203.Step 2: Check mid and feasibility
Mid = (90+203)/2=146. Check if allocation possible with max 146 pages per student: [12,34,67] sum=113 <=146, next student gets [90]. Possible with 2 students.Step 3: Narrow search
Try lower mid: (90+146)/2=118. Check allocation: [12,34,67] sum=113 <=118, next student [90]. Possible.Step 4: Try even lower mid
Mid = (90+118)/2=104. Allocation: [12,34,67] sum=113 >104, so split: [12,34] sum=46 <=104, next student [67,90] sum=157 >104 not possible.Step 5: Increase low to 105 and continue
Mid = (105+118)/2=111. Allocation: [12,34,67] sum=113 >111 no, split: [12,34] sum=46 <=111, next student [67,90] sum=157 >111 no.Step 6: Mid = (112+118)/2=115
Allocation: [12,34,67] sum=113 <=115 yes, next student [90]. Possible.Step 7: Narrow down to minimum feasible
Try mid= (112+114)/2=113 allocation possible, mid=112 allocation not possible.Final Answer:
113 -> Option BQuick Check:
Minimum max pages = 113 [OK]
- Choosing max single book pages as answer
- Not checking feasibility correctly
- Stopping binary search too early
Ready to prove it?
Pass the test and this pattern moves unknown
