πŸ“ Problem Details

πŸ’­What Were My Initial Thoughts?

My first thought was to iterate through the array of children, treating it as a list where each index represents a child, and distribute money incrementally to maximize the number of children receiving the required minimum.  
Specifically:
1. Assign 1 unit of money to every child to ensure all children receive at least some allocation.
2. Continue distributing the remaining money in chunks of 7 to as many children as possible.
3. Handle edge cases to ensure no child receives an invalid amount of money (e.g., ending with a remainder of 3 for one child).

πŸ€”What Did I Struggle With?

1. Initially, I struggled with optimizing the edge cases, such as what to do when only one child is left, and there is exactly 3 units of money remaining.
2. Transitioning from an array-based approach to a mathematical model was also challenging, as maintaining the array added unnecessary complexity.
3. Debugging the decrement of `ans` when leftover money invalidates an allocation was tricky to reason about.

πŸ’‘ Explanation of Solution

The problem can be approached with a greedy algorithm. Here's the solution breakdown:

1. **Initial Validation**:
   - If the total money is less than the number of children (`money < children`), it is impossible to distribute even 1 unit to each child. Return -1 in this case.

2. **Base Allocation**:
   - Allocate 1 unit of money to each child, which reduces `money` by the number of children.

3. **Greedy Allocation**:
   - Using a greedy strategy, distribute the remaining money in chunks of 7 to as many children as possible.
   - For every chunk of 7 allocated, decrement the number of children left to process.

4. **Handle Edge Cases**:
   - After distributing money, check for leftover money that could invalidate the allocation:
     a. If no children are left (`children == 0`) but there’s leftover money, decrement `ans` because the allocation is invalid.
     b. If only one child is left (`children == 1`) and the leftover money is 3, decrement `ans` to maintain validity.

5. **Return Result**:
   - The result (`ans`) is the maximum number of children who can receive at least 7 units of money.

βŒ› Complexity Analysis

Time Complexity: O(n) where n is the number of children
- the greedy allocation runs a loop proportional to the number of children

Space Complexity: O(1)

πŸ’» Implementation of Solution

class Solution {
public:
    int distMoney(int money, int children) {
        if(money  < children) return -1;
        money -= children;
 
        int counter = 0;
        
        while(money >= 7 && children > 0) {
            money -= 7;
            counter++;
            children--;
        }
        if(counter) {
            if(children == 0 && money > 0) counter--;
            if(children == 1 && money == 3) counter--;
        }
        return counter;
    }
};