【问题标题】:Find the row with maximum number of 1s找到最大数量为 1 的行
【发布时间】:2021-11-12 10:35:05
【问题描述】:

给定一个 n x m 维的布尔二维数组,其中每一行都进行了排序。找出第一行中 1 数量最多的从 0 开始的索引。

下面是我写的代码

int rowWithMax1s(int arr[][], int n, int m) {
        int ans = -1;
        int row = 0;
        int col = m-1;
        while(row<n && col>=0){
            if(arr[row][col] == 1){
                col--;
                ans = row;
            }
            else{
                row++;
            }
        }
        return ans;
    }

我相信上述的时间复杂度是 O(M+N)。然而它给我的时间限制超出了错误。

这是问题的链接 https://practice.geeksforgeeks.org/problems/row-with-max-1s0023/1#

请帮助我,我还能做些什么来优化我的代码。

【问题讨论】:

  • 二分查找方法的时间复杂度为 O(Mlog(N))。大于 O(M+N)
  • 矩阵只包含 0 和 1,每一行都已排序。
  • 如果矩阵全为 0,您似乎返回了错误的答案,但该代码不应 TLE。
  • @MattTimmermans -1 结果是任务想要的结果。我认为这会得到 TLE,因为驱动程序代码构建了整个矩阵(单击代码的第 1 行查看它)。

标签: arrays algorithm matrix optimization


【解决方案1】:

我很确定这不是你的错,而是驱动程序代码的错。

如果您提交了几次,您会很幸运并被接受。我也试过这个:

class Solution {
    static int total = 0;
    int rowWithMax1s(int arr[][], int n, int m) {
        if ((total += n + m) > 300000)
            throw new RuntimeException("darn");
        ...
        (your actual solution)
        ...

经过几次尝试后被接受了。 300,000 个相对简单的 Java 步骤不可能超过 2 秒。

但是,如果您在他们的代码编辑器中单击第 1 行,您会看到他们的驱动程序代码读取整个矩阵(或者更确切地说是所有矩阵,对于所有测试用例)。这可能就是所有时间的去向。我们甚至不允许编辑该部分。你可以试试另一种语言。我用 Python 写了一个类似的解决方案,我提交了五次都被接受了。

【讨论】:

    猜你喜欢
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 2016-03-27
    相关资源
    最近更新 更多