来LeetCode练下思维吧

embedded/2024/11/19 10:20:23/

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.ppmy.cn/embedded/138743.html

相关文章

Tomcat(17) 如何在Tomcat中配置访问日志?

在Apache Tomcat中配置访问日志是一个重要的步骤&#xff0c;它可以帮助你跟踪和分析服务器的HTTP请求。访问日志通常记录了每个请求的详细信息&#xff0c;如客户端IP地址、请求时间、请求的URL、HTTP状态码等。以下是如何在Tomcat中配置访问日志的详细步骤和代码示例。 步骤…

易考八股文之Elasticsearch合集

1、为什么要使用 Elasticsearch? 系统中的数据&#xff0c; 随着业务的发展&#xff0c; 时间的推移&#xff0c; 将会非常多&#xff0c;而业务中往往采用模糊查询进行数据的 搜索&#xff0c;而模糊查询会导致查询引擎放弃索引&#xff0c; 导致系统查询数据时都是全表扫描&…

element-plus如何修改内部样式而不影响vue其他组件的样式

使用scoped样式 可以在组件的样式中使用scoped修饰符&#xff0c;以限制样式仅作用于当前组件中的元素。这样就可以在不影响全局样式的情况下&#xff0c;修改element-plus组件的样式。 <template><div class"my-component"><el-button>按钮</e…

华为USG5500防火墙配置NAT

实验要求&#xff1a; 1.按照拓扑图部署网络环境&#xff0c;使用USG5500防火墙&#xff0c;将防火墙接口加入相应的区域&#xff0c;添加区域访问规则使内网trust区域可以访问DMZ区域的web服务器和untrust区域的web服务器。 2.在防火墙上配置easy-ip&#xff0c;使trust区域…

ArcGIS Pro ADCore DAML

ArcGIS Pro ADCore DAML ArcGIS Pro SDK - ADCore.daml https://download.csdn.net/download/szy13323042191/89997391

离线语音识别自定义功能怎么用?

一、离线语音识别 随着人工智能的飞速发展&#xff0c;离线语音识别技术成为了一项备受瞩目的创新。离线语音识别技术能够将人的语音转化为可理解的文本&#xff0c;无需依赖网络连接&#xff0c;极大地提升了语音识别的便捷性和实用性。 与传统的云端语音识别相比&#xff0c;…

网络层7——外部网关协议BGP

首先我们来搞清楚一个问题&#xff1a; 那就是为什么要分内部和外部协议&#xff1f; 直接搞同一个协议不就行了吗&#xff1f; 好的&#xff0c;例如我们现在只有内部协议&#xff0c;RIP和OSPF 对RIP协议&#xff1a;最多支持15路由器&#xff0c;无法实现全球联网 对OSPF协议…

云原生周刊:Kubernetes v1.32 要来了

开源项目推荐 Woodpecker Woodpecker 是一款轻量级且功能强大的 CI/CD 引擎&#xff0c;以其高度可扩展性和易用性著称。它支持多种版本控制系统与编程语言&#xff0c;能够灵活适配不同开发流程&#xff0c;帮助团队实现高效的持续集成与交付。无论是个人项目还是大型团队&a…