当前位置: 首页 > article >正文

来LeetCode练下思维吧

3239.最少翻转使二进制矩阵回文|

给你一个 m x n 的二进制矩阵 grid 。

如果矩阵中一行或者一列从前往后与从后往前读是一样的,那么我们称这一行或者这一列是 回文 的。

你可以将 grid 中任意格子的值 翻转 ,也就是将格子里的值从 0 变成 1 ,或者从 1 变成 0 。

请你返回 最少 翻转次数,使得矩阵 要么 所有行是 回文的 ,要么所有列是 回文的 。

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m * n <= 2 * 10^5
  • 0 <= grid[i][j] <= 1

这题没什么好说的,在我看来难度应该改成简单。直接去暴力检查一遍就行了,m * n 只有 200000 肯定能过

代码

class Solution {
public:
    int minFlips(vector<vector<int>>& grid) {
        int m = grid.size(), n = grid[0].size();
        int cnt1 = 0, cnt2 = 0;
        for(int i = 0;i < m;i ++){
            int l = 0, r = n - 1;
            while(l < r){
                if(grid[i][l] != grid[i][r]) cnt1 ++;
                l ++, r --;
            }
        }
        for(int i = 0;i < n;i ++){
            int l = 0, r = m - 1;
            while(l < r){
                if(grid[l][i] != grid[r][i]) cnt2 ++;
                l ++, r --;
            }
        }
        return min(cnt1, cnt2);
    }
};

3240.最少翻转使二进制矩阵回文||

给你一个 m x n 的二进制矩阵 grid 。

如果矩阵中一行或者一列从前往后与从后往前读是一样的,那么我们称这一行或者这一列是 回文 的。

你可以将 grid 中任意格子的值 翻转 ,也就是将格子里的值从 0 变成 1 ,或者从 1 变成 0 。

请你返回 最少 翻转次数,使得矩阵中 所有 行和列都是 回文的 ,且矩阵中 1 的数目可以被 4 整除 。

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m * n <= 2 * 10^5
  • 0 <= grid[i][j] <= 1

当有“矩阵中 1 的数目可以被 4 整除 。”这个限制的时候,这个题就要思考了

首先我们去枚举每个点,然后去看每个点的“镜像”位置,如图

你可以发现每个相同图案位置上的元素必须要是一致的才能回文,所以第一步我们就去统计最少需要多少步使得这些图案所对应的元素都是一样的。

这里其实一个点对应4个位置,统计一下这四个位置有多少 1(cnt) 即可,变成一样的话就是  min(cnt(全变成0), 4 - cnt(全变成1))

然后请看

对于孤立的中间列,孤立的中间行(当行、列长度是奇数时才有)需要去特判一下。首先对于中心点必须是 0 (行列长度都是奇数时存在),因为所有的点都是关于他对称的。然后去枚举孤立行和孤立列中不对称的组数有多少(diff),在枚举对称时 1 的个数(num)

如果 num % 4 == 0 那满足条件了不用管,反之就要挑一组 dif f出来都变成 1 即可

代码

class Solution {
public:
    int minFlips(vector<vector<int>>& grid) {
        int m = grid.size(), n = grid[0].size();
        int ans = 0;
        for(int i = 0;i < m / 2;i ++){
            for(int j = 0;j < n / 2;j ++){
                int cnt = grid[i][j] + grid[i][n - j - 1] + grid[m - i - 1][j] + grid[m - i - 1][n - j - 1];
                ans += min(cnt, 4 - cnt);
            }
        }
        if((m & 1) && (n & 1)) ans += grid[m / 2][n / 2];
        int one = 0, diff = 0;
        if(m & 1){
            for(int i = 0, j = n - 1;i < n && i < j;i ++, j --){
                if(grid[m / 2][i] != grid[m / 2][j]) diff += grid[m / 2][i] + grid[m / 2][j];
                else{
                    if(i == j) continue;
                    one += grid[m / 2][i] + grid[m / 2][j];
                }
            }
        }
        if(n & 1){
            for(int i = 0, j = m - 1;i < m && i < j;i ++, j --){
                if(grid[i][n / 2] != grid[j][n / 2]) diff += grid[i][n / 2] + grid[j][n / 2];
                else{
                    if(i == j) continue;
                    one += grid[i][n / 2] + grid[j][n / 2];
                }
            }
        }
        return ans + (diff ? diff : one % 4);
    }
};

加油


http://www.kler.cn/a/399935.html

相关文章:

  • 【UGUI】背包的交互01(道具信息跟随鼠标+道具信息面板显示)
  • Kotlin return与return@forEachIndexed
  • 5个有效的华为(HUAWEI)手机数据恢复方法
  • 2024年11月16日 星期六 重新整理Go技术
  • 【C语言】科技要闻。
  • 详细分析ip addr show 查看网络配置的命令
  • uniapp微信小程序转发跳转指定页面
  • git环境开发问题-处理
  • 【Oracle实战】文章导读
  • go的接口详解
  • C++小白实习日记——Day 2 TSCNS怎么读取当前时间
  • css3的新特性有哪些?
  • 深度神经网络 FPGA 设计与现状
  • PCL点云开发-解决在Qt中嵌入点云窗口出现的一闪而过的黑窗口
  • 2024RISC-V中国峰会 演讲幻灯片和视频回放公开
  • 跨平台编译Go程序:GOOS和GOARCH环境变量的使用
  • 儿童玩具常用的语音ic芯片类别?
  • DNS原理详解,DNS解析过程
  • Python函数——函数的传入参数
  • HTTP/3 深入解读:现代互联网的加速引擎
  • WEB攻防-通用漏洞SQL注入Tamper脚本Base64Jsonmd5等
  • OceanBase 闪回查询
  • 国标GB28181视频平台EasyCVR视频融合平台H.265/H.264转码业务流程
  • FPGA开发流程
  • 企业组网面临的安全挑战及SD-WAN解决方案
  • [产品管理-89]:《产品思维30讲》的主要内容与核心思想,产品的本质是利用各种工具和思维模式,为用户和社会创造真正解决问题和满足需求的价值