2018年6月20日 星期三

[LeetCode] 840. Magic Squares In Grid

轉自LeetCode

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 an grid of integers, how many 3 x 3 "magic square" subgrids are there?  (Each subgrid is contiguous).

Example 1:
Input: [[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:
438
951
276

while this one is not:
384
519
762

In total, there is only one magic square inside the given grid.
Note:
  1. 1 <= grid.length <= 10
  2. 1 <= grid[0].length <= 10
  3. 0 <= grid[i][j] <= 15
<Solution>
想法如下
  • 就直接檢查,每次給 9 個數字下去做檢查。然後,如果是 magic square 的話,和一定會是 15
code 如下

Java
class Solution {
public int numMagicSquaresInside(int[][] grid) {
final int ROW = grid.length-2, COL = grid[0].length-2;
int ans = 0;
for (int r = 0; r < ROW; ++r)
for (int c = 0; c < COL; ++c) {
if (isMagicSquare(grid[r][c], grid[r][c+1], grid[r][c+2],
grid[r+1][c], grid[r+1][c+1], grid[r+1][c+2],
grid[r+2][c], grid[r+2][c+1], grid[r+2][c+2]))
ans++;
}
return ans;
}
public boolean isMagicSquare(int... vals) {
int[] count = new int[16];
for (int v: vals) {
count[v]++;
}
//>> need to have each number from 1 to 9
for (int v = 1; v <= 9; ++v) {
if (count[v] != 1) {
return false;
}
}
//>> the sum of magic Square is 15
return (vals[0] + vals[1] + vals[2] == 15 &&
vals[3] + vals[4] + vals[5] == 15 &&
vals[6] + vals[7] + vals[8] == 15 &&
vals[0] + vals[3] + vals[6] == 15 &&
vals[1] + vals[4] + vals[7] == 15 &&
vals[2] + vals[5] + vals[8] == 15 &&
vals[0] + vals[4] + vals[8] == 15 &&
vals[2] + vals[4] + vals[6] == 15);
}
}

沒有留言:

張貼留言