---
# System prepended metadata

title: '[Medium] 3537. Fill a Special Grid'
tags: [LeetCode-Medium]

---

<!-- 
<b>
-->

# <span style="color: orange">[Medium]</span> 3537. Fill a Special Grid

##  Problem Summary
Given a number `n`, try to fill in a 2D list of `2ⁿ*2ⁿ` that following the given rule:
- All numbers in the top-right quadrant are smaller than those in the bottom-right quadrant.
- All numbers in the bottom-right quadrant are smaller than those in the bottom-left quadrant.
- All numbers in the bottom-left quadrant are smaller than those in the top-left quadrant.
- Each of its quadrants is also a special grid.

## 💡 Approach
The numbers are arranged in the format U, so for each n we try to wrap one more layer at the outside. To do that, we first create a list, going in as deep as possible, and fill the numbers following the given rule while <b>moving out layer by layer</b>. It is a <b>divide and conquer</b> concept so that for each time, we only have to deal with simple problems.

## </> Code
```python
class Solution:
    def specialGrid(self, n: int) -> List[List[int]]:
        size = 2 ** n
        grid = [[0] * size for _ in range(size)]
        
        def fill_grid(sx, sy, size, num):
            # Edge case
            if size == 1:
                grid[sy][sx] = num
                return

            # Fill in the split grid
            half = size // 2
            new_num = (size * size) // 4
            fill_grid(sx, sy, half, num)
            fill_grid(sx, sy+half, half, num+new_num*1)
            fill_grid(sx-half, sy+half, half, num+new_num*2)
            fill_grid(sx-half, sy, half, num+new_num*3)
            return

        
        fill_grid(size-1, 0, size, 0)
        return grid
```

## 🕒 Runtime
Time: `182ms` | `Beats 50.50%`
Memory: `92.00MB` | `Beats 59.30%`

## 📈 Complexity

<b>Assume that: </b>
- `n` is the given number

<b>The overall complexity:</b>
- Time Complexity: `O(4ⁿ)`
- Space Complexity: `O(4ⁿ)+O(n)`
