2732. 找到矩阵中的好子集

题目

给你一个下标从 0 开始大小为 m x n 的二进制矩阵 grid

从原矩阵中选出若干行构成一个行的非空子集,如果子集中任何一列的和至多为子集大小的一半,那么我们称这个子集是好子集。

更正式的,如果选出来的行子集大小(即行的数量)为 k,那么每一列的和至多为 floor(k / 2)

请你返回一个整数数组,它包含好子集的行下标,请你将其升序返回。

如果有多个好子集,你可以返回任意一个。如果没有好子集,请你返回一个空数组。

一个矩阵 grid 的行子集,是删除 grid 中某些(也可能不删除)行后,剩余行构成的元素集合。

示例 1:

输入:grid = [[0,1,1,0],[0,0,0,1],[1,1,1,1]]
输出:[0,1]
解释:我们可以选择第 0 和第 1 行构成一个好子集。
选出来的子集大小为 2 。
- 第 0 列的和为 0 + 0 = 0 ,小于等于子集大小的一半。
- 第 1 列的和为 1 + 0 = 1 ,小于等于子集大小的一半。
- 第 2 列的和为 1 + 0 = 1 ,小于等于子集大小的一半。
- 第 3 列的和为 0 + 1 = 1 ,小于等于子集大小的一半。

示例 2:

输入:grid = [[0]]
输出:[0]
解释:我们可以选择第 0 行构成一个好子集。
选出来的子集大小为 1 。
- 第 0 列的和为 0 ,小于等于子集大小的一半。

示例 3:

输入:grid = [[1,1,1],[1,1,1]]
输出:[]
解释:没有办法得到一个好子集。

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m <= 10^4
  • 1 <= n <= 5
  • grid[i][j] 要么是 0 ,要么是 1

代码

完整代码

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>/*** Note: The returned array must be malloced, assume caller calls free().*/
int* goodSubsetofBinaryMatrix(int** grid, int gridSize, int* gridColSize, int* returnSize){int m = gridSize; int n = *gridColSize; int* res = (int*)calloc(2, sizeof(int)); *returnSize = 0; if(m == 1) {*returnSize = 1; for (int i = 0; i < n; i++){if(grid[0][i]){*returnSize = 0;}}}int *sum = (int*)calloc(m, sizeof(int)); for (int i = 0; i < m; i++){for (int j = 0; j < n; j++){sum[i] += grid[i][j];}}for (int i = 0; i < m; i++){for (int j = i + 1; j < m; j++){if(sum[i] + sum[j] <= n){bool good = true;for (int k = 0; k < n; k++){if(grid[i][k] & grid[j][k]){good = false;break;}}if(good){res[0] = i;res[1] = j;free(sum);*returnSize = 2;return res;}}}}free(sum);return res;
}

思路分析

这套代码用了枚举的方法。

整体思路是通过计算每一行的元素和,遍历所有可能的行对组合,检查是否满足好子集的条件。

每一列的限制:对于一个好子集,任何一列的和不能超过子集大小的一半。换句话说,对于任何一列,如果我们选择了一个 1,则我们必须选择足够的 0 来平衡,以确保该列的和不超过子集大小的一半。

总和限制:对于一个子集大小为 k,其所有列的和的总和不能超过 floor(k / 2) * n。这意味着每个选择的 1 都必须有相应的 0 来平衡,以确保满足好子集的条件。

好子集的存在性:为了证明在一个存在 nn > 2)行好子集的集合中,一定至少存在两行可以构成好子集,我们可以通过反证法来证明这一点。
假设在一个存在 n 行(n > 2)好子集的集合中,没有任何两行可以构成好子集。
根据好子集的定义,对于一个包含 k 行的子集,任何一列的和至多为 floor(k / 2)。因此,如果选择的行数为 k,那么:

  • 如果 k 是偶数,则每列的和至多为 k / 2
  • 如果 k 是奇数,则每列的和至多为 (k - 1) / 2
    由于假设中没有任何两行可以构成好子集,这意味着对于任何两行,它们在任意一列中的和都超过 1。即对于任何两行 ij,存在至少一列 l 满足 grid[i][l] + grid[j][l] > 1
    现在考虑整个 n 行好子集:
  • 如果选择这 n 行,并且 n > 2,根据假设,没有任何两行可以构成好子集,因此在每列中,任意选择的两行都存在一列和超过 1
    这是矛盾的。因为根据好子集的定义,在 n 行的子集中,每列的和不能超过 floor(n / 2)。如果没有任何两行可以构成好子集,则意味着任意两行在某一列中的和都超过 1,这与好子集的定义矛盾。因此,在存在 nn > 2)行好子集的集合中,一定至少存在两行可以构成好子集。

就此我们证明了在一个存在 nn > 2)行好子集的集合中,一定至少存在两行可以构成好子集。
因此我们仅需寻找2行即可。

拆解分析

  1. 初始化和特殊情况处理
int* res = (int*)calloc(2, sizeof(int)); 
*returnSize = 0; if(m == 1) 
{*returnSize = 1; for (int i = 0; i < n; i++){if(grid[0][i]){*returnSize = 0;}}
}

初始化结果数组 res 和返回大小 returnSize。处理特殊情况,当只有一行时,检查该行是否满足条件。

  1. 计算每一行的和
int *sum = (int*)calloc(m, sizeof(int)); for (int i = 0; i < m; i++)
{for (int j = 0; j < n; j++){sum[i] += grid[i][j];}
}

计算每一行的和并存储在数组 sum 中。

  1. 遍历所有行对组合,检查是否满足好子集条件
for (int i = 0; i < m; i++)
{for (int j = i + 1; j < m; j++){if(sum[i] + sum[j] <= n){bool good = true;for (int k = 0; k < n; k++){if(grid[i][k] & grid[j][k]){good = false;break;}}if(good){res[0] = i;res[1] = j;free(sum);*returnSize = 2;return res;}}}
}

遍历所有行对组合,检查每一列是否满足条件。如果满足,则返回该行对组合。

复杂度分析

  • 时间复杂度:最坏情况下,前m-1行全部相同且与第m行构成好子集,此时需要遍历所有情况,因此时间复杂度最坏为 O(m^2 * n)
  • 空间复杂度:使用了额外的数组存储每一行的和,空间复杂度为 O(m)

结果

在这里插入图片描述

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

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

相关文章

CNN-O-ELMNet: 优化的轻量化通用模型,用于肺部疾病分类和严重性评估| 文献速递-先进深度学习疾病诊断

Title 题目 CNN-O-ELMNet: Optimized Lightweight andGeneralized Model for Lung DiseaseClassification and Severity Assessment CNN-O-ELMNet: 优化的轻量化通用模型&#xff0c;用于肺部疾病分类和严重性评估 01 文献速递介绍 肺部疾病是全球主要的致残和死亡原因。根…

nextjs-创建layouts共用UI和独立pages页面

原文链接&#xff1a;https://nextjs.org/learn/dashboard-app/creating-layouts-and-pages 01-nextjs起步02-css样式03-处理字体和图片05-页面之间的导航跳转更多 到目前为止&#xff0c;您的应用程序只有一个主页。让我们学习如何使用布局和页面创建更多路由。 本章目标 …

【学习】科大睿智解读ITSS认证中咨询机构的作用

企业拥有ITSS认证这不仅将为企业开拓商机&#xff0c;提升竞争力&#xff0c;还能促使企业改进内部运维流程&#xff0c;提高服务质量&#xff0c;为客户提供更优质的IT运维支持。在ITSS认证中&#xff0c;咨询机构扮演着重要的角色&#xff0c;其主要作用包括以下几个方面&…

金融科技在智能投研领域的应用与前景

随着科技的飞速发展&#xff0c;金融科技&#xff08;FinTech&#xff09;正逐步渗透到金融行业的各个细分领域&#xff0c;其中智能投研领域作为金融科技的重要应用之一&#xff0c;正展现出巨大的潜力和广阔的前景。智能投研利用大数据、人工智能&#xff08;AI&#xff09;等…

Java高级重点知识点-14-Set接口、HashSet底层原理讲解

文章目录 Set接口 (HashSet 、LinkedHashSet)HashSet底层原理(重点理解) Set接口 (HashSet 、LinkedHashSet) 无序不重复 HashSet集合 HashSet 是根据对象的哈希值来确定元素在集合中的存储位置&#xff0c;因此具有良好的存取和查找性能。 public class HashSetDemo {publ…

新型防勒索病毒方案分享无需依靠病毒库

MCK具备可信系统&#xff0c;数据库保护&#xff0c;场景白名单&#xff0c;文件保护四大功能。如何运用在防勒索病毒中 在防勒索病毒的问题上&#xff0c;MCK主机的加固功能显得尤为重要。MCK的四大功能——可信系统、数据库保护、场景白名单以及文件保护&#xff0c;为我们在…

Excel 快速查询工具 2023.7.1 更新

Excel 快速查询工具作者表示这个软件是因为有时候需要在 Excel 和网站之间进行切换非常的麻烦&#xff0c;这款软件可以以半透明的方框位于桌面上。 特点 软件窗口半透明并至于顶部&#xff0c;无需来回切换界面。 实时查询&#xff0c;不用点击查询或者按回车之类的&#x…

IDEA 学习之 启动“卡死”

目录 1. 断点问题2. IDEA 版本问题 1. 断点问题 部分断点涉及应用启动&#xff0c;会导致启动“卡死” 2. IDEA 版本问题 部分 IDEA 版本存在启动问题&#xff0c;本人之前遇到过&#xff08;别人启动三分钟&#xff0c;我启动半个小时&#xff09;。更换别的版本&#xff…

docker技术的说明

根据学习网站整理&#xff1a;Docker 10分钟快速入门_哔哩哔哩_bilibili 小白也能看懂的容器科普说明_哔哩哔哩_bilibili 1.虚拟机&#xff0c;需要模拟硬件系统、运行整个操作系统&#xff0c;但体积臃肿&#xff0c;内存占用较高&#xff0c;程序的性能也会受到影响。 2.…

2024年全国VUE考试中心大全!

大家好&#xff0c;华为HCIA、HCIP、HCIE的笔试部分&#xff0c;都需要在VUE考试中心进行预约。但是很多同学都不知道当地VUE考试中心在哪里&#xff01; 为了解决大家的问题&#xff0c;这边整理了全国各大城市的VUE考试中心名称和详细地址。需要的小伙伴们可以来看看&#x…

JavaWeb系列十一: Web 开发会话技术(Cookie, Session)

韩sir Cookie技术Cookie简单示意图Cookie常用方法Cookie创建Cookie读取JSESSIONID读取指定Cookie Cookie修改Cookie生命周期Cookie的有效路径Cookie作业布置Cookie注意事项Cookie中文乱码问题 Session技术Session原理示意图Session常用方法Session底层机制Session生命周期Sessi…

FuTalk设计周刊-Vol.062

#AI漫谈 热点捕手 1.阿里云推出首个AI程序员&#xff1a;分钟级完成应用开发 在阿里云上海 AI 峰会上&#xff0c;阿里云推出了首个「AI 程序员」&#xff0c;其具备架构师、开发工程师、测试工程师等岗位技能&#xff0c;能完成任务分解、代码编写、测试、问题修复、代码提交…

react学习——14react生命周期图(旧)

1、生命周期图 2、单个组件 class Demo extends React.Component{//构造器constructor(props){console.log("count--constructor")super(props)this.state{count: 1}}//组件将要挂载componentWillMount(){console.log("count--componentWillMount")}//组件…

【AI大模型】ChatTTS——颠覆传统,赋能未来的文本到语音技术

文章目录 一、项目介绍二、代码解释三、从技术角度进行分析四、技术细节与实现五、优缺点分析六、应用场景分析七、未来展望八、结论 一、项目介绍 随着人工智能技术的不断进步&#xff0c;语音合成&#xff08;TTS&#xff09;技术得到了飞速发展。ChatTTS项目作为一个开源的…

用VScode打开keil下的文件中文编码乱码的问题,以及利用VScode转换字符编码的方法

目录 问题描述 解决方法 利用VScode转换字符编码的方法 问题描述 keil中默认的编码是ANIS如下图所示。 而VScode中默认的编码为UTF-8 &#xff0c;打开后如下。 解决方法 建议另存后&#xff0c;再打开目标文件&#xff0c;防止误操作&#xff01; 在VScode的最下方可以找…

MCP2515汽车CAN总线支持SPI接口的控制器芯片替代型号DPC15

器件概述 DPC15是一款独立CAN控制器&#xff0c;可简化需要与CAN总线连接的应用。可以完全替代兼容MCP2515 图 1-1 简要显示了 DPC15 的结构框图。该器件主要由三个部分组成&#xff1a; 1. CAN 模块&#xff0c;包括 CAN 协议引擎、验收滤波寄存 器、验收屏蔽寄存器、发送和接…

中学政史地杂志中学政史地杂志社中学政史地编辑部2024年第4期目录

每月时政 时政要闻&#xff08;2024年3月&#xff09; 李伟; 3-4 热点聚焦 全面加强基础设施建设,积极扩大有效投资 刘华; 5-7《中学生政史地》投稿&#xff1a;cn7kantougao163.com 蒙古国努力应对冰雪灾害 张仁杰; 8-10 复习指导 高中政治经济全球化内容复习…

Linux的免交互

交互&#xff1a;我们发出指令控制程序的运行&#xff0c;程序在接收到指令之后按照指令的效果做出对应的反应。 免交互&#xff1a;间接的通过第三方的方式把指令传送给程序&#xff0c;不用直接的下达指令。 1、here document免交互 ere document免交互&#xff1a;是命令…

【大数据】大数据的核心特征与挑战:Volume、Velocity、Variety、Veracity

目录 Volume&#xff1a;海量数据的挑战与机遇 挑战 技术挑战 机遇 Velocity&#xff1a;数据处理的速度与实时性 挑战 技术挑战 机遇 Variety&#xff1a;数据类型的多样性与复杂性 挑战 技术挑战 机遇 Veracity&#xff1a;数据的真实性与质量控制 挑战 技术挑…

数字内容“遍地开花”,AI技术如何创新“造梦”?

文 | 智能相对论 作者 | 陈泊丞 这是春晚舞台西安分会场《山河诗长安》的一幕&#xff1a;“李白”现世&#xff0c;带领观众齐颂《将进酒》&#xff0c;将中国人骨子里的豪情与浪漫演绎得淋漓尽致。 这又是浙江义乌商品市场里的另一幕&#xff1a;只会说几个英文单词的女老板…