Welcome to Subscribe On Youtube

3537. Fill a Special Grid

Description

You are given a non-negative integer n representing a 2n x 2n grid. You must fill the grid with integers from 0 to 22n - 1 to make it special. A grid is special if it satisfies all the following conditions:

  • 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.

Return the special 2n x 2n grid.

Note: Any 1x1 grid is special.

 

Example 1:

Input: n = 0

Output: [[0]]

Explanation:

The only number that can be placed is 0, and there is only one possible position in the grid.

Example 2:

Input: n = 1

Output: [[3,0],[2,1]]

Explanation:

The numbers in each quadrant are:

  • Top-right: 0
  • Bottom-right: 1
  • Bottom-left: 2
  • Top-left: 3

Since 0 < 1 < 2 < 3, this satisfies the given constraints.

Example 3:

Input: n = 2

Output: [[15,12,3,0],[14,13,2,1],[11,8,7,4],[10,9,6,5]]

Explanation:

The numbers in each quadrant are:

  • Top-right: 3, 0, 2, 1
  • Bottom-right: 7, 4, 6, 5
  • Bottom-left: 11, 8, 10, 9
  • Top-left: 15, 12, 14, 13
  • max(3, 0, 2, 1) < min(7, 4, 6, 5)
  • max(7, 4, 6, 5) < min(11, 8, 10, 9)
  • max(11, 8, 10, 9) < min(15, 12, 14, 13)

This satisfies the first three requirements. Additionally, each quadrant is also a special grid. Thus, this is a special grid.

 

Constraints:

  • 0 <= n <= 10

Solutions

Solution 1

  • class Solution {
        private int[][] ans;
        private int val;
    
        public int[][] specialGrid(int n) {
            int m = 1 << n;
            ans = new int[m][m];
            dfs(0, m - 1, m);
            return ans;
        }
    
        private void dfs(int x, int y, int k) {
            if (k == 1) {
                ans[x][y] = val++;
                return;
            }
    
            int h = k / 2;
            dfs(x, y, h);
            dfs(x + h, y, h);
            dfs(x + h, y - h, h);
            dfs(x, y - h, h);
        }
    }
    
  • class Solution {
    public:
        vector<vector<int>> specialGrid(int n) {
            int m = 1 << n;
            vector<vector<int>> ans(m, vector<int>(m));
            int val = 0;
    
            auto dfs = [&](this auto&& dfs, int x, int y, int k) -> void {
                if (k == 1) {
                    ans[x][y] = val++;
                    return;
                }
    
                int h = k / 2;
                dfs(x, y, h);
                dfs(x + h, y, h);
                dfs(x + h, y - h, h);
                dfs(x, y - h, h);
            };
    
            dfs(0, m - 1, m);
            return ans;
        }
    };
    
  • class Solution:
        def specialGrid(self, n: int) -> List[List[int]]:
            def dfs(x: int, y: int, k: int):
                if k == 1:
                    nonlocal val
                    ans[x][y] = val
                    val += 1
                    return
    
                dfs(x, y, k // 2)
                dfs(x + k // 2, y, k // 2)
                dfs(x + k // 2, y - k // 2, k // 2)
                dfs(x, y - k // 2, k // 2)
    
            m = 1 << n
            ans = [[0] * m for _ in range(m)]
            val = 0
            dfs(0, m - 1, m)
            return ans
    
    
  • func specialGrid(n int) [][]int {
    	m := 1 << n
    	ans := make([][]int, m)
    	for i := range ans {
    		ans[i] = make([]int, m)
    	}
    	val := 0
    
    	var dfs func(int, int, int)
    	dfs = func(x, y, k int) {
    		if k == 1 {
    			ans[x][y] = val
    			val++
    			return
    		}
    
    		h := k / 2
    		dfs(x, y, h)
    		dfs(x+h, y, h)
    		dfs(x+h, y-h, h)
    		dfs(x, y-h, h)
    	}
    
    	dfs(0, m-1, m)
    	return ans
    }
    
    
  • function specialGrid(n: number): number[][] {
        const m = 1 << n;
        const ans = Array.from({ length: m }, () => Array(m).fill(0));
        let val = 0;
    
        const dfs = (x: number, y: number, k: number): void => {
            if (k === 1) {
                ans[x][y] = val++;
                return;
            }
    
            const h = k >> 1;
            dfs(x, y, h);
            dfs(x + h, y, h);
            dfs(x + h, y - h, h);
            dfs(x, y - h, h);
        };
    
        dfs(0, m - 1, m);
        return ans;
    }
    
    
  • impl Solution {
        pub fn special_grid(n: i32) -> Vec<Vec<i32>> {
            fn dfs(x: usize, y: usize, k: usize, ans: &mut Vec<Vec<i32>>, val: &mut i32) {
                if k == 1 {
                    ans[x][y] = *val;
                    *val += 1;
                    return;
                }
    
                let h = k / 2;
                dfs(x, y, h, ans, val);
                dfs(x + h, y, h, ans, val);
                dfs(x + h, y - h, h, ans, val);
                dfs(x, y - h, h, ans, val);
            }
    
            let m = 1usize << n;
            let mut ans = vec![vec![0; m]; m];
            let mut val = 0;
            dfs(0, m - 1, m, &mut ans, &mut val);
            ans
        }
    }
    
    

All Problems

All Solutions