Time to Complete Each Dream Design - codepath/compsci_guides GitHub Wiki
TIP102 Unit 3 Session 2 Advanced (Click for link to problem statements)
U-nderstand
Understand what the interviewer is asking for by using test cases and questions about the problem.
- Q: What is the input to the problem?
- A: The input is an array
design_times
, where each element represents the number of days required to complete a particular design.
- A: The input is an array
- Q: What is the output?
- A: The output is an array
answer
, whereanswer[i]
represents the number of days you must wait after thei
-th design until a more complex design (one that takes more days) begins. If no such design exists,answer[i]
is0
.
- A: The output is an array
- Q: How do you determine the waiting days?
- A: For each design, you need to find the first subsequent design that takes more time to complete than the current one. The difference in their positions in the array gives the waiting days.
P-lan
Plan the solution with appropriate visualizations and pseudocode.
General Idea: Use a stack to keep track of the indices of the designs in decreasing order of their completion times. For each design, check if there is a later design that takes more time to complete. If there is, calculate the difference in days and update the answer.
1. Initialize an array `answer` of the same length as `design_times`, filled with `0`.
2. Initialize an empty stack to store indices of designs.
3. Iterate through the `design_times` array:
1. While the stack is not empty and the current design takes more time than the design at the index stored on top of the stack:
- Pop the index from the stack.
- Calculate the difference between the current index and the popped index.
- Store this difference in `answer` at the popped index.
2. Push the current index onto the stack.
4. Return the `answer` array.
⚠️ Common Mistakes
- Forgetting to update the
answer
array for designs with no subsequent more complex designs. - Incorrectly calculating the waiting days by not properly managing the stack.
I-mplement
def time_to_complete_dream_designs(design_times):
n = len(design_times)
answer = [0] * n
stack = []
for i in range(n):
while stack and design_times[i] > design_times[stack[-1]]:
prev_index = stack.pop()
answer[prev_index] = i - prev_index
stack.append(i)
return answer
# Example usage
print(time_to_complete_dream_designs([3, 4, 5, 2, 1, 6, 7, 3])) # Output: [1, 1, 3, 2, 1, 1, 0, 0]
print(time_to_complete_dream_designs([2, 3, 1, 4])) # Output: [1, 2, 1, 0]
print(time_to_complete_dream_designs([5, 5, 5, 5])) # Output: [0, 0, 0, 0]