2024-12-05:构造相同颜色的正方形。用go语言,给定一个3x3的矩阵,每个格子是‘B‘或‘W‘。 你需要判断是否可以通过

举报
福大大架构师每日一题 发表于 2024/12/05 09:25:47 2024/12/05
【摘要】 2024-12-05:构造相同颜色的正方形。用go语言,给定一个3x3的矩阵,每个格子是’B’或’W’。你需要判断是否可以通过修改最多一个格子的颜色,使得矩阵中存在一个2x2的颜色完全相同的正方形。如果能得到这样的正方形,返回true;否则返回false。输入:grid = [[“B”,“W”,“B”],[“B”,“W”,“W”],[“B”,“W”,“B”]]。输出:true。解释:修改 g...

2024-12-05:构造相同颜色的正方形。用go语言,给定一个3x3的矩阵,每个格子是’B’或’W’。

你需要判断是否可以通过修改最多一个格子的颜色,使得矩阵中存在一个2x2的颜色完全相同的正方形。

如果能得到这样的正方形,返回true;否则返回false。

输入:grid = [[“B”,“W”,“B”],[“B”,“W”,“W”],[“B”,“W”,“B”]]。

输出:true。

解释:

修改 grid[0][2] 的颜色,可以满足要求。

大体步骤如下:

1.创建一个函数 canMakeSquare(grid [][]byte) bool,该函数接受一个 3x3 的二维字节数组作为参数。

2.在 canMakeSquare 函数中,使用两个嵌套的循环遍历所有可能的左上角位置 (i, j)。

3.对于每个左上角位置 (i, j),调用 check(grid [][]byte, i, j int) bool 函数进行检查。

4.check 函数接受当前左上角位置 (i, j),遍历这个2x2的小正方形格子,检查是否有超过两个相同颜色 (‘B’) 的格子。

5.如果发现这个小正方形中超过两个相同颜色的格子,返回 false,否则返回 true

6.如果所有的情况都检查完毕后没有找到符合条件的正方形,最终返回 false

时间复杂度:

  • 遍历所有可能的左上角位置需要 O(1) 的时间复杂度。

  • 在每个左上角位置下,检查2x2小正方形格子是否满足条件的过程复杂度是 O(1)。

  • 因此,总的时间复杂度为 O(1)。

空间复杂度:

  • 除了输入参数之外,额外只使用了常数级别的额外空间。

  • 因此,总的额外空间复杂度为 O(1)。

Go完整代码如下:

package main

import (
	"fmt"
)

func canMakeSquare(grid [][]byte) bool {
    for i := 0; i <= 1; i++ {
        for j := 0; j <= 1; j++ {
            if check(grid, i, j) {
                return true
            }
        }
    }
    return false
}
func check(grid[][]byte, x, y int) bool {
    count := 0
    for i := 0; i <= 1; i++ {
        for j := 0; j <= 1; j++ {
            if grid[x + i][y + j] == 'B' {
                count++
            }
        }
    }
    return count != 2
}


func main() {
	grid := [][]byte{{'B','W','B'},{'B','W','W'},{'B','W','B'}}
	fmt.Println(canMakeSquare(grid))
}

在这里插入图片描述

Rust完整代码如下:

fn can_make_square(grid: &Vec<Vec<char>>) -> bool {
    for i in 0..=1 {
        for j in 0..=1 {
            if check(grid, i, j) {
                return true;
            }
        }
    }
    false
}

fn check(grid: &Vec<Vec<char>>, x: usize, y: usize) -> bool {
    let mut count = 0;
    for i in 0..=1 {
        for j in 0..=1 {
            if grid[x + i][y + j] == 'B' {
                count += 1;
            }
        }
    }
    count != 2
}

fn main() {
    let grid = vec![
        vec!['B', 'W', 'B'],
        vec!['B', 'W', 'W'],
        vec!['B', 'W', 'B']
    ];
    println!("{}", can_make_square(&grid));
}

在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。