1072. 按列翻转得到最大值等行数(leetcode,哈希)-------------------c++实现

news2025/1/19 11:09:20

1072. 按列翻转得到最大值等行数(leetcode,哈希)-------------------c++实现

题目表述

给定 m x n 矩阵 matrix 。

你可以从中选出任意数量的列并翻转其上的 每个 单元格。(即翻转后,单元格的值从 0 变成 1,或者从 1 变为 0 。)

返回 经过一些翻转后,行与行之间所有值都相等的最大行数 。

样例

示例 1:

输入:matrix = [[0,1],[1,1]]
输出:1
解释:不进行翻转,有 1 行所有值都相等。
示例 2:

输入:matrix = [[0,1],[1,0]]
输出:2
解释:翻转第一列的值之后,这两行都由相等的值组成。
示例 3:

输入:matrix = [[0,0,0],[0,0,1],[1,1,0]]
输出:2
解释:翻转前两列的值之后,后两行由相等的值组成。

条件

m == matrix.length
n == matrix[i].length
1 <= m, n <= 300
matrix[i][j] == 0 或 1

思路

思路一 (通过记录每行需要改变的数进行暴力):

通过把已知的m*n矩阵,通过记录每一行变为相同的值需要改变的数的列数,记录后,每两两行进行判断是否是相同的改变方法(这里可以通过判断每行记录的改变数的个数进行剪枝),获得最佳的改变方法。时间复杂度最坏可以达到O(mn2)但是实际因为剪枝判断应该是O(n2logm)。

思路二(哈希存储判断,leetcode答案思路):

通过unordered_map然后记录字符串出现的次数,字符串以0开头和以1开头的,如果全部位的异或都为1,那么说明是相似字符串,通过改变相同的位数就可以符合题目的要求。

注意点

ac代码

c++:

思路一
class Solution {
public:
    bool RowChangeIsSame(vector<vector<int>> &a,vector<vector<int>> &b)
    {
        
        bool existSame[2]={1,1};
        if(a[0].size()!=b[0].size()&&a[0].size()!=b[1].size())
            return false;
        for(int i=0;i<2;i++)    //through the a[0] to judge
        {
            if(a[0].size()!=b[i].size())
            {
                existSame[i]=0;
                continue;
            }
            for(int j=0;j<a[0].size();j++)
            if(a[0][j]!=b[i][j])
            {
                existSame[i]=0;
            break;
            }
        }
        return existSame[0]||existSame[1];
    }
    int maxEqualRowsAfterFlips(vector<vector<int>>& matrix) {
        vector<vector<vector<int>>> needChange(matrix.size(),vector<vector<int>>(2,vector<int>(0)));
        int max=0,now;
        for(int i=0;i<matrix.size();i++)
        for(int j=0;j<matrix[0].size();j++)
        {
            if(matrix[i][j]==0)
            needChange[i][0].push_back(j);
            else
            needChange[i][1].push_back(j);
        }
        for(int i=0;i<matrix.size();i++)   //traverse every main row
          {   
            now=0;
              for(int j=0;j<matrix.size();j++) //find main row's same change
                  {
                     if(RowChangeIsSame(needChange[i],needChange[j]))
                    now++;
                  }
            if(now>max)
            max=now;
          }
    return max;
    }
};

在这里插入图片描述

思路二

class Solution {
public:
    
    int maxEqualRowsAfterFlips(vector<vector<int>>& matrix) {
       unordered_map<string,int> remember;
    //    string flip=string(matrix[0].size(),'0');
        int result=0;
       for(int i=0;i<matrix.size();i++)
       {
        string now;
        for(int j=0;j<matrix[0].size();j++)
       {
        now+=matrix[i][j]^matrix[i][0];
       }

//答案写法,实测会更快
  		// string now = string(n,'0');
//   		for(int j=0;j<matrix[0].size();j++)
//        {
//         now[j]='0'+matrix[i][j]^matrix[i][0];
//        }

       remember[now]++;
       }
       for(auto &m:remember)
       {
        result=(m.second>result)?m.second:result;
       } 
       return result;
    }
};

在这里插入图片描述

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/flip-columns-for-maximum-number-of-equal-rows
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/527962.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

排序算法之基数排序

一、基数排序&#xff08;RadixSort&#xff09; 基数排序&#xff08;Radix sort&#xff09;是一种非比较型整数排序算法。 1. 基本思想 原理是将整数按位数切割成不同的数字&#xff0c;然后按每个位数分别比较。基数排序的方式可以采用LSD&#xff08;Least significant…

超详细:阿里云服务器安装宝塔面板教程(需要开端口)

使用阿里云服务器安装宝塔面板教程&#xff0c;阿里云服务器网以CentOS操作系统为例&#xff0c;安装宝塔Linux面板&#xff0c;先远程连接到云服务器&#xff0c;然后执行宝塔面板安装命令&#xff0c;系统会自动安装宝塔面板&#xff0c;安装完成后会返回面板地址、账号和密码…

理论力学专题----拉普拉斯一龙格一楞次矢量

质量 m平方反比的有心力场 对应势能 V-k/r牛顿定律&#xff1a;\dot{\vec{p}}-k\frac{\vec{r}}{r^3} 空间旋转对称群 略 下学期学完了补上 LRL矢量 LRL矢量\vec{A}: define: \vec{A} \eqv \vec{p} \times \vec{L} - mk\frac{\vec{r}}{r} LRL守恒 \frac{d}{dt}(\vec{p} \…

图神经网络:(节点分类)在Cora数据集上动手实现图神经网络

文章说明&#xff1a; 1)参考资料&#xff1a;PYG官方文档。超链。 2)博主水平不高&#xff0c;如有错误还望批评指正。 3)我在百度网盘上传了这篇文章的jupyter notebook。超链。提取码8888。 文章目录 代码实操1&#xff1a;GCN的复杂实现代码实操2&#xff1a;GCN的简单实现…

从零开始Vue3+Element Plus的后台管理系统(二)——Layout页面布局的实现

项目搭建好之后&#xff0c;开始写基本的布局。后台管理系统的布局3大元素&#xff1a;头部、侧栏、主要内容&#xff0c;各种布局结构相差不大&#xff0c;我选择了下图所示的布局&#xff0c;其中头部、侧栏、页签在页面中是固定的&#xff0c;只有主要内容容器会跟随页面滚动…

如何从计算机或 SD 卡中恢复已删除的音乐文件?

与我们中的许多人一样&#xff0c;您可能已经从喜爱的专辑中下载并保存了多个音乐文件以供离线收听&#xff0c;但如果您不小心或意外删除了这些音乐文件怎么办&#xff1f;不用担心&#xff0c;我们在这里列出了几种从计算机或 SD 卡中恢复已删除或丢失的音乐文件的方法。 您…

001+limou+Git的安装与入门

0.前言 您好&#xff0c;这里是limou3434的一篇个人博文&#xff0c;感兴趣的话您也可以看看我的其他文章。本系列主要深入讲解有关Git的基础知识和基础使用&#xff0c;在文章中会结合部分Git网站上推荐的电子书《Pro Git》来对Git进行解读&#xff0c;意在补充书中对您“不友…

Java 面试 | RabbitMQ(2023版)

文章目录 rabbitmq1、为什么要使用rabbitmq2、rabbitmq如何确保消息发送?消息接收?3、RabbitMQ的构造4、Exchange交换器的类型5、RabbitMQ的持久化6、RabbitMQ消息发送和接收过程7、如何保证消息队列的高可用8、如何处理消息丢失的情况9、如何保证消息没有重复消费10、如何保…

Shell系统编程三剑客之----sed编辑器

目录 一:sed编辑器 1.sed编辑器概述 2.sed的工作流程 3.sed的命令格式 4.常用选项 5.常用操作 二&#xff1a;sed操作事例 1.查询 &#xff08;1&#xff09;打印内容 ​&#xff08;2&#xff09;打印行数 ​&#xff08;3&#xff09;打印特殊字符、ASCII码 &…

python爬虫简述

Python爬虫是一种自动化获取互联网数据的技术&#xff0c;它可以通过编写程序自动访问网站并抓取所需的数据。在本文中&#xff0c;我们将介绍Python爬虫的基础知识、常用库和实际应用。 一、Python爬虫的基础知识 爬虫的定义 爬虫是一种自动化获取互联网数据的技术&#xf…

屏幕录像怎么录?分享3个简单实用的方法!

案例&#xff1a;怎么录制电脑屏幕&#xff1f; 【对于我这种不太熟悉电脑的人来说&#xff0c;想要录制电脑屏幕十分困难。听说录制电脑屏幕&#xff0c;需要用到录屏工具。有没有小伙伴有好的录屏软件介绍&#xff0c;顺便附带一下教程&#xff01;求&#xff01;】 屏幕录…

【冶金轧钢、电厂 JL-8B/E集成电路电流继电器 CMOS运算 JOSEF约瑟】

JL-8B/E集成电路电流继电器名称:集成电路电流继电器型号:JL-8B/E触点容量250V5A功率消耗&#xff1c;5W返回系数过电流:0.90.97;欠电流:1.051.15整定范围0.03~60A 系列型号&#xff1a; JL-8A/E集成电路电流继电器; JL-8B/E集成电路电流继电器&#xff1b; JL-8A/E11-004集成电…

[离散数学]命题逻辑与推理

目录 主析取范式 主合取范式推理理论(假设前提条件为真推出的结论)真值表法直接证明法** 常用推理公式 ** 间接证明 CP规则--附加前提证明法&#xff0c;证明比较方便 单条件形式&#xff0c;提取前件间接法 归谬法 结论是单命题&#xff0c;取反前提引入 常用 latex 定义 主析…

Druid未授权漏洞进一步的利用

一、漏洞描述 Druid是阿里巴巴数据库出品的为监控而生的数据库连接池。并且Druid提供的监控功能包括监控SQL的执行时间、监控Web URI的请求、Session监控等。Druid本身是不存在什么漏洞的&#xff0c;但当开发者配置不当时就可能造成未授权访问。本文除了介绍Druid未授权漏洞之…

js 使用正则获取 html中 所有span标签

let html <p>艾迪莎测试但大家还是</p><h1>你好啊</h1><p>啊是多久啊合适的<span style"text-decoration: underline;">静安寺</span>大家哈圣诞节<span style"text-decoration: underline;">哈桑</s…

企业需要专业电子邮件地址的4大原因

专业的企业电子邮件地址具有贵公司的自定义域名&#xff0c;而不是通用的Zoho Mail 、gmail或yahoo帐户&#xff0c;例如&#xff1a;john stargardening.com 大多数初学者使用不带域名的通用免费企业电子邮件帐户&#xff0c;这不是很专业。例如&#xff1a;zhangsan2022zoho.…

从零开始Vue3+Element Plus后台管理系统(六)——状态管理Pinia和持久化

Pinia 官网&#xff1a;https://pinia.vuejs.org/zh/ Pinia 是 Vue 的专属状态管理库&#xff0c;相比Vuex更好用&#xff0c;优点不多了说官网有&#xff0c;用起来最重要&#xff01; 在应用的根部注入创建的 pinia // main.ts import { createApp } from vue import { c…

CLMP证书:让你在职场中脱颖而出的秘密武器!

CLMP证书是一种精益管理专业证书&#xff0c;是针对精益管理领域的专业人士和学生的培训项目&#xff0c;旨在提高他们在精益管理方面的技能和知识。那么&#xff0c;CLMP证书的含金量高吗&#xff1f;接下来我们来探讨一下。 CLMP证书的优势体现 首先&#xff0c;CLMP证书的…

Android Jetpack Compose之使用脚手架快速搭建APP布局结构

概述 现在市场上大多数的手机APP的通用布局结构都是顶部有个顶部导航栏&#xff0c;底部有个底部导航栏&#xff0c;例如抖音的布局结构&#xff1a; 点击导航栏里面的各个项又可以跳转到相应的页面&#xff0c;现在这种结构特别流行&#xff0c;如果我们使用传统的View来实现…

Web自动化测试-如何进行Selenium页面数据及元素交互?教你一步不漏。

目录 前言&#xff1a; 一、Selenium简介 二、安装Selenium 1.Windows用户安装Selenium 2.安装Chrome浏览器驱动 三、使用Selenium进行页面数据及元素交互 1.启动浏览器 2.访问网页 3.查找元素 4.输入文本 5.点击按钮 6.提交表单 四、完整代码示例 五、总结 Web自…