LeetCode 2352. Equal Row and Column Pairs【模拟,哈希表,前缀树】中等

news2024/12/25 9:02:03

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。

为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库:https://github.com/memcpy0/LeetCode-Conquest。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。

由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。

给你一个下标从 0 开始、大小为 n x n 的整数矩阵 grid ,返回满足 Ri 行和 Cj 列相等的行列对 (Ri, Cj) 的数目。

如果行和列以相同的顺序包含相同的元素(即相等的数组),则认为二者是相等的。

示例 1:

输入:grid = [[3,2,1],[1,7,6],[2,7,7]]
输出:1
解释:存在一对相等行列对:
- (2 行,第 1)[2,7,7]

示例 2:

输入:grid = [[3,1,2,2],[1,4,4,5],[2,4,2,2],[2,4,2,2]]
输出:3
解释:存在三对相等行列对:
- (0 行,第 0)[3,1,2,2]
- (2,2)[2,4,2,2]
- (3,2)[2,4,2,2]

提示:

  • n == grid.length == grid[i].length
  • 1 <= n <= 200
  • 1 <= grid[i][j] <= 10^5

解法1 模拟

按照题目要求对任意一行,将它与每一列都进行比较,如果相等则结果加一,最后返回总数。

class Solution {
public:
    int equalPairs(vector<vector<int>>& grid) {
        int n = grid.size();
        int ans = 0;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) { // 每次将第i行比较第j列
                int ok = 1;
                for (int k = 0; k < n; ++k) {
                    if (grid[i][k] != grid[k][j]) { // 第i行第k列等于第j列第k行
                        ok = 0;
                        break;
                    }
                }
                ans += ok;
            }
        }
        return ans;
    }
};

复杂度分析:

  • 时间复杂度: O ( n 3 ) O(n^3) O(n3)
  • 空间复杂度: O ( 1 ) O(1) O(1)

解法2 哈希表

首先将矩阵的行放入哈希表中统计次数,哈希表的键可以是将行(用分隔符)拼接后的字符串,也可以用各语言内置的数据结构,然后分别统计与每一列相等的行有多少,求和即可。

class Solution {
    public int equalPairs(int[][] grid) {
        int n = grid.length;
        var cnt = new HashMap<List<Integer>, Integer>();
        for (int[] row : grid) {
            List<Integer> arr = new ArrayList<Integer>();
            for (int num : row) arr.add(num);
            cnt.put(arr, cnt.getOrDefault(arr, 0) + 1);
        }
        int ans = 0;
        for (int j = 0; j < n; ++j) {
            var arr = new ArrayList<Integer>();
            for (int i = 0; i < n; ++i) arr.add(grid[i][j]);
            ans += cnt.getOrDefault(arr, 0);
        }
        return ans;
    }
}

复杂度分析:

  • 时间复杂度: O ( n 2 ) O(n^2) O(n2) ,将行放入哈希表中消耗 O ( n 2 ) O(n^2) O(n2) ,读取所有列的哈希表中的次数也消耗 O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度: O ( n 2 ) O(n^2) O(n2) ,哈希表的空间复杂度为 O ( n 2 ) O(n^2) O(n2)

解法3 前缀树

将每行当成一个数值序列,存到前缀树中;然后对每一列,分别查询其在前缀树中相同的数值序列个数。

class Solution {
private:
    class Trie {
    public: 
        int endNum; // 记录以此为终结点的数组的个数
        Trie() : endNum(0) {}
        unordered_map<int, Trie*> children;    
    };
public:
    int equalPairs(vector<vector<int>>& grid) {
        int n = grid.size();
        Trie* root = new Trie;
        Trie* cur = root;
        for (int i = 0; i < n; ++i) {
            cur = root;
            for (int j = 0; j < n; ++j) {
                if (!cur->children[grid[i][j]])
                    cur->children[grid[i][j]] = new Trie;
                cur = cur->children[grid[i][j]];
            }
            ++cur->endNum;
        }
        int ans = 0;
        for (int j = 0; j < n; ++j) {
            cur = root;
            for (int i = 0; i < n; ++i) {
                if (cur->children[grid[i][j]])
                    cur = cur->children[grid[i][j]];
                else break;
            }
            ans += cur->endNum;
        }
        return ans;
    }
};

复杂度分析:

  • 时间复杂度: O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度: O ( n 2 ) O(n^2) O(n2)

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

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

相关文章

100G QSFP28光模块类型和使用场景

100G QSFP28光模块是当前数据中心和通信网络中广泛应用的高速光模块之一。本文将详细介绍100G QSFP28光模块的类型、应用场景以及市场发展前景&#xff0c;并引用相关产品参数和行业统计数据&#xff0c;为读者提供全面的了解。 一、100G QSFP28光模块类型 100G QSFP28光模块…

开源 API 网关的访问策略(一)

许多企业和组织面临着网关访问控制的挑战&#xff0c;因为传统的访问控制方法往往过于笨重和繁琐。这些方法可能涉及复杂的规则集、繁琐的手动配置过程、缺乏灵活性和可扩展性等问题。此外&#xff0c;随着云计算和移动设备的广泛应用&#xff0c;访问控制的复杂性和挑战程度也…

stable-diffusion-webui 安装采坑日记

这里写自定义目录标题 安装容易采坑的点效果测试 安装容易采坑的点 1、不愿安装大佬的整合包。在自己时间足够多的情况下&#xff0c;可以尝试自己搭环境。但是自己安装的时间成本真的非常高&#xff0c;环境配置报错会让人陷入崩溃&#xff0c;如果没有代码排错能力&#xff…

sw2urdf导出的urdf文件中的惯性参数(inertial)错误的问题

现象描述 有时候&#xff0c;当我们使用solidworks建好我们的模型&#xff0c;然后利用【sw2urdf】导出后&#xff0c;发现其中的惯性参数&#xff0c;似乎不正确&#xff0c;ixx、izz这些参数都是很接近0的&#xff1a; 资料查找 其实这个不是我们设置的问题&#xff0c;而…

蓝牙耳机什么牌子好?无线蓝牙耳机品牌推荐

相信很多人都有过这样的经历&#xff0c;早晚高峰像沙丁鱼般被挤在公交或地铁上&#xff0c;嘈杂的环境、工作的劳累让你只想听听音乐追追剧&#xff0c;给自己一些放松的时光。可拿出有线耳机却常常被挤掉&#xff0c;更有被扯到耳朵的时候。想换一款蓝牙耳机&#xff0c;但面…

做连接中国企业出海的全球技术桥梁,亚马逊云科技出海日盛夏盛启

出海路漫漫&#xff0c;企业开拓全球市场而孤军奋战&#xff0c;常常会感到力不从心。好的产品有了&#xff0c;渠道有了&#xff0c;供应链有了&#xff0c;还要自己从0-1搭建存储、网络和架构&#xff1f;营销季来了想趁机冲一波销量&#xff0c;还要自己运维本地IDC、大促来…

docker-compose 部署zookeeper集群 —— 筑梦之路

1. zookeeper介绍 Zookeeper是一个开源的分布式协调服务中间件&#xff0c;它提供了一种分布式数据管理服务&#xff0c;能够实现分布式锁、命名服务、配置管理、集群管理等功能&#xff0c;从而帮助用户构建高可用、高性能的分布式系统。以下是Zookeeper的一些主要特点和功能&…

Java注解的入门学习

一、概念 Java注解是一种元数据形式&#xff0c;可以被添加到Java代码中的各种元素&#xff08;类、方法、字段等&#xff09;上&#xff0c;以提供关于这些元素的额外信息。注解是在Java 5中引入的一项特性&#xff0c;它们不直接影响代码的执行&#xff0c;而是提供了一种机…

顺序表算法练习

一.顺序表基础算法 1.说明 博主这里是算法练习&#xff0c;帅气的读者来这里默认已经知道了它&#xff0c;这里主要是针对408考研真题中关于线性表的算法题进行编写。第一部分是根据课本编写线性表的基本函数&#xff0c;剩下四个部分是针对考研真题的算法练习。 2.C语言代码…

ChatGLM的模型架构

ChatGLM的部署微调等&#xff0c;很多资料&#xff0c;不再赘述。 P-tuning V2 以P-Turing V2为例&#xff0c;介绍ChatGLM的网络结构。P-tuning V2方法训练时冻结模型的全部参数&#xff0c;只激活prefix_encoder的参数。 1、prefix encoder 初始化pre_len&#xff0c;代表…

Apple pencil平替哪款好?平价电容笔测评

现今&#xff0c;使用电容笔的人越来越多&#xff0c;各大品牌厂商对电容笔各种性能的设计也愈发用心。那么&#xff0c;电容笔哪个品牌好用呢&#xff1f;下面&#xff0c;我来给大家推荐几款质量好的Apple pencil平替&#xff0c;需要的小伙伴可以当个参考。 一、如何挑选到…

Vue3+TS+Vite开发组件库并发布到npm

Vue2开发插件并发布到npm 使用VitePress静态网站生成器创建组件库文档网站并部署到GitHub 目标&#xff1a;创建 vue-amazing-ui 组件库 &#xff0c;并发布到npm 该组件库已发布到 npm&#xff0c;直接安装即可使用&#xff1a; pnpm i vue-amazing-ui #or yarn add vue-a…

(十一)K8S可视化工具Rancher学习、安装

1.Rancher背景概述 在过去几年中&#xff0c;容器技术如 Docker 和容器编排引擎如 Kubernetes 受到了广泛关注和采用&#xff0c;它们为应用程序的部署、可扩展性和管理带来了革命性的变化。 然而&#xff0c;随着容器技术的快速发展&#xff0c;容器集群的管理和操作变得越来…

【笔试强训选择题】Day21.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01; 文章目录 前言 一、…

hadoop搭建、mysql、hive部署

写在前面&#xff1a; 本篇文章基于linux系统Centos7环境下进行搭建、操作 仅作为学习参考借鉴&#xff0c;欢迎大家交流学习&#xff01;一、 HDFS安装搭建 1.1 关闭虚拟机防火墙 在之后的学习、操作中&#xff0c;经常会遇到在宿主机中通过程序去访问虚拟机中的相关软件&am…

再获肯定!Coremail入选2023网络空间安全大会优秀案例!

6月2日-3日&#xff0c;在中国电子学会主办的“2023网络空间安全大会”上&#xff0c;由广东盈世计算机科技有限公司申报的“Coremail邮件安全解决方案”获评2023网络空间安全大会优秀案例&#xff0c;再次获得行业权威认可&#xff01; 本次大会由中国电子学会主办&#xff0c…

hudi系列-append写过程

前言 Append模式每次都生成新的parquet文件,不涉及数据修改、去重。cow+insert一直是append模式,mor+insert在0.13.1后也统一走append写流程(HUDI-6045) 在0.13.1之前,mor+insert存在着写parquet和写log两种情况: 写parquet:compaction.schedule.enabled = false & …

Loadrunner和JMeter、Locust三款性能测试工具全面对比

随着软件技术的发展&#xff0c;软件应用越来越普遍&#xff0c;不仅仅是互联网大厂的应用需要进行性能测试了&#xff0c;就连一些中小型的互联网应用也越来越需要对软件项目进行性能测试了。所以本文就将通过Loadrunner、JMeter和Locust三款性能测试工具从以下几个方面进行介…

QML学习二:Doxygen为qml工程生成代码文档

效果如下: 设置后能够支持.js和.qml文档。 QML学习二:Doxygen为工程生成注释文档 前言一、安装doxyqml二、Doxygen设置1.文档目录设置2.文档目录设置三、添加注释总结前言 好的代码必须配一个好的文档说明,方便以后维护以及学习。 前提条件: 1.安装好了Doxygen代码生成工…

快速搭建,降低成本!了解低代码平台适用的五大场景

对于希望简化应用程序开发流程的公司来说&#xff0c;低代码平台已经成为一种有效的解决方案。这些平台使创建和部署应用程序成为可能&#xff0c;而不需要广泛的编码技能或知识&#xff0c;从而使过程更快、更高效、更具成本效益。但是&#xff0c;低代码平台适用于哪些场景呢…