当前位置: 首页 > 面试题库 >

算法问题:翻转列

薛望
2023-03-14
问题内容

假设给定一个由零和一组成的mxn网格,并且希望对该网格进行变换,以使最大行数仅由一组成。我们唯一允许在网格上执行的操作是选择一列并翻转该列中的所有零和一。我们还得到了一些整数k,并且必须
精确 执行k列翻转。给定网格和k的值,我们如何确定要翻转的列以最大化全部为1的行数?

我认为需要做一些动态的事情,但是我无法给出一个好的答案。有人可以帮忙吗?


问题答案:

让我们从问题的重要细节开始思考:如果两行包含一列在各行之间都不同(例如,一行中为零,而一行中为一),那么就没有办法两行全都是。为此,假设某行x在某列中为零,而y在该列中为1。然后,如果我们不翻转该列,则行x不能全部为1,如果我们翻转该列,则行y也不能全部为1。因此,如果我们看一下原始矩阵并尝试考虑将要构成的所有行,那么实际上我们将只选择一组彼此相等的行。然后,我们的目标是选择一组尽可能大的相同行,并且可以使用完全k次翻转将其分成所有行。让’
s表示,可以完全使用k次翻转将所有行都变成一个“候选行”。然后,我们只需要在矩阵中找到出现次数最多的候选行。

执行此操作的实际算法取决于是否允许我们翻转同一列两次。如果不是,那么候选行就是其中恰好有k个零的行。如果我们可以多次翻转同一列,那么这会有些棘手。为了使行全为1,我们需要将每个零转换为1,然后需要继续花费其余翻转将同一列翻转两次,以避免将任何一个更改为零。如果k和行中零个数之间的差是非负偶数,则为true。

使用此算法,我们得到以下算法:

  1. 维护从候选行到其频率的哈希表映射。
  2. 对于每一行:
    1. 计算行中的数字或零。
    2. 如果k与该数字之间的差为非负偶数,请通过增加此特定行的频率来更新哈希表。
  3. 在哈希表中找到总频率最高的候选行。
  4. 输出该行的频率。

总体而言,在mxn矩阵(m行,n列)上,我们每行访问一次。在访问期间,我们进行O(n)工作以计算零的数量,然后O(1)工作以查看其是否有效。如果是这样,则由于哈希步骤需要O(n)时间来对行进行哈希处理,因此更新哈希表需要花费O(n)时间。这意味着我们花费O(mn)时间填写表格。最后,对于网络运行时间O(mn),最后一步需要时间O(m)来找到最大频率行,该运行时间在输入大小上是线性的。而且,这是渐近最优的,因为如果我们花费的时间少于此,我们将看不到al,即矩阵元素!

希望这可以帮助!这是一个很酷的问题!



 类似资料:
  • 前言 算法主要包括: 1、排序 排序一定要准备。 2、堆栈、队列、链表 队列和链表可以不准备,但是堆栈一定要准备。 一个小技巧:JS的数组本身就具备堆栈和队列的特性。比如:top、push、shift、unshift这四个api,本身就帮我们实现了堆栈和队列。 堆栈:先进后出。 3、递归 递归是一定不能偷懒的。算法比较难的时候,一般要用到递归。 4、波兰式和逆波兰式 总结: 比如阿里,如果基础题答

  • Angel是一个分布式机器学习平台,在上面运行算法,得到模型,这只是第一步,更加关键第二步,训练出来模型,要有比较好的准确率,可以对数据进行准确预测。在这个过程中,用户可能会遇到各种各样的问题,这里我们也一一总结一下 LR 模型不收敛,预测效果差 请检查正则项系数是否适合,过大的正则项参数会影响模型收敛,建议不大于 1/featureNum 检查Learn Rate是否过大 检查数据预处理是否有做

  • 要求你写一份关于以下算法问题的报告:这道题要求你在一组真币中找出一个假币。这枚假硬币之所以能被找到,是因为它和其余的真硬币的重量不一样。不是轻了就是重了,只是你事先不知道。你要做决定的唯一方法是一个经典的带有两个托盘的天平秤。你可以把一个或多个硬币放在一个托盘上,一个相似的数字放在另一个托盘上,并确定哪个托盘有较轻的一堆。例如,如果你只有三个硬币,那么拿硬币1和硬币2称重。如果天平平衡,那么硬币3

  • 我是C的新手,目前我正在尝试编写一个Brainfuck解释器。到目前为止,我已经尝试过了。 它只在没有循环(“[”和“]”)的情况下工作。当我尝试时: 它给我输出 预期产出:

  • 本文向大家介绍PHP使用strrev翻转中文乱码问题的解决方法,包括了PHP使用strrev翻转中文乱码问题的解决方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP使用strrev翻转中文乱码问题的解决方法。分享给大家供大家参考,具体如下: 在用PHP中的strrve翻转中文时,会出现乱码情况 例如: 运行结果为: 解决方法就是自己重写一个cnstrrev的函数 运行结果为: 更多

  • 本文向大家介绍算法题:翻转中间由各种符号隔开的字符串 相关面试题,主要包含被问及算法题:翻转中间由各种符号隔开的字符串 时的应答技巧和注意事项,需要的朋友参考一下 参考回答: Java 版本  

  • 字符串的运算符号怎么转换成js的表达式

  • 下面是我的代码: 我不断收到奇怪的错误,一个告诉我,嵌套if语句中的if(operators.peek().equals...位返回一个EmptyStackException。我在试图将弹出的数字(endNumber)转换为double时又收到了一个错误。我在将其转换为double时遇到了一个问题。