Welcome to Subscribe On Youtube
3127. Make a Square with the Same Color
Description
You are given a 2D matrix grid
of size 3 x 3
consisting only of characters 'B'
and 'W'
. Character 'W'
represents the white color, and character 'B'
represents the black color.
Your task is to change the color of at most one cell so that the matrix has a 2 x 2
square where all cells are of the same color.
Return true
if it is possible to create a 2 x 2
square of the same color, otherwise, return false
.
Example 1:
Input: grid = [["B","W","B"],["B","W","W"],["B","W","B"]]
Output: true
Explanation:
It can be done by changing the color of the grid[0][2]
.
Example 2:
Input: grid = [["B","W","B"],["W","B","W"],["B","W","B"]]
Output: false
Explanation:
It cannot be done by changing at most one cell.
Example 3:
Input: grid = [["B","W","B"],["B","W","W"],["B","W","W"]]
Output: true
Explanation:
The grid
already contains a 2 x 2
square of the same color.
Constraints:
grid.length == 3
grid[i].length == 3
grid[i][j]
is either'W'
or'B'
.
Solutions
Solution 1: Enumeration
We can enumerate each $2 \times 2$ square, count the number of black and white cells. If the counts are not equal, then we can construct a square of the same color, and return true
.
Otherwise, return false
after the traversal.
The time complexity is $O(1)$, and the space complexity is $O(1)$.
-
class Solution { public boolean canMakeSquare(char[][] grid) { final int[] dirs = {0, 0, 1, 1, 0}; for (int i = 0; i < 2; ++i) { for (int j = 0; j < 2; ++j) { int cnt1 = 0, cnt2 = 0; for (int k = 0; k < 4; ++k) { int x = i + dirs[k], y = j + dirs[k + 1]; cnt1 += grid[x][y] == 'W' ? 1 : 0; cnt2 += grid[x][y] == 'B' ? 1 : 0; } if (cnt1 != cnt2) { return true; } } } return false; } }
-
class Solution { public: bool canMakeSquare(vector<vector<char>>& grid) { int dirs[5] = {0, 0, 1, 1, 0}; for (int i = 0; i < 2; ++i) { for (int j = 0; j < 2; ++j) { int cnt1 = 0, cnt2 = 0; for (int k = 0; k < 4; ++k) { int x = i + dirs[k], y = j + dirs[k + 1]; cnt1 += grid[x][y] == 'W'; cnt2 += grid[x][y] == 'B'; } if (cnt1 != cnt2) { return true; } } } return false; } };
-
class Solution: def canMakeSquare(self, grid: List[List[str]]) -> bool: for i in range(0, 2): for j in range(0, 2): cnt1 = cnt2 = 0 for a, b in pairwise((0, 0, 1, 1, 0)): x, y = i + a, j + b cnt1 += grid[x][y] == "W" cnt2 += grid[x][y] == "B" if cnt1 != cnt2: return True return False
-
func canMakeSquare(grid [][]byte) bool { dirs := [5]int{0, 0, 1, 1, 0} for i := 0; i < 2; i++ { for j := 0; j < 2; j++ { cnt1, cnt2 := 0, 0 for k := 0; k < 4; k++ { x, y := i+dirs[k], j+dirs[k+1] if grid[x][y] == 'W' { cnt1++ } else { cnt2++ } } if cnt1 != cnt2 { return true } } } return false }
-
function canMakeSquare(grid: string[][]): boolean { const dirs: number[] = [0, 0, 1, 1, 0]; for (let i = 0; i < 2; ++i) { for (let j = 0; j < 2; ++j) { let [cnt1, cnt2] = [0, 0]; for (let k = 0; k < 4; ++k) { const [x, y] = [i + dirs[k], j + dirs[k + 1]]; if (grid[x][y] === 'W') { ++cnt1; } else { ++cnt2; } } if (cnt1 !== cnt2) { return true; } } } return false; }