首页 > 其他分享 >(nice!!!)(LeetCode) 3240. 最少翻转次数使二进制矩阵回文 II (分类讨论、数组)

(nice!!!)(LeetCode) 3240. 最少翻转次数使二进制矩阵回文 II (分类讨论、数组)

时间:2024-11-16 14:14:41浏览次数:3  
标签:ct1 int res 3240 II grid ans ct nice

题目:3240. 最少翻转次数使二进制矩阵回文 II

在这里插入图片描述
在这里插入图片描述
思路:分类讨论,需要对行和列的个数进行讨论,时间复杂度为0(nm),细节看注释。

C++版本:

class Solution {
public:
    int minFlips(vector<vector<int>>& grid) {
        int ans=0;
        int n=grid.size(),m=grid[0].size();
        //当行和列都为偶数时
        for(int i=0;i<n/2;i++){
            for(int j=0;j<m/2;j++){
            	//只需让对应四个角位置上的数保持一致
                int ct=grid[i][j]+grid[n-i-1][j]+grid[i][m-j-1]+grid[n-i-1][m-j-1];
                //因为1的个数要被4整除,在此前提下最少翻转次数为min(ct,4-ct)
                ans+=min(ct,4-ct);
            }
        }
        //当行和列都为奇数时,中间位置必须是0
        if(n%2&&m%2) ans+=grid[n/2][m/2];
        //ct1来记录当行和列为奇数时,相同的前提下1的个数。
        //res来记录当行和列为奇数时,不同时,需要进行修改的次数。
        int ct1=0,res=0;
        //奇数行
        if(n%2){
            for(int j=0;j<m/2;j++){
                if(grid[n/2][j]==grid[n/2][m-j-1]) ct1+=grid[n/2][j]*2;
                else res++;
            }
        }
        //奇数列
        if(m%2){
            for(int i=0;i<n/2;i++){
                if(grid[i][m/2]==grid[n-i-1][m/2]) ct1+=grid[i][m/2]*2;
                else res++;
            }
        }
        //先把要修改的次数加上
        ans+=res;
        //如果ct1的个数不能被4整除,且res为0时,就需要将一对1修改为0。而res不为0时,将一个0修改为1即可。剩余的res-1都修改为0。
        if(ct1%4&&res==0) ans+=2;

        return ans;
    }
};

JAVA版本:

class Solution {
    public int minFlips(int[][] grid) {
        int ans=0;
        int n=grid.length,m=grid[0].length;
        //当行和列都为偶数时
        for(int i=0;i<n/2;i++){
            for(int j=0;j<m/2;j++){
            	//只需让对应四个角位置上的数保持一致
                int ct=grid[i][j]+grid[n-i-1][j]+grid[i][m-j-1]+grid[n-i-1][m-j-1];
                //因为1的个数要被4整除,在此前提下最少翻转次数为min(ct,4-ct)
                ans+=Math.min(ct,4-ct);
            }
        }
        //当行和列都为奇数时,中间位置必须是0
        if(n%2==1&&m%2==1) ans+=grid[n/2][m/2];
        //ct1来记录当行和列为奇数时,相同的前提下1的个数。
        //res来记录当行和列为奇数时,不同时,需要进行修改的次数。
        int ct1=0,res=0;
        //奇数行
        if(n%2==1){
            for(int j=0;j<m/2;j++){
                if(grid[n/2][j]==grid[n/2][m-j-1]) ct1+=grid[n/2][j]*2;
                else res++;
            }
        }
        //奇数列
        if(m%2==1){
            for(int i=0;i<n/2;i++){
                if(grid[i][m/2]==grid[n-i-1][m/2]) ct1+=grid[i][m/2]*2;
                else res++;
            }
        }
        //先把要修改的次数加上
        ans+=res;
        //如果ct1的个数不能被4整除,且res为0时,就需要将一对1修改为0。而res不为0时,将一个0修改为1即可。剩余的res-1都修改为0。
        if(ct1%4!=0&&res==0) ans+=2;
        return ans;
    }
}

标签:ct1,int,res,3240,II,grid,ans,ct,nice
From: https://blog.csdn.net/weixin_46028214/article/details/143816169

相关文章

  • 【IEEE出版、八大高校联合举办、稳定EI检索】第四届人工智能与智能制造国际研讨会(AIIM
    第四届人工智能与智能制造国际研讨会(AIIM2024)The4thInternationalSymposiumonArtificialIntelligenceandIntelligentManufacturing2024年12月20-22日中国成都重要信息大会官网:www.isaiim.com大会时间:2024年12月20-22日大会地点:中国-成都二轮截......
  • 使用 roslyn 的 Source Generator 自动完成依赖收集和注册 - IIncrementalGenerator
    书接上文使用roslyn的SourceGenerator自动完成依赖收集和注册-J.晒太阳的猫-博客园收到来自徳熙大佬的提示:现在VisualStudio团队推荐使用增量的源代码生成器,因为现在这篇博客使用的源代码生成器让原本就卡慢的VisualStudio更加卡慢了。新的增量源代码生成器是......
  • 代码随想录算法训练营day47| 739. 每日温度 496.下一个更大元素 I 503.下一个
    学习资料:https://programmercarl.com/0739.每日温度.html#算法公开课单调栈:用数组模拟单调栈,今天的题中,栈中元素都保存的索引值基本思路:将新元素和栈顶索引对应值比较,如果要保持单调递增,则需要新元素不大于栈顶索引对应值;若满足就加入新元素索引到栈中;若不满足,就根据具体题意看......
  • 1159. 市场分析 II
    目录题目链接(无VIP请直接看下面的需求)题目和题目代码1.读题(建议使用这种表结构和数据对比看阅读)2.答案代码以及图表解释题目链接(无VIP请直接看下面的需求)链接:15分钟没思路建议直接看答案题目和题目代码表:Users+----------------+---------+|Colu......
  • Modbus TCP转Modbus ASCII解决方案
    ModbusTCP和ModbusASCII是两种不同的通信协议。ModbusTCP是一种二进制协议,ModbusASCII是一种基于文本的协议。二者不能直接转换,因为它们的数据表示方式、消息结构、字符编码等都不相同。如果你需要将ModbusTCP转换为ModbusASCII,你需要先解析ModbusTCP消息,然后按照ModbusA......
  • C++ RAII 范式指南
    1.RAII概述RAII(ResourceAcquisitionIsInitialization)是C++中最重要的资源管理机制之一,它将资源的生命周期与对象的生命周期绑定,确保资源的安全使用和自动释放。历史背景:RAII概念由BjarneStroustrup在1984-1989年间提出最早用于解决C++异常处理中的资源泄......
  • .NetCore 6.0 Blazor WebAssembly 开发网页部署到IIS上
    一、安装、启用IIS服务使用ctrl+r打开运行输入optionalfeatures打开Windows功能管理窗口 开启Internet服务,点击确定 重启电脑开启IIS,查看IIS是否正常启动 打开默认IIS默认网站,查看是否正常开启 出现下图,即开启IIS服务成功二、安装.NETCoreSDK下载.NET......
  • [oeasy]python0041_输出ASCII码表_英文字符编码_键盘字符_ISO_646
    输出ASCII码表_英文字符编码_键盘字符_ISO_646回忆上次内容上次输出了从0到122序号对应的所有字符 fornuminrange(123):print(num,chr(num),sep=":")字符类型包括数字大小写字母符号   添加图片注释,不超过14......
  • 代码随想录算法训练营第二天| 209.长度最小的子数组、59. 螺旋矩阵 II
    文档讲解:代码随想录视频讲解:代码随想录状态:完成2道题滑动窗口滑动窗口:两个指针一前一后组成滑动窗口,并计算滑动窗口中的元素的问题适用场景:字符串匹配问题、子数组问题、定长问题滑动窗口模板:如果一个字符进入窗口,应该增加windows计数器;如果一个字符将移除窗口的......
  • 力扣-Mysql-3252-英超积分榜排名 II(中等)
    一、题目来源3252.英超积分榜排名II-力扣(LeetCode)二、数据表结构表:TeamStats+------------------+---------+|ColumnName|Type|+------------------+---------+|team_id|int||team_name|varchar||matches_played......