前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >2025-03-18:最少翻转次数使二进制矩阵回文Ⅱ。用go语言,给定一个大小为 m x n 的二进制矩阵 grid。如果矩阵中

2025-03-18:最少翻转次数使二进制矩阵回文Ⅱ。用go语言,给定一个大小为 m x n 的二进制矩阵 grid。如果矩阵中

作者头像
福大大架构师每日一题
发布2025-03-18 18:48:37
发布2025-03-18 18:48:37
3600
代码可运行
举报
运行总次数:0
代码可运行

2025-03-17:最少翻转次数使二进制矩阵回文Ⅰ。用go语言,给定一个大小为 m x n 的二进制矩阵 grid。如果矩阵中的某一行或某一列从前往后读和从后往前读是一样的,那么我们称这一行或这一列是回文的。

你可以翻转矩阵中的任意一个格子的值,即将 0 变为 1,或将 1 变为 0。

请返回使得矩阵所有行所有列成为回文所需的最少翻转次数。

m == grid.length。

n == grid[i].length。

1 <= m * n <= 200000。 0 <= grid[i][j] <= 1。

输入:grid = [[1,0,0],[0,0,0],[0,0,1]]。

输出:2。

解释:

将高亮的格子翻转,得到所有行都是回文的。

题目来自leetcode3239。

大体步骤如下:

1.计算行回文所需翻转次数

  • 遍历每一行:对每一行进行对称位置的比较。
  • 对称位置比较:对于每个元素在位置 j1,其对称位置为 j2 = n-1-j1。若两者不同,则需要翻转其中一个,因此每对不同的位置贡献一次翻转次数。
  • 累计行总次数:所有行的不匹配对总数即为将所有行变为回文的最小翻转次数。

2.计算列回文所需翻转次数

  • 遍历每一列:对每一列进行上下对称位置的比较。
  • 对称位置比较:对于每个元素在行 i1,其对称位置为 i2 = m-1-i1。若两者不同,同样需要一次翻转。
  • 累计列总次数:所有列的不匹配对总数即为将所有列变为回文的最小翻转次数。

3.选择最优解:比较行处理和列处理的总次数,取较小值作为最终结果。

复杂度分析

  • 时间复杂度:O(m × n)。 需要遍历所有行的对称位置(O(m × n/2))和所有列的对称位置(O(n × m/2)),总体为线性时间复杂度。
  • 额外空间复杂度:O(1)。 仅使用固定数量的变量存储中间结果,无需额外空间。

Go完整代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
package main

import (
    "fmt"
)

func minFlips(grid [][]int)int {
    rowCnt, colCnt := 0, 0
    m, n := len(grid), len(grid[0])
    for i := 0; i < m; i++ {
        for j1 := 0; j1 < n / 2; j1++ {
            j2 := n - 1 - j1
            if grid[i][j1] != grid[i][j2] {
                rowCnt++
            }
        }
    }
    for j := 0; j < n; j++ {
        for i1 := 0; i1 < m / 2; i1++ {
            i2 := m - 1 - i1
            if grid[i1][j] != grid[i2][j] {
                colCnt++
            }
        }
    }
    return min(colCnt, rowCnt)
}


func main() {
    grid := [][]int{{1,0,0},{0,0,0},{0,0,1}}
    result := minFlips(grid)
    fmt.Println(result)
}

Python完整代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
# -*-coding:utf-8-*-

defminFlips(grid):
    m = len(grid)
    if m == 0:
        return0
    n = len(grid[0])
    row_cnt = 0
    for i inrange(m):
        for j1 inrange(n // 2):
            j2 = n - 1 - j1
            if grid[i][j1] != grid[i][j2]:
                row_cnt += 1
    col_cnt = 0
    for j inrange(n):
        for i1 inrange(m // 2):
            i2 = m - 1 - i1
            if grid[i1][j] != grid[i2][j]:
                col_cnt += 1
    returnmin(row_cnt, col_cnt)

# 测试用例
grid = [
    [1, 0, 0],
    [0, 0, 0],
    [0, 0, 1]
]
print(minFlips(grid))  # 输出: 2

我们相信 Go 语言和算法为普通开发者提供了强有力的“面试利器”,并致力于分享全面的编程知识。在这里,您可以找到最新的 Go 语言教程、算法解析、提升面试竞争力的秘籍以及行业动态。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-03-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 福大大架构师每日一题 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 大体步骤如下:
    • 复杂度分析
  • Go完整代码如下:
  • Python完整代码如下:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档