c# - Java/C# - Array[][] 复杂性任务

标签 c# java arrays algorithm task

<分区>

我正在通过我的大学处理一些有问题的复杂性问题:

程序输入:n x n Array[][],其中填充有 01

定义:如果 k 行中的所有值都是 0,则将 k 定义为 SINK,并且在 k 列中,所有值都是 1([k][k] 本身除外,它需要为 0)

程序输出:是否有第 k 个数是 SINK?如果是,返回k,否则返回-1

示例:

example

在 Arr A 上 k=3 是一个 SINK,在 Arr B 上没有 SINK,所以返回 -1。

这个任务的主要问题是程序的复杂度必须低于 O(n^2) ,我已经设法解决了这个问题,通过斜线求和行和列。我还没有找到用 O(logn)O(n) 解决这个问题的方法。该任务还阻止您使用另一个 Array[] (由于内存复杂性)。任何人都可以对此事有所了解吗?提前致谢!

最佳答案

只是为了明确哈罗德在 OP 的评论中链接到的答案:从所有 n 索引的列表开始,S = {0, 1, .., n- 1}。这些是我们的水槽候选者。在每一步,我们都将消除其中一个。

  1. 考虑 S 的前两个元素,比如 ij
  2. 检查 A[i, j] 是否为 1。
    • 如果是,则从 S 中删除 i(因为第 i 行不全为 0,所以 i 不能我们的水槽)
    • 如果不是,则从 S 中删除 j(因为第 j 列不全为 1,所以 j 不能'不是我们的水槽)
  3. 如果S中还有两个或更多元素,则返回步骤1。
  4. 当我们到达最后一个元素时,比如 k,检查第 k 行是否全为零以及第 k 列 (除了 A[k,k]) 都是 1。
    • 如果是,k 就是一个接收器,您可以返回它。
    • 如果不是,则矩阵没有汇,您可以返回 -1

S 中有 n 个元素开始,每一步消除一个元素,每一步都需要常数时间,所以 O(n) 总体而言。

您提到您不想使用第二个数组。如果这真的很严格,你可以只使用两个整数,一个代表最后一步的“幸存者”,一个代表你进入序列 0, 1, .., n-1 的距离是。

我以前从未见过这种算法,它的简单性给我留下了深刻的印象。干杯。

关于c# - Java/C# - Array[][] 复杂性任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20283150/

相关文章:

java - Java 中 int 转换为 enum

java - 无法将 double 转换为 double [] 错误

c# - 如何从 vstest.console.exe 将测试结果发布到 TFS

java - 重音字符需要多一个字符

c# - 无法从 ASP.NET 中的 SQL 数据库中获取准确的值

java - 如何更改 GEF 中的复选框大小(org.eclipse.draw2d.Checkbox)

javascript - 为什么我的 javascript 会抛出函数未定义错误?

java - 一个非常基本的java输出问题

c# - 在 javascript 代码中调用 ASP 方法

C# Entity Framework 4.1 Lambda Include - 仅选择特定的包含值