LeetCode 2732. 找到矩阵中的好子集

一、题目描述

给定一个 m x n 的整数矩阵 mat 和一个整数 k,我们需要找到一个大小为 k 的子集 rows,使得这个子集对应的行在矩阵 mat 中构成的子矩阵中,所有元素之和最大。返回这个子矩阵中所有元素之和的最大值。

注意

  • 子集 rows 中的每个元素(即行索引)都应该是唯一的。
  • 子集 rows 的大小应为 k

示例

输入:mat = [[1,2,3],[4,5,6],[7,8,9]], k = 2
输出:18
解释:选择第 1 行和第 2 行,得到子矩阵 [[4,5,6],[7,8,9]],子矩阵中所有元素之和为 18。

二、解题思路

为了解决这个问题,我们需要从几个不同的角度进行思考。首先,由于题目要求返回的是子矩阵中所有元素之和的最大值,我们可以考虑使用贪心算法来尝试解决这个问题。但是,贪心算法在这里可能并不适用,因为我们不能保证每一步的选择都是最优的。

其次,我们可以考虑使用回溯法(Backtracking)来解决这个问题。回溯法是一种通过穷举所有可能的解来找出所有解的算法。在这个问题中,我们可以将回溯法应用于选择行索引的过程中,通过递归地尝试所有可能的组合,来找到满足条件的最优解。

具体的解题步骤如下:

  1. 定义回溯函数:我们需要定义一个回溯函数,该函数接受当前选择的行索引集合、当前选择的行索引数量以及当前子矩阵的元素和作为参数。
  2. 判断终止条件:在回溯函数中,我们首先判断当前选择的行索引数量是否达到了 k。如果达到了 k,则更新最大元素和(如果当前子矩阵的元素和大于之前的最大元素和)。
  3. 递归选择:然后,我们遍历矩阵中的每一行,对于每一行,我们有两种选择:选择该行(将其添加到当前选择的行索引集合中,并递归调用回溯函数处理下一行),或者不选择该行(直接递归调用回溯函数处理下一行)。
  4. 回溯操作:在递归调用完成后,我们需要将当前选择的行索引从集合中移除,以便尝试其他可能的组合。
  5. 初始化参数并调用回溯函数:最后,我们初始化最大元素和为一个较小的值(如0),并调用回溯函数开始处理第一行。
    但除了回溯法之外,如果矩阵的行数不是非常大,我们还可以考虑使用动态规划(Dynamic Programming)结合位运算来优化解决方案。以下是两种代码实现:

1. 回溯法(Backtracking)

def goodSubsetSum(mat, k):m, n = len(mat), len(mat[0])max_sum = 0def backtrack(rows, curr_sum, start):nonlocal max_sumif len(rows) == k:max_sum = max(max_sum, curr_sum)returnfor i in range(start, m):if i > start and mat[i] == mat[i - 1]:  # 避免重复选择相同的行continuebacktrack(rows + [i], curr_sum + sum(mat[i]), i + 1)backtrack([], 0, 0)return max_sum# 示例测试
mat = [[1,2,3],[4,5,6],[7,8,9]]
k = 2
print(goodSubsetSum(mat, k))  # 输出: 18

接下来,我们可以考虑使用动态规划的方法。然而,动态规划通常需要定义一个状态数组来保存中间结果,但在这个问题中,由于我们需要选择的是行索引,而不是具体的元素值,因此状态的定义可能会变得比较复杂。

2. 动态规划结合位运算(Dynamic Programming with Bit Manipulation)

由于矩阵中的行是唯一的(或者可以视为唯一,如避免选择重复行),我们可以使用位掩码(bitmask)来表示一个行集合。对于m行矩阵,我们可以使用一个m位的二进制数来表示选择了哪些行。

def goodSubsetSum(mat, k):m, n = len(mat), len(mat[0])dp = [0] * (1 << m)  # 初始化dp数组,大小为2^m# 初始化只选择一行的情况for i in range(m):dp[1 << i] = sum(mat[i])# 动态规划填充dp数组for mask in range(1, 1 << m):if bin(mask).count('1') <= k:  # 确保选择的行数不超过kfor i in range(m):if mask & (1 << i):  # 如果第i行被选择# 尝试移除第i行并更新最大和(实际上不会真的移除,只是计算不包括第i行的和)next_mask = mask ^ (1 << i)dp[mask] = max(dp[mask], dp[next_mask] + sum(mat[i]))# 查找包含k行的最大和max_sum = 0for mask in range(1 << m):if bin(mask).count('1') == k:max_sum = max(max_sum, dp[mask])return max_sum# 示例测试
mat = [[1,2,3],[4,5,6],[7,8,9]]
k = 2
print(goodSubsetSum(mat, k))  # 输出: 18

注意:动态规划结合位运算的方法在m(行数)较大时可能会因为空间复杂度过高而不太实用,因为它需要一个大小为2^m的数组来存储中间结果。然而,在m较小的情况下,这种方法可能会比回溯法更快,因为它避免了不必要的重复计算。

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

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

相关文章

天天大爆推文玩法营销号软件下载地址

天天大爆推文玩法营销号软件下载地址 天天大爆推文玩法营销号是一种营销策略&#xff0c;通过在社交媒体上发布频繁的推文来吸引关注和增加品牌曝光度。以下是一些可以用于天天大爆推文玩法营销号的策略&#xff1a; 营销号工具使用教程&#xff1a;https://iimenvrieak.feis…

数据结构之前缀树

写在前面 源码 。 前缀树&#xff0c;又叫做trie树&#xff0c;字典树&#xff0c;是一种多叉的树&#xff0c;一般用于单词前缀匹配的相关场景中&#xff0c;比如&#xff1a; 本文看下使用Java如何来实现这种数据结构。 1&#xff1a;基本介绍 思想&#xff1a;空间换时…

典型传感器简介及驱动安装

双目视觉传感器 Indemind 传感器简介 INDEMIND M1 是专为开发者提供的一款硬件&#xff0c;采用“双目摄像头IMU”多传感器融合架构与 微秒级时间同步机制&#xff0c;为视觉 SLAM 研究提供精准稳定数据源&#xff0c;以满足 SLAM 研究、导航及 避障开发、视觉动作捕捉开发、…

C++基础编程100题-014 OpenJudge-1.3-12 计算球的体积

更多资源请关注纽扣编程微信公众号 http://noi.openjudge.cn/ch0103/12/ 描述 对于半径为r的球&#xff0c;其体积的计算公式为$ V4/3*πr^3 $&#xff0c;这里取π 3.14。 现给定r&#xff0c;求V。 输入 输入为一个不超过100的非负实数&#xff0c;即球半径&#xff0…

C# 高频面试题

C# 初级面试题及详细解答 1. C#中的值类型和引用类型的区别是什么&#xff1f; 解答: 值类型存储在堆栈上&#xff0c;直接包含数据&#xff1b;引用类型存储在堆上&#xff0c;存储的是对象的引用。值类型包括基本类型如 int、float 和 struct&#xff1b;引用类型包括 clas…

Perl编程探索:深入理解数组变量

Perl语言以其在文本处理和系统管理任务中的强大能力而受到广泛欢迎。在Perl中&#xff0c;数组是处理多个值集合的一种关键数据结构。本文将深入探讨Perl中的数组变量&#xff0c;包括它们的声明、初始化、访问和操作。 Perl数组的基本概念 在Perl中&#xff0c;数组可以用来…

FL Studio 21 集成了音频剪辑和增益控制,你可以更快、更精确地控制音频电平,包括自动交叉淡入淡出及更多功能

以通过控制色调、饱和度、亮度、文本、仪表和步进序列器的颜色来改变你的DAW外观&#xff0c; DAW“情绪主题”控制&#xff0c;水果编曲将变得与众不同。 更快的音频编辑 FL Studio 21 集成了音频剪辑包络和增益控制&#xff0c;你可以更快、更精确地控制音频电平&#xff0c…

代码随想录算法训练营第十四天| 110.平衡二叉树 | 257. 二叉树的所有路径 | 404.左叶子之和 | 222.完全二叉树的节点个数

110.平衡二叉树 &#xff08;优先掌握递归&#xff09; 文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;后序遍历求高度&#xff0c;高度判断是否平衡 | LeetCode&#xff1a;110.平衡二叉树_哔哩哔哩_bilibili 1. 不知道咋做。 2. 在求二叉树的高度的代码上改&#xff…

学习面向对象前--Java基础练习题

前言 写给所有一起努力学习Java的朋友们&#xff0c;敲代码本身其实是我们梳理逻辑的一个过程。我们在学习Java代码的过程中&#xff0c;除了需要学习Java的一些基本操作及使用&#xff0c;更重要的是我们需要培养好的逻辑思维。逻辑梳理好之后&#xff0c;我们编写代码实现需要…

aws的alb,多个域名绑定多个网站实践

例如首次创建的alb负载均衡只有www.xxx.com 需要添加 负载 test2.xxx.com aws的Route 53产品解析到负载均衡 www.xxx.com 添加CNAME&#xff0c;到负载均衡的dns字段axx test2.xxx.com 添加CNAME&#xff0c;到负载均衡的dns字段axx 主要介绍目标组和规则 创建alb就不介…

windows系统命令设置ipv4参数(手动、自动)、设置DNS解析、命令设置计算机主机名

命令设置ipv4网络参数。 命令提示符中使用netsh命令为网络接口&#xff08;网络连接&#xff09;配置ipv4参数。命令格式如下&#xff1a; netsh interface ip set address "接口名称" static ip地址 子网掩码 [默认网关] 案例&#xff1a; 将本地 "以太网…

Spring底层原理之FactoryBean Bean工厂 单例对象 多例对象

FactoryBean 在 Spring Framework 中&#xff0c;FactoryBean 是一个用于创建其他 Bean 实例的特殊工厂 Bean。它允许开发者自定义 Bean 的创建逻辑&#xff0c;从而更加灵活地管理和配置 Bean 的实例化过程。 FactoryBean 接口 FactoryBean 接口是 Spring 框架中的一个重要…

推送电子邮箱与其他营销手段如何有效结合?

推送电子邮箱的效果如何&#xff1f;怎么优化邮件推送的策略&#xff1f; 将推送电子邮箱与其他营销手段有效结合&#xff0c;可以显著提升营销效果和用户体验。AokSend将探讨如何将推送电子邮箱与社交媒体营销、内容营销、搜索引擎优化&#xff08;SEO&#xff09;等手段相结…

ubuntu22.04安装AFLGo

git clone gitgithub.com:aflgo/aflgo.git cd aflgo export AFLGO$PWD sudo ./build.sh然后 上面的是官方流程 主要看下面 把build.sh里三个wget的先下好&#xff0c;放在对应路径&#xff0c;然后把他的注释掉&#xff0c;不然下载时间很长很长。然后下python那边容易报错&a…

ArkTS自定义组件

一、自定义组件基本结构 // 定义自定义组件 ButtonCom.ets Component export struct BtnCom{State msg: string "按钮";build() {Row(){Text(this.msg).onClick(() > {this.msg "测试"})}} } // 引入自定义组件 import {BtnCom} from "./Butto…

动物常见图像的图像分类数据集

常见动物图像分类数据集 数据集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1zZnCUZuNlX6MjuZImlDjTw?pwd03b9 提取码&#xff1a;03b9 数据集信息介绍&#xff1a; 文件夹 大象 中的图片数量: 1446 文件夹 松鼠 中的图片数量: 1862 文件夹 河马 中的图片数量:…

理解和处理不同类型的上下文的新型的语言模型ReALM

在人类的日常交流中&#xff0c;模糊的代词如“他们”或“那个”常常出现&#xff0c;它们的意义通常依赖于上下文才能明确。这种上下文的理解对于对话助手来说至关重要&#xff0c;因为它们旨在提供一种自然的交流体验。然而&#xff0c;现有的对话助手在处理这类模糊引用时往…

SAP查看接口日志

大部分SAP项目都会与其他外围系统进行集成&#xff0c;那么日常工作中&#xff0c;如果遇到接口传输问题&#xff0c;我们应该怎样查询呢&#xff1f; 也许这篇文章可以稍微解答一些基础的内容。 1、事务代码SXI_MONITOR检查接口日志&#xff1a; 执行的起止日期默认带出&…

oracle11g rac静默dbca创建实例反复报监听问题

问题 处理方法 手动创建监听程序 重新静默dbca建库

【Linux】性能分析器 gperftools 详解

1、安装 1.1 源码安装 1)源码下载 最新版本:https://github.com/gperftools/gperftools 稳定版本:https://github.com/gperftools/gperftools/releases 2)编译 ./configure make -j83)安装,默认安装在/usr/local/lib目录下 sudo make install1.2 命令安装 以Ubuntu…