Easy

题目描述

给你一个大小为 3 x 3 的二维矩阵 grid,只包含字符 ‘B’ 和 ‘W’。字符 ‘W’ 表示白色,字符 ‘B’ 表示黑色。

你的任务是改变至多一个单元格的颜色,使得矩阵中有一个 2 x 2 的正方形,其中所有单元格都是相同颜色。

如果可以创建一个相同颜色的 2 x 2 正方形,返回 true,否则返回 false

示例 1:

输入:grid = [["B","W","B"],["B","W","W"],["B","W","B"]]
输出:true
解释:可以通过改变 grid[0][2] 的颜色来实现。

示例 2:

输入:grid = [["B","W","B"],["W","B","W"],["B","W","B"]]
输出:false
解释:无法通过改变至多一个单元格来实现。

示例 3:

输入:grid = [["B","W","B"],["B","W","W"],["B","W","W"]]
输出:true
解释:网格中已经包含一个相同颜色的 2 x 2 正方形。

约束条件:

  • grid.length == 3
  • grid[i].length == 3
  • grid[i][j] 是 ‘W’ 或 ‘B’

提示:

  • 当所有正方形中 ‘W’ 或 ‘B’ 的数量为 2 时,无法通过改变至多一个单元格的颜色来创建相同颜色的 2 x 2 正方形。

解题思路

解题思路

这道题要求我们在 3×3 的网格中找到是否能通过改变至多一个单元格,使得存在一个 2×2 的同色正方形。

核心观察: 在一个 3×3 的网格中,总共有 4 个可能的 2×2 正方形:

  • 左上角:(0,0), (0,1), (1,0), (1,1)
  • 右上角:(0,1), (0,2), (1,1), (1,2)
  • 左下角:(1,0), (1,1), (2,0), (2,1)
  • 右下角:(1,1), (1,2), (2,1), (2,2)

解法思路:

  1. 遍历每个 2×2 正方形
  2. 统计每个正方形中 ‘B’ 和 ‘W’ 的数量
  3. 判断条件:
    • 如果某个正方形已经全是同色(4个相同),直接返回 true
    • 如果某个正方形有3个相同颜色,只需改变1个即可,返回 true
    • 如果所有正方形都是2:2的情况,则需要改变2个才能达成目标,返回 false

关键insight: 只要存在一个 2×2 区域中同色格子数量≥3,就能通过至多改变一个格子达成目标。

代码实现

class Solution {
public:
    bool canMakeSquare(vector<vector<char>>& grid) {
        // 检查所有可能的2x2正方形
        vector<vector<int>> squares = {{0,0}, {0,1}, {1,0}, {1,1}};
        
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 2; j++) {
                int countB = 0, countW = 0;
                
                // 统计当前2x2正方形中B和W的数量
                for (int di = 0; di < 2; di++) {
                    for (int dj = 0; dj < 2; dj++) {
                        if (grid[i + di][j + dj] == 'B') {
                            countB++;
                        } else {
                            countW++;
                        }
                    }
                }
                
                // 如果有3个或4个相同颜色,可以通过改变至多1个格子达成目标
                if (countB >= 3 || countW >= 3) {
                    return true;
                }
            }
        }
        
        return false;
    }
};
class Solution:
    def canMakeSquare(self, grid: List[List[str]]) -> bool:
        # 检查所有可能的2x2正方形
        for i in range(2):
            for j in range(2):
                count_b = 0
                count_w = 0
                
                # 统计当前2x2正方形中B和W的数量
                for di in range(2):
                    for dj in range(2):
                        if grid[i + di][j + dj] == 'B':
                            count_b += 1
                        else:
                            count_w += 1
                
                # 如果有3个或4个相同颜色,可以通过改变至多1个格子达成目标
                if count_b >= 3 or count_w >= 3:
                    return True
        
        return False
public class Solution {
    public bool CanMakeSquare(char[][] grid) {
        // 检查所有可能的2x2正方形
        for (int i = 0; i < 2; i++) {
            for (int j = 0; j < 2; j++) {
                int countB = 0, countW = 0;
                
                // 统计当前2x2正方形中B和W的数量
                for (int di = 0; di < 2; di++) {
                    for (int dj = 0; dj < 2; dj++) {
                        if (grid[i + di][j + dj] == 'B') {
                            countB++;
                        } else {
                            countW++;
                        }
                    }
                }
                
                // 如果有3个或4个相同颜色,可以通过改变至多1个格子达成目标
                if (countB >= 3 || countW >= 3) {
                    return true;
                }
            }
        }
        
        return false;
    }
}
/**
 * @param {character[][]} grid
 * @return {boolean}
 */
var canMakeSquare = function(grid) {
    for (let i = 0; i < 2; i++) {
        for (let j = 0; j < 2; j++) {
            let countB = 0;
            let countW = 0;
            
            if (grid[i][j] === 'B') countB++;
            else countW++;
            
            if (grid[i][j+1] === 'B') countB++;
            else countW++;
            
            if (grid[i+1][j] === 'B') countB++;
            else countW++;
            
            if (grid[i+1][j+1] === 'B') countB++;
            else countW++;
            
            if (countB >= 3 || countW >= 3) {
                return true;
            }
        }
    }
    return false;
};

复杂度分析

复杂度类型复杂度说明
时间复杂度O(1)固定检查4个2×2正方形,每个正方形检查4个格子,总共16次操作
空间复杂度O(1)只使用常数额外空间存储计数变量