Welcome to Subscribe On Youtube

840. Magic Squares In Grid

Description

A 3 x 3 magic square is a 3 x 3 grid filled with distinct numbers from 1 to 9 such that each row, column, and both diagonals all have the same sum.

Given a row x col grid of integers, how many 3 x 3 "magic square" subgrids are there?  (Each subgrid is contiguous).

 

Example 1:

Input: grid = [[4,3,8,4],[9,5,1,9],[2,7,6,2]]
Output: 1
Explanation: 
The following subgrid is a 3 x 3 magic square:

while this one is not:

In total, there is only one magic square inside the given grid.

Example 2:

Input: grid = [[8]]
Output: 0

 

Constraints:

  • row == grid.length
  • col == grid[i].length
  • 1 <= row, col <= 10
  • 0 <= grid[i][j] <= 15

Solutions

  • class Solution {
        private int m;
        private int n;
        private int[][] grid;
    
        public int numMagicSquaresInside(int[][] grid) {
            m = grid.length;
            n = grid[0].length;
            this.grid = grid;
            int ans = 0;
            for (int i = 0; i < m; ++i) {
                for (int j = 0; j < n; ++j) {
                    ans += check(i, j);
                }
            }
            return ans;
        }
    
        private int check(int i, int j) {
            if (i + 3 > m || j + 3 > n) {
                return 0;
            }
            int[] cnt = new int[16];
            int[] row = new int[3];
            int[] col = new int[3];
            int a = 0, b = 0;
            for (int x = i; x < i + 3; ++x) {
                for (int y = j; y < j + 3; ++y) {
                    int v = grid[x][y];
                    if (v < 1 || v > 9 || ++cnt[v] > 1) {
                        return 0;
                    }
                    row[x - i] += v;
                    col[y - j] += v;
                    if (x - i == y - j) {
                        a += v;
                    }
                    if (x - i + y - j == 2) {
                        b += v;
                    }
                }
            }
            if (a != b) {
                return 0;
            }
            for (int k = 0; k < 3; ++k) {
                if (row[k] != a || col[k] != a) {
                    return 0;
                }
            }
            return 1;
        }
    }
    
  • class Solution {
    public:
        int numMagicSquaresInside(vector<vector<int>>& grid) {
            int m = grid.size();
            int n = grid[0].size();
            int ans = 0;
            auto check = [&](int i, int j) {
                if (i + 3 > m || j + 3 > n) {
                    return 0;
                }
                vector<int> cnt(16);
                vector<int> row(3);
                vector<int> col(3);
                int a = 0, b = 0;
                for (int x = i; x < i + 3; ++x) {
                    for (int y = j; y < j + 3; ++y) {
                        int v = grid[x][y];
                        if (v < 1 || v > 9 || ++cnt[v] > 1) {
                            return 0;
                        }
                        row[x - i] += v;
                        col[y - j] += v;
                        if (x - i == y - j) {
                            a += v;
                        }
                        if (x - i + y - j == 2) {
                            b += v;
                        }
                    }
                }
                if (a != b) {
                    return 0;
                }
                for (int k = 0; k < 3; ++k) {
                    if (row[k] != a || col[k] != a) {
                        return 0;
                    }
                }
                return 1;
            };
            for (int i = 0; i < m; ++i) {
                for (int j = 0; j < n; ++j) {
                    ans += check(i, j);
                }
            }
            return ans;
        }
    };
    
  • class Solution:
        def numMagicSquaresInside(self, grid: List[List[int]]) -> int:
            def check(i: int, j: int) -> int:
                if i + 3 > m or j + 3 > n:
                    return 0
                s = set()
                row = [0] * 3
                col = [0] * 3
                a = b = 0
                for x in range(i, i + 3):
                    for y in range(j, j + 3):
                        v = grid[x][y]
                        if v < 1 or v > 9:
                            return 0
                        s.add(v)
                        row[x - i] += v
                        col[y - j] += v
                        if x - i == y - j:
                            a += v
                        if x - i == 2 - (y - j):
                            b += v
                if len(s) != 9 or a != b:
                    return 0
                if any(x != a for x in row) or any(x != a for x in col):
                    return 0
                return 1
    
            m, n = len(grid), len(grid[0])
            return sum(check(i, j) for i in range(m) for j in range(n))
    
    
  • func numMagicSquaresInside(grid [][]int) (ans int) {
    	m, n := len(grid), len(grid[0])
    	check := func(i, j int) int {
    		if i+3 > m || j+3 > n {
    			return 0
    		}
    		cnt := [16]int{}
    		row := [3]int{}
    		col := [3]int{}
    		a, b := 0, 0
    		for x := i; x < i+3; x++ {
    			for y := j; y < j+3; y++ {
    				v := grid[x][y]
    				if v < 1 || v > 9 || cnt[v] > 0 {
    					return 0
    				}
    				cnt[v]++
    				row[x-i] += v
    				col[y-j] += v
    				if x-i == y-j {
    					a += v
    				}
    				if x-i == 2-(y-j) {
    					b += v
    				}
    			}
    		}
    		if a != b {
    			return 0
    		}
    		for k := 0; k < 3; k++ {
    			if row[k] != a || col[k] != a {
    				return 0
    			}
    		}
    		return 1
    	}
    	for i := 0; i < m; i++ {
    		for j := 0; j < n; j++ {
    			ans += check(i, j)
    		}
    	}
    	return
    }
    
  • function numMagicSquaresInside(grid: number[][]): number {
        const m = grid.length;
        const n = grid[0].length;
        const check = (i: number, j: number): number => {
            if (i + 3 > m || j + 3 > n) {
                return 0;
            }
            const cnt: number[] = new Array(16).fill(0);
            const row: number[] = new Array(3).fill(0);
            const col: number[] = new Array(3).fill(0);
            let [a, b] = [0, 0];
            for (let x = i; x < i + 3; ++x) {
                for (let y = j; y < j + 3; ++y) {
                    const v = grid[x][y];
                    if (v < 1 || v > 9 || ++cnt[v] > 1) {
                        return 0;
                    }
                    row[x - i] += v;
                    col[y - j] += v;
                    if (x - i === y - j) {
                        a += v;
                    }
                    if (x - i === 2 - (y - j)) {
                        b += v;
                    }
                }
            }
            if (a !== b) {
                return 0;
            }
            for (let k = 0; k < 3; ++k) {
                if (row[k] !== a || col[k] !== a) {
                    return 0;
                }
            }
            return 1;
        };
        let ans = 0;
        for (let i = 0; i < m; ++i) {
            for (let j = 0; j < n; ++j) {
                ans += check(i, j);
            }
        }
        return ans;
    }
    
    
  • function numMagicSquaresInside(grid) {
        const m = grid.length;
        const n = grid[0].length;
        const check = (i, j) => {
            if (i + 3 > m || j + 3 > n) {
                return 0;
            }
            const cnt = Array(16).fill(0);
            const row = Array(3).fill(0);
            const col = Array(3).fill(0);
            let [a, b] = [0, 0];
            for (let x = i; x < i + 3; ++x) {
                for (let y = j; y < j + 3; ++y) {
                    const v = grid[x][y];
                    if (v < 1 || v > 9 || ++cnt[v] > 1) {
                        return 0;
                    }
                    row[x - i] += v;
                    col[y - j] += v;
                    if (x - i === y - j) {
                        a += v;
                    }
                    if (x - i === 2 - (y - j)) {
                        b += v;
                    }
                }
            }
            if (a !== b) {
                return 0;
            }
            for (let k = 0; k < 3; ++k) {
                if (row[k] !== a || col[k] !== a) {
                    return 0;
                }
            }
            return 1;
        };
        let ans = 0;
        for (let i = 0; i < m; ++i) {
            for (let j = 0; j < n; ++j) {
                ans += check(i, j);
            }
        }
        return ans;
    }
    
    

All Problems

All Solutions